본문 바로가기
Programming/Spring

[Spring] JwtException에서만 Cors에러가 발생할 때

by 선의 2023. 10. 29.

문제

출처: https://velog.io/@seongwon97/Spring-Security-Filter%EB%9E%80

 

위와 같은 Spring Security의 Filter Chain이 있다.

범용적으로 Jwt 에러를 해결하기 위해, 서블렛으로 넘어가기 전에 JwtExceptionFilter에서 Jwt 만료 등의 에러가 발생 시 Exception을 던져 주고 있었다.

그런데 다른 곳에서는 Cors 에러가 발생하지 않다가, 갑자기 에러가 발생하기 시작했다.

 

 

해결

@RequiredArgsConstructor
@EnableWebSecurity
@Configuration
public class SecurityConfig {
    private final JwtUtil jwtUtil;
    private final CorsConfig corsConfig;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .cors(AbstractHttpConfigurer::disable)
                .csrf(AbstractHttpConfigurer::disable)
                .headers((headers) ->
                        headers.frameOptions().sameOrigin()
                )
                .authorizeHttpRequests((auth) ->
                        auth.requestMatchers(antMatcher("/h2-dev/**")).permitAll()
                                .requestMatchers(antMatcher(HttpMethod.OPTIONS, "/**/*")).permitAll()
                                .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
                                .requestMatchers(antMatcher("/questions/**")).permitAll()
                                .requestMatchers(antMatcher("/accounts/signup"), antMatcher("/accounts/signin")).permitAll()
                                .anyRequest().permitAll()
                )
                .addFilter(corsConfig.securityCorsFilter())
                .apply(new JwtSecurityConfig(jwtUtil));

        return httpSecurity.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

 

addFilter(corsConfig.securityCorsFilter) 부분을 넣어서 해결했다.

corsConfig 클래스에는 CorsConfiguration(org.springframework.web.filter.CorsFilter) 객체를 생성하여 설정을 추가하는 메서드가 있다.

이렇게 하니 해결되었다.