WebsecurityConfigurerAdapter
가 deprecated 됨에 따라 SecurityConfig 클래스를 수정해 보았다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
private static final String [] staticResources = {
"/css/**",
"/js/**",
"/img/**",
"/favicon.ico",
"/vendor/**",
};
@Override
public void configure(WebSecurity web) throws Exception
{
web.ignoring().antMatchers(staticResources);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
//이하 생략
}
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.cors()
.and()
.csrf().disable()
.httpBasic().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
// 중간 생략
return http.build();
}
@Order(0)
@Bean
public SecurityFilterChain resources(HttpSecurity http) throws Exception {
//example
http.requestMatchers(matchers -> matchers.antMatchers("/resource/**"))
.authorizeHttpRequests(authorize -> authorize.anyRequest().permitAll())
.requestCache().disable()
.securityContext().disable()
.sessionManagement().disable();
return http.build();
}
WebSecurityConfigurerAdapter
의 상속을 제거했기 때문에, cofigure() 함수를 override하여 작성하는 대신,HttpSecurity
를 주입받은SecurityFilterChain
을 직접 Bean 객체로 등록해 주었다.
방식만 다를 뿐 내부 코드는 이전과 거의 유사하므로 생략 하였다.
정적 리소스 파일 등에 대해 Security 권한 검증을 생략하기 위한 방식으로 web.ignoring()에 해당 되는 리소스 path들을 기입해왔었다.
하지만, 위 방식을 사용하게 되면 권한 뿐만아니라 Spring Security에서 기본적으로 제공하는 보안 헤더와 같은 다른 보안정책들 까지 무시하게 되기 때문에, 권장되지 않는다고 한다.
따라서 리소스에 대한SecurityFilterChain
을 별도로 구성하여 기존 필터 이전에 걸러낼 수 있도록 변경했다.
이렇게 하면, 리소스 요청에 대해 Security의 보호를 받으면서, 불필요한 인가 처리는 생략할 수 있는 이점을 가져갈 수 있다.
참고
https://github.com/spring-projects/spring-security/issues/10938