[Spring] Deprecated된 WebSecurityConfigurerAdapter 이젠 안녕..

chiyongs·2022년 7월 13일
3
post-thumbnail

최근 새로운 팀원들과 재밌는 프로젝트를 시작했습니다. 😊
새로운 시작과 함께 설계와 요구사항을 정의하느라 바쁜 나날을 보냈습니다.
이제 본격적으로 개발 단계에 접어들어 새로운 스프링 버전(2.7.1)을 채택하고 개발을 시작했습니다.
하지만, Spring Security 설정을 작성하다 예상치 못한 곳에서 문제를 만났습니다.
그 문제는 바로 WebSecurityConfigurerAdapter 요 녀석입니다.
Spring Security 관련 설정을 할 때

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	...
}

요런 식으로 상속받아 configure 메소드를 오버라이딩하며 잘 사용해왔지만...
WebSecurityConfigurerAdapter 이렇게 deprecated되어있는 녀석을 보게 되었습니다.

Deprecate된 WebSecurityConfigurerAdapter

Spring 공식 블로그에 따르면,
Spring Security 5.7.0-M2 부터 WebSecurityConfigurerAdapter가 deprecated되었다고 합니다.
그 이유는 바로 component-based security configuration로의 사용자들의 전환을 격려하기 위함이라고 합니다. 이런 새로운 스타일의 설정으로의 이동을 돕기 위해, Spring 팀은 많은 노력을 진행했다고 합니다. (많은 use-case들과 앞으로 나올 대안들을 정리하고 분석했다고 합니다. 대단..😲)
그렇다면, 이제 사라질 WebSecurityConfigurerAdapter을 놓아주면서 기존의 코드를 어떤 방식으로 수정할 수 있는지 알아보겠습니다.

HttpSecurity

기존 방식

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

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

}

새로운 방식

@Configuration
public class SecurityConfiguration {

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

}

기존에는 WebSecurityConfigurerAdapter를 상속받고 configure 메서드를 오버라이딩하여 설정들을 정의했습니다.
하지만, 바뀐 새로운 방식에서는 configure 메서드를 오버라이딩하는 방식이 아닌 설정들을 하나의 Bean으로 등록하고 SecurityFilterChain를 리턴합니다.

SecurityFilterChain은 Spring Security 5.4 버전에서 업데이트되었습니다.
https://github.com/spring-projects/spring-security/issues/8804

WebSecurity

WebSecurity도 봐보겠습니다.

기존 방식

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/ignore1", "/ignore2");
    }

}

새로운 방식

@Configuration
public class SecurityConfiguration {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
    }

}

WebSecurity도 HttpSecurity와 마찬가지로 더이상 configure 메서드를 오버라이딩 하지 않습니다.
대신 설정을 하나의 Bean으로 등록하고 WebSecurityCustomizer를 리턴합니다.

WebSecurityCustomizer는 Spring Security 5.4 버전에서 업데이트되었습니다.
https://github.com/spring-projects/spring-security/issues/8978

👉 Spring에서는 WebSecurity를 사용해서 특정 request를 ignore하려고 한다면, HttpSecurityauthorizeHttpRequestspermitAll메서드를 사용하는 것을 권장합니다.

그 외 설정 내에서 사용하는 메서드들은 대부분 그대로 사용할 수 있었습니다.

이 외에도 LDAP Authentication, JDBC Authentication, In-Memory Authentication, Local AuthenticationManager, Accessing the local AuthenticationManager에 관한 정보를 알고 싶으시다면 Spring 공식 블로그를 참고하시면 좋을 것 같습니다!


정리

Spring 팀은 Component-based Security Configuration로의 사용자들의 전환을 위해 WebSecurityConfigurerAdapter를 deprecated 시키고 새로운 설정 방식을 도입했습니다.
기존 configure 메서드를 오버라이딩하여 설정을 진행하는 것이 아닌 설정들을 하나의 Bean으로 등록하는 Component화를 진행했습니다.

모든 예시코드는 Spring 공식 블로그에서 제공한 코드를 사용하였습니다.

1개의 댓글

comment-user-thumbnail
2023년 8월 9일

감사합니다.

답글 달기