내용
로그인 하면 User 서비스에서 인증 토큰(JWT)을 발급한다
권한이 필요한 API 요청은 API Gateway의 토큰을 해석하는 필터가 처리한다
인증이 이루어지는 순서는 아래와 같다
- 로그인 시도: AuthenticationFilter.attemptAuthentication
- 시큐리티의 유저 정보로 변환: UserDetailsService의 구현체.loadUserByUsername
- 인증 성공 후처리: AuthenticationFilter.successfulAuthentication
설정 고생
설정하는데... 정말 고생을 많이했다... 내가 도대체 왜 Spring Boot 3.x로 했을까...
아래 화면(로그인 성공)을 보기까지 이틀 정도 걸린 것 같다 (시간으로만 보면 대략 5 ~ 7시간 정도..?
참고로 Micro Service를 재기동하면, Spring Cloud Gateway가 인식하는데 잠시의 시간이 필요하다
대략 30초 ~ 1분 정도 걸리니... 쉬엄쉬엄 디버깅하도록 하자
Spring Boot 2.7.x 이하의 버전과는 다르게 3.x 에서는 다른 방식으로 설정을 해야 한다
(정확히는 In Spring Security 5.7.0-M2 부터 이며, 자세한 내용은 이곳(spring blog)을 참고하면 된다)
(혹여나 지금부터라도 설정을 하시는 분은 특별한 이유가 아니면 2.7.x로 하기를 바란다 ㅠ)
순환 참조
또, 설정을 잘못하면 컴파일이 되지 않는 문제가 발생한다
버전 문제 때문은 아니지만 아래처럼 순환참조 문제가 있기도 하였다
위 문제는
SecurityConfigruration -> UserSerivce 의존
UserService -> SecurityConfigruration에서 Bean 등록한 BCryptPasswordEncoder 를 의존해서
발생하는 문제였다
BCryptPasswordEncoder를 @Component등록하는 방법도 있지만,
별도로 SecuritySecondaryConfiguration에 @Bean 정의해두었다
JJWT 0.10.0+ 설정 정보 변경
위 버전에서는 설정 정보가 변경되었다 (deprecated)
0.10.0 이전
토큰 생성부
Jwts.builder()
.setSubject(사용자_식별자)
.setExpiration(만료_기일_Date)
.signWith(SignatureAlgorithm.HS512, 시크릿_키)
.compact();
토큰 해석
Jwts.parser().setSigningKey(secretKey)
.parseClaimsJws(jwt).body
.subject
0.10.0 이후
토큰 생성
Jwts.builder()
.setSubject(암호화할_내용)
.setIssuedAt(Date()) // 토큰 발행 일시
.setExpiration(expirationTime) // 토큰 만료 일시
.signWith(key, algorithm) // 어떤 키와 알고리즘으로 암호화할 지
.compact()
토큰 해석
Jwts.parserBuilder()
.setSigningKey(비밀_키)
.build()
.parseClaimsJws(토큰)
subject(약어는 sub)는 토큰의 내용이다
이 sub대신에 claims를 넣을 수 있는데, key value 값이다.
예를들어 토큰 생성부를 이렇게 바꿀 수 있다
Jwts.builder()
.setHeaderParam("type", "jwt")
.claim("userName", "philz kun")
.claim("userEmail", "mr.philz@gmail.com")
.claim("userPhoneNumber", "010-1234-5678")
.setIssuedAt(Date())
.setExpiration(expirationTime)
.signWith(key, algorithm)
.compact()!!
참고
Spring Security 최신버전(Spring Boot 3.X.X 대)의 WebSecurity 설정 공유드립니다. - 인프런 | 질문 & 답변 (inflearn.com)
Spring Boot 최신 3.XX 버전 Security 설정 공유드립니다. - 인프런 | 질문 & 답변 (inflearn.com)
Spring Security without the WebSecurityConfigurerAdapter
Deprecated된 WebSecurityConfigurerAdapter, 어떻게 대처하지? (velog.io)
'Book & Lecture > 이도원님 MSA' 카테고리의 다른 글
Section 10: Micro Service간 통신 (0) | 2023.06.03 |
---|---|
Section 8: Cloud Bus (0) | 2023.05.28 |
Section 7: Cloud Configuration (0) | 2023.05.24 |
Section 3 ~ 5 E-Commerse App, User, Catalog, Orders MicroSerivce (0) | 2023.05.22 |
Secion 0~2: Micro Service와 Spring Cloud 소개, Service Discovery, API Gateway (0) | 2023.05.22 |
hi hello... World >< 가장 아름다운 하나의 해답이 존재한다
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!