스프링 시큐리티] 구글 로그인 적용하면서 생긴 문제점 해결 과정
- -
문제
1) access token을 발급 받아야하는데 계속 null값으로 나오는 문제를 발견
2) 설정한 로그인 페이지가 아닌 OAuth2 google 로그인 기본 페이지가 나오는 문제 발견
3) 1,2 문제를 해결 후 구글 로그인 성공 시 설정한 리다이렉션 경로대로 나오지 않는 문제 발견
해결과정
이상하다...? 토큰을 만들 때 제대로되고 있는데...? 뭐지...?
원인을 못 찾고 있었습니다...
다른 위치에서 소스를 수정해보고 디버그를 해보고했지만!!
private String makeToken(Date expiry, User user) {
// Date now = new Date();
// SecretKey key = Jwts.SIG.HS256.key().build();
// SecretKey key = Keys.hmacShaKeyFor(environment.getProperty("jwt.token.secret").getBytes(StandardCharsets.UTF_8));
// SecretKey secretKey = Keys.hmacShaKeyFor(jwtProperties.getSecretKey().getBytes(StandardCharsets.UTF_8));
return Jwts.builder()
.setHeaderParam(Header.TYPE, Header.JWT_TYPE)
.setIssuer(jwtProperties.getIssuer())
.setIssuedAt(new Date())
.setExpiration(expiry)
.setSubject(user.getEmail())
.claim("id", user.getId())
.signWith(SignatureAlgorithm.HS256, jwtProperties.getSecretKey())
.compact();
/*return Jwts.builder()
.issuer(jwtProperties.getIssuer())
.issuedAt(new Date())
.expiration(expiry)
.subject(user.getEmail())
.claim("id", user.getId())
.signWith(secretKey, Jwts.SIG.HS256)
.compact();*/
}
계속 access token에는 null만 죽어라 뜨고 있었습니다...
이때부터 지옥의 Debug 모드가 발동됐습니다...
2시간 동안 뻘짓을 하면서 느끼며 두번째 원인을 발견합니다 (?)
첫번째 문제 해결도 못 했는데 갑자기 눈에 띄는 두번째 문제...
왜 내가 설정한 로그인 페이지가 안나오고 기본 로그인 페이지가 나오지?
아래는 필터체인 입니다
보시기엔 어떤가요? 문제가 없어보이나요?
넵 메서드 내부에는 문제 없습니다..
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable)
.httpBasic(HttpBasicConfigurer::disable)
.formLogin(FormLoginConfigurer::disable)
.logout(LogoutConfigurer::disable);
http.sessionManagement(configure -> configure.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(tokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
http.authorizeHttpRequests(authorize ->
authorize.requestMatchers("/api/token").permitAll()
.requestMatchers("/api/**").authenticated()
.anyRequest().permitAll());
http.oauth2Login(oauth2Login ->
oauth2Login.loginPage("/login")
.authorizationEndpoint(authorizationEndpoint ->
authorizationEndpoint.authorizationRequestRepository(oAuth2AuthorizationRequestBseOnCookieRepository()))
.successHandler(oAuth2SuccessHandler())
.userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint.userService(oAuth2UserCustomService)));
http.logout(logout -> logout
.logoutSuccessUrl("/login"));
http.exceptionHandling(exceptionHandling ->
exceptionHandling.defaultAuthenticationEntryPointFor(
new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED), new AntPathRequestMatcher("/api/**")));
return http.build();
}
결국 원인은...
@Bean
@Bean이 누락되어 필터체인을 아예 못 읽고 있었습니다......?
야잇 시붊ㄴ아ㅔㅁㄴ에ㅐㅁㄴ아ㅐ
쿠키에 드디어 제대로된 값들이 들어있는 걸 확인했습니다!!
어라???
그래도 access token은 null 입니다????
아니 잠깐만 근데 왜 성공 후 설정한 리다이렉션 경로는 왜 못 읽냐?
public class OAuth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
public static final String REFRESH_TOKEN_COOKIE_NAME = "refresh_token";
public static final Duration REFRESH_TOKEN_DURATION = Duration.ofDays(14);
public static final Duration ACCESS_TOKEN_DURATION = Duration.ofDays(1);
public static final String REDIRECT_PATH = "/articles"; <-- 경로? 무엇?
.....
이상합니다..? 어라...?
String targetUrl = getTargetUrl(accessToken);
System.out.println("targetUrl = " + targetUrl);
원초적인 디버깅인 시스템 아웃 프린트가 안찍힙니다? 뭐지?
하....
넵 @Component가 없었습니다.......😭
@RequiredArgsConstructor
public class OAuth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
@Component 넣으니 이제 access token 정상적인 발급과 시스템 아웃 프린트도 잘 나오는군여ㅠㅜㅠㅜ
후기
1. 중요한 정보는 log 잘 찍어놓자....
2. 꺼진 불도 눈 크게 뜨고 다시보자.
3. 생각없이 코딩하지말자.
@Configuration + @Bean은 짝궁이고
@Component는 네가 만든 클래스 등록해야지하는건데 왜 생각없이 했냐...?
딱 대!!
'멍청멍청기록 > 에러 일기' 카테고리의 다른 글
당신이 좋아할만한 콘텐츠
-
파이썬] 키움증권 Open API OPT10079 주식차트조회 2024.03.11
-
스프링] Cache miss for REQUEST dispatch to '/' (previous null). Performing MatchableHandlerMapping lookup. This is logged once only at WARN level, and every time at TRACE. 2024.01.13
-
스프링부트] 초기화 전 data.sql 실행되서 발생되는 에러 2023.12.20
-
JPA 에러] JPA 테스트 케이스 에러 2023.08.10
소중한 공감 감사합니다