Spring Security에서 특정 url 제외하기

CHEESE·2022년 8월 2일
2

Spring Security 5.7.0-M2 이전 버전

Spring Security 5.7.0-M2 이전 버전에서는 WebSecurityConfigurerAdapter 클래스를 상속받아 Spring Security 설정을 했다.
오버라이딩한 configure 메소드에서 패턴에 해당하는 리소스에 대해 아예Spring Security를 적용하지 않게 설정할 수 있다.

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("logout","/js/**","/css/**","/error");
    }
    
    ... 생략
}

이후 버전

WebSecurityConfigurerAdapter 클래스가 deprecated 된 이후로 HttpSecuritySpring Security를 설정하는 코드를 자주 볼 수 있다.
HttpSecurityWebsecurity에서 제외된 리소스 외의 부분에 Spring Security를 설정할 수 있게 한다.

이후 버전에서 WebSecurity를 사용하려면?

WebSecurityCustomizer를 통해 Spring Security를 적용하지 않을 리소스를 설정한다. WebSecurityCustomizer가 함수형 인터페이스이기 때문에 아래와 같이 작성할 수 있다.

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer(){
        return web -> {
            web.ignoring()
                    .antMatchers(
                            "/images/**",
                            "/js/**",
                            "/css/**",
                    );
        };
    }
}

ignoring을 적용한 리소스에서 security filter를 거친다면?

분명히 web.ignoring().antMatchers(...)를 사용했음에도 필터가 제외되지 않고 적용되는 문제가 발견됐다.
삽질해본 결과, 따로 만든 커스텀 필터를 Bean으로 등록한 것이 문제가 되었다.
web.ignoring().antMatchers(...)에 파라미터로 전달된 패턴에 대해 security filter chain이 생략되는 것은 맞다. 하지만 이때 다른 필터를 빈으로 등록하게 되면 해당 필터가 security filter chain에 포함되는게 아니라 default filter chain에 포함되기 때문에 그대로 필터가 적용되는 것이다.
음...
필터 클래스를 @Component와 같이 어노테이션을 달아 Bean으로 등록하지 말고, security filter chain에 포함되게끔 아래와 같이 바꿔주면 된다.

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
    http
            .httpBasic().disable()
            .csrf().disable()
            .authorizeRequests()
            .anyRequest().permitAll()
            .and()
            .addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class);

    return http.build();
}

1개의 댓글

comment-user-thumbnail
2023년 8월 23일

감사합니다 선생님

답글 달기