멍청멍청기록/에러 일기

스프링 시큐리티] 구글 로그인 적용하면서 생긴 문제점 해결 과정

  • -
728x90
반응형

문제

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만 죽어라 뜨고 있었습니다...

난 예기치 않은 넌 (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는 네가 만든 클래스 등록해야지하는건데 왜 생각없이 했냐...?

딱 대!!

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.