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
된 이후로 HttpSecurity
로 Spring Security
를 설정하는 코드를 자주 볼 수 있다.
HttpSecurity
는 Websecurity
에서 제외된 리소스 외의 부분에 Spring Security
를 설정할 수 있게 한다.
WebSecurityCustomizer
를 통해 Spring Security
를 적용하지 않을 리소스를 설정한다. WebSecurityCustomizer
가 함수형 인터페이스이기 때문에 아래와 같이 작성할 수 있다.
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
@Bean
public WebSecurityCustomizer webSecurityCustomizer(){
return web -> {
web.ignoring()
.antMatchers(
"/images/**",
"/js/**",
"/css/**",
);
};
}
}
분명히 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();
}
감사합니다 선생님