filterChain을 작성할때 다음과 같이 perfmitAll() 체이닝을 많이 건다.
이때 AuthFilter가 OncePerRequestFilter를 구현한다면, permitAll은 무시되는 것처럼 보이게 된다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
.requestMatchers("/post/**").permitAll()
.requestMatchers("/user/login", "/user/singin").permitAll()
.requestMatchers("/test").permitAll()
.anyRequest().authenticated()
)
.csrf(AbstractHttpConfigurer::disable)
.formLogin(AbstractHttpConfigurer::disable)
.logout(AbstractHttpConfigurer::disable)
.addFilterBefore(new AuthFilter(tokenManager), UsernamePasswordAuthenticationFilter.class) // 토큰 filter
.sessionManagement((sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.cors(withDefaults())
.exceptionHandling((exceptionHandling) -> exceptionHandling.accessDeniedHandler(jwtAccessDeniedHandler))
.headers((header) -> header.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin));
return http.build();
}
"무시되는 것처럼 보인다" 라는 말이 의아할 수도 있다.
정확하게는 permitAll은 SecurityContext 내에 결과가 없더라도 API호출이 가능하게 해주는 메서드다.
즉, AuthFilter를 거치게 되고, 내부에서 Exception이 발생하게 되면 API호출이 되지 않는다.
해결방법