티스토리 뷰

 

[OAuth2] SecurityConfig, OAuth2Config 설정 리팩토링

Spring Security를 이용하다 보면 자동화된 설정이 많아 정말 편리하지만 그럼에도 불구하고 커스텀 설정을 추가해야 하는 경우가 많다 이 글에서는 그중에서 OAuth2 Config에 관해 헤맸던 부분을 다시

ryumodrn.tistory.com

지난 글에서 이어지는 내용으로 리팩토링 후 만난 문제에 관해 남겨보려 한다

새로 작성한 코드로 테스트 해보기 위해 로그인 페이지에서 OAuth2 github 로그인을 시도했는데

스프링 시큐리티가 기본 제공하는 /oauth2/authorization/github 경로로 접근 시 404 에러가 발생했다

 

또한 가독성을 위해 SecurityConfig에서 OAuth2SecurityConfig를 분리해냈을 때는 403 에러가 발생한다

403의 경우에는 JwtFilter에서 권한 확인이 되지 않아 Forbidden 에러가 나타난 형태이다

configure 메서드 안에서 http 에 적용할 보안 정책을 설정하는 것이 겹쳤기 때문에

OAuth2LoginConfigurer 객체가 이미 만들어져 있어 적용할 수 없다는 에러를 뿜으면서 프로그램이 실행되지 않았다

 

아래와 같이 작성한 코드 때문에 /login 경로로 redirect 될 수도 있다

configure 메서드 안에서 .oauth2Login() 설정을 제대로 했는지 확인할 필요가 있다

.and()
.exceptionHandling()
.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"));

 

나와 같은 상황에서는 /oauth2/authorization/github 경로에 접근하는 걸 처리할 수 없다는 것인데

이를 이해하기 위해서는 스프링 시큐리티가 기본 제공한다는 것의 의미를 알아야 한다

/oauth2/authorization/{registrationId}에 해당하는 경로를 처리할 Controller가 자동 생성되고 처리해준다

따라서 OAuth2LoginAuthenticationFilter, OAuth2AuthorizationRequestRedirectFilter 두 필터에 모든 메서드에

브레이크 포인트를 잡고 이 필터들을 거치는지 확인해봐야 한다

 

나는 JwtFilter와 위 두 Filter에 브레이크 포인트를 잡고 돌렸는데 JwtFilter는 거치지만

OAuth2 관련 필터를 아예 거치지 않고 404 에러가 뜨거나, 권한 확인이 되지 않아 403 에러가 발생했다

핵심은 의외로 간단한 곳에 있었는데 SecurityConfig에서 web과 관련된 설정 부분이 문제였다

web.ignoring() 에서 경로를 지정해주면 Filter를 거치지 않고 접근이 가능하다

404, 403 에러가 발생할 때는 web.ignoring()에 /oauth2/**, /login/** 경로가 존재해서 OAuth2 Filter를 거치지 않았다

OAuth2 Filter에서 request를 잡고 Controller에 뿌려줘야 하는데 그 과정이 생략돼버리니 

정상적인 로그인이 되지 않았던 것이다 따라서 web 경로에 oauth2 로그인 관련 경로를 빼줘야 한다

 

 

문제를 해결하기 위해 SecurityConfig 안에서 configure(http) 메서드에 .oauth2Login() 관련 코드를 넣었다

기존 코드에는 .and().apply(jwtSecurityConfig) 까지만 작성해서 깔끔했었지만 문제없는 작동을 위해서 분리를 포기했다

다만 clientRegistrationRepository, httpCookieOAuth2AuthorizationRequestRepository, customOAuth2UserService, oAuth2AuthenticationSuccessHandler, oAuth2AuthenticationFailureHandler를

외부에서 주입 받고, 비대한 configure 메서드 외에는 모두 분리해두고 그나마 SecurityConfig를 깔끔한 상태로 둘 수 있었다

 

지금은 문제 없지만 분리해내지 못한 것에 아직까지 아쉬움이 남는다

튜토리얼을 따라하면서 OAuth2 적용해보는 것은 쉬운데 커스터마이징을 하면서 이해해볼 때는 상당히 어려운 것 같다

프로젝트 마무리 쯤에 다시 한번 OAuth2 관련해 공부를 하고 분리할 방법을 찾아봐야겠다

 

댓글
링크
글 보관함
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total
Today
Yesterday