OncePerRequestFilter과 fileterChain의 permitAll() 주의점

LinkinPark·2025년 2월 16일

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호출이 되지 않는다.

해결방법

  1. shouldNotFilter 메서드 override
    OAuth같은 SpringSecurity외 인증방법을 사용하는 경우 이 방법이 좋다.
  2. AuthFilter내부에서 Exception을 try-catch로 잡아 다음 filterChain을 호출.
    이 방법은 Spring Security외에 다른 인증방법을 사용하는 경우 permitAll과 함께 사용하면 좋다.
profile
It's work, but touch it

0개의 댓글