FeelingXD

[Spring-Security] 스프링부트3.x 버전에서 Security 설정 변경점들 본문

프로그래밍/Spring

[Spring-Security] 스프링부트3.x 버전에서 Security 설정 변경점들

FeelingXD 2024. 3. 2. 23:08

🤔 - 스프링 부트3.x 버전부터 Spring-Security 설정법들이 몇가지 변경 되었습니다. 알게 된점 몇가지를 작성합니다.

1. Security http Request 을 lambda 형식으로 !

기존 HttpSecurity 의 Request 관련 적용이 변경되었습니다.

//예시코드 
 @Bean
  public SecurityFilterChain defaultFilter(HttpSecurity http) throws Exception {
               http
             .securityMatchers.requestMatchers("/api/**")
             .and()
             .authorizeHttpRequests.anyRequest().hasRole("USER")
             .and()
             .httpBasic(Customizer.withDefaults());
    return http.build();
  }

위의 예시처럼 .and() 로 http 리퀘스트 마다 체이닝을 통하여 추가적으로 허용은 어떤지, 어떤경로인지 등 옵션을 추가 할 수 있었습니다.
하지만 SpringSecurity 6.1 버전 이후부터 체이닝을 담당하는 .and() 방식이 deprecated 되었습니다.

그럼 어떻게 고쳐야하죠 ? 😣

이에 Spring 에서는 기존의 .and() 체이닝 방식을 대체하여 각 http 리퀘스트의 lambda 문법을 사용하기를 권장하고 있습니다.

// 예시입니다.

 @Configuration
 @EnableWebSecurity
 public class SecurityConfig {

     @Bean
     public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
         // 기존의 .and 체이닝을 대체야여 lambda 형식을 사용합니다.
         // and() 사용시 오히려 복잡해보일수있는것들이 lambda 표현을 각각 역할을 분명하게 명시합니다.
         http
             .securityMatchers((matchers) -> matchers
                 .requestMatchers("/api/**")
             )
             .authorizeHttpRequests((authorize) -> authorize
                 .anyRequest().hasRole("USER")
             ) 
             .httpBasic(Customizer.withDefaults());
         return http.build();
     }
 }

2. WebSecurityConfigurerAdapter 대신 필터를 @bean으로 등록하자

스프링 문서를 참고해보면 다음과 같이 기존의 WebSecurityConfigurerAdapter를 사용하는 대신 각 SecurityFilterChain 을 등록하는것으로 사용하길 권하고 있습니다.

Deprecated.
Use a SecurityFilterChain Bean to configure HttpSecurity or a WebSecurityCustomizer Bean to configure WebSecurity

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    //기존의 필터 대신 Configuration 을 직접 조정하는 방법입니다.
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
    }

}

@Configuration
public class SecurityConfiguration {

    @Bean // -> Bean 을 등록하여 deligate proxyfilter 체인에 등록하는걸 권장합니다.
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
        return http.build();
    }

}

많은 변경점 이 있으니 간혹 gradle 에서 build 하다 deprecated 된 패키지가 있다면 공식 문서를 한번씩 확인하는 습관이 있으면 좋을것 같습니다.

참조