설명
스프링 시큐리티 설정 파일을 다음과 같이 설정했는데
로그인을 시도할때마다 JwtFilter에 걸려서 에러가 발생하고 있었습니다 ㅠㅠ
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.cors((cors) -> cors
.configurationSource(new CorsConfigurationSource() {
@Override
public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Collections.singletonList("http://localhost:3000"));
configuration.setAllowedMethods(Collections.singletonList("*"));
configuration.setAllowCredentials(true);
configuration.setAllowedHeaders(Collections.singletonList("*"));
configuration.setMaxAge(3600L);
configuration.setExposedHeaders(Collections.singletonList("Authorization"));
return configuration;
}
}))
.csrf((auth) -> auth.disable())
.formLogin((auth) -> auth.disable())
.httpBasic((auth) -> auth.disable())
.authorizeHttpRequests((auth) -> auth
.requestMatchers("/accounts/login", "/accounts/join", "/accounts/health").permitAll()
.requestMatchers("/reissue").permitAll()
.anyRequest().authenticated())
.addFilterBefore(new JWTFilter(jwtUtil), LoginFilter.class)
.addFilterBefore(new CustomLogoutFilter(jwtUtil, refreshRepository), LogoutFilter.class)
.addFilterAt(new LoginFilter(authenticationManager(authenticationConfiguration)), UsernamePasswordAuthenticationFilter.class)
.sessionManagement((session) -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
return http.build();
}
분명히 permitAll 처리를 했는데...
https://stackoverflow.com/questions/46068433/spring-security-with-filters-permitall-not-working
해당 링크에서 확인할 수 있듯이, permitAll()은 해당 요청에 대한 접근을 모든 사용자에게 허용하는 역할을 하지만, 요청 처리 과정에서 적용되는 모든 필터들을 무시하지 않는다고 합니다.
이는 해당 요청에 대한 인증 정보가 없더라도 (모든 필터가 처리한 후에도 SecurityContext에 인증 정보가 없더라도), 접근이 허용된다는 것을 의미합니다.
따라서 저는 원래 예외를 던지도록 코드를 작성했지만, 이로 인해 로그인 로직이 실행이 안되고 예외가 계속 발생해서
return;으로 마무리 했습니다. (따로 추가적인 로직 구현이 필요없어서 return)
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String accessToken = request.getHeader(AUTHORIZATION);
if (accessToken == null) {
filterChain.doFilter(request, response);
return;
}
...
}
참고
https://velog.io/@refoli_20/Spring-Security-permitAll-Filter-%ED%98%B8%EC%B6%9C
https://stackoverflow.com/questions/46068433/spring-security-with-filters-permitall-not-working
오타가 있거나 잘못된 정보를 게시했다면 댓글 부탁드립니다 ㅎㅎ