현재 프로젝트를 진행하면서 http://localhost:8080으로 요청을 보내면 시큐리티의 oauth2Login()이 동작하는 기상천외한 문제가 발생했다.
// 모든 요청 허용
.authorizeHttpRequests(authorize -> {
// 모든 api로 시작하는 요청은 인증 필요
authorize.requestMatchers("/oauth2/authorization/", "/swagger-ui/**", "/api-docs", "/v3/api-docs/**", "/api-docs/**", "/swagger-ui.html").permitAll();
authorize.anyRequest().authenticated();
})
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
// oauth 로그인
.oauth2Login((oauth) -> {
oauth.successHandler(successHandler);
oauth.failureHandler(failureHandler);
// oauth 로그인 성공 후 사용자 정보를 가져오기 위함.
// 즉 code -> accessToken 과정을 거친 후 동작.
oauth.userInfoEndpoint((userInfo) -> {
userInfo.userService(principalOAuth2UserService);
});
});
이게 문제의 시큐리티였다.
특정 api 주소만 permit으로 넘겨주고 그 외의 요청은 전부 인증이 필요하도록 만들었다.
이걸로 거의 2일동안 해맸는데 나의 무지함에서 나온 문제였다.
내가 이해했던 로직
특정 api 주소 외의 요청이 들어옴 -> 인증 필요 -> jwt 필터 동작
oauth2Login()은 단순 특정 앤드포인트로 보낼 때만 동작한다고 생각했다.(소셜 로그인 버튼을 눌렀을 때만 동작한다고 생각)
그러나 실제 로직 동작은 아래와 같았다.
jwt 필터는 모든 api 요청에서 동작(따로 필터 내에서 api 예외 처리)
인증 필요 -> oauth2Login() 동작.
결국 인증이 필요하면 내 로직에서는 oauth2Login()이 동작하게 된다.
현재 로직에서 http://localhost:8080으로 요청을 보내면 인증이 필요하게 돼서
oauth2Login()을 타게 되고 석세스 핸들러를 실행하게 된다. 내가 원하는 건 로그인 버튼을 통해서만 oauth2Login()이 동작해야하고 나머지의 경우에는 그냥 jwt 필터를 통해 토큰이 있는지만 확인하면 된다.
결국 나의 경우에는 사실상 모든 요청을 permitAll() 해놓으면 된다는 소리다...(이게 이래도 되나 싶긴 한데)
// 모든 요청 허용
.authorizeHttpRequests(authorize -> {
authorize.anyRequest().permitAll();
})
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
// oauth 로그인
.oauth2Login((oauth) -> {
oauth.successHandler(successHandler);
oauth.failureHandler(failureHandler);
// oauth 로그인 성공 후 사용자 정보를 가져오기 위함.
// 즉 code -> accessToken 과정을 거친 후 동작.
oauth.userInfoEndpoint((userInfo) -> {
userInfo.userService(principalOAuth2UserService);
});
});
이렇게 코드를 수정하면 문제가 없다.
1. 프론트 로그인 버튼을 통해서만 oauth2Login() 동작.
2. 모든 요청에 대해 permitAll() 해놨으므로 jwtFilter만 동작하고 oauth2Login()은 동작하지 않음.
3. 나머지 상세한 부분은 jwtFilter 안에서 검증을 할지 말지 결정해주면 된다.
'오류해결' 카테고리의 다른 글
Swagger로 API 요청 보내면 403 뜨는 에러 (1) | 2024.02.01 |
---|---|
Repository 테스트 코드에서 1차 캐시로 인한 null 발생 (0) | 2024.01.28 |
API 응답에서 406 에러 발생 (0) | 2023.12.31 |
스프링 시큐리티 6.1부터 csrf().disable() 불가능 문제 (0) | 2023.12.22 |