개발/Spring Boot

[Spring Boot] SecurityConfig 구현하기(WebSecurityConfigurerAdapter 없이)

inseoking 2023. 7. 28. 04:08

Spring Security 5.7.0 버전을 기점으로 WebSecurityConfigurerAdapter가 Deprecated 되었습니다.(벌써 작년 2월에 되었는데, 이슈에 약한 것 같다ㅠ 애초에 첫 직장 입사하기 전부터 없었잖아?) WebSecurityConfigurerAdapter를 상속받아 Configure를 작성하고 있었는데, 없이 구축할 수 있는 방법이 Spring 블로그에 작성되어 있어 따라가 보려고 합니다. 포스팅에 따르면 컴포넌트 기반의 Security Configuration을 위해 Deprecated 되었다고 합니다.

 

Spring Blog에 더 자세히 나와있으니, 참고한 포스팅 링크를 첨부드립니다.

https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

 

Spring Security without the WebSecurityConfigurerAdapter

In Spring Security 5.7.0-M2 we deprecated the WebSecurityConfigurerAdapter, as we encourage users to move towards a component-based security configuration. To assist with the transition to this new style of configuration, we have compiled a list of common

spring.io

 

자 이어가볼까요? 다음은 5.7.0버전 이전의 Configuration입니다.

 

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
    }

}

보시다시피 WebSecurityConfigurerAdapter를 상속하고, configure 메소드를 override해서 사용하는 것을 볼 수 있습니다.

그렇다면, 바뀐 버전은 어떻게 될까요?

 

@Configuration
public class SecurityConfiguration {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
        return http.build();
    }

}

 

바뀐 부분을 중점으로 살펴보자면, 라이브러리에서 상속받는 클래스가 없어졌고, SecurityFilterChain을 구현하여 직접 빈 주입을 해주는 방식으로 변했습니다.

개인적으로 위 방식으로 변화하면서 이전에는 상속받는 클래스(Web~~ 너무길다.)에 대한 이해없이 일단 기본 Config를 작성하기 위해 배껴오곤 했기 때문에 WebSecurityConfigurerAdapter 클래스에 대한 이해를 하지 못하고 썼었는데, 직관적으로 SecurityFilterChain에 추가해주는 것을 보니 직관적으로 동작하는 방식을 이해할 수 있어 좋았습니다. 현재 코틀린으로 짜고 있기 때문에 코틀린으로 작성한 코드를 올려 마무리하려고 합니다.

 

@Configuration
class WebSecurityConfig {

    @Bean
     fun configure(http: HttpSecurity): SecurityFilterChain {
         http
                 .authorizeHttpRequests().
                    anyRequest().permitAll();
         return http.build()
    }
}

 

마무리하려고 봤는데,, HttpSecurity에 authroizeHttpRequests도 deprecated 되었네요...? 6.1버전 이후로 ..? 저는 지금 6.2버전을 사용하고 있기 때문에, 한번 찾아봅시다.(다음에 수정해서 올릴게요.. 졸려요)

 

 

(포스팅 전반부에 Spring Security lambda DSL과 HttpSecurity#authorizedHttpRequests메소드를 이용한다고 되어 있는데, lambda DSL에 대해 알아봐야겠다.)