Spring Security 6.x에서 WebSecurityConfigurerAdapter 대체하기

David Lee·2023년 12월 2일
post-thumbnail

Spring Security 6.x에서 WebSecurityConfigurerAdapter를 대체하는 방법을 알아봅니다.

포스트를 작성하게 된 계기

데브코스에서 Spring Security를 공부하고 있는데 강의에서 배운 내용을 실제로 작성해보려고 Spring Security 프로젝트를 만들어서 따라하다보니 WebSecurityConfigurerAdapter 가 Deprecate 되어 사용할 수 없었다. 이에 WebSecurityConfigurerAdapter 이 어떤 역할을 담당했었고, 이를 Spring Security 6.x에서 어떻게 대처했는지 공부하고자 포스트를 작성하게 되었다.

WebSecurityConfigurerAdapter

WebSecurityConfigurerAdapter 에 대해서 Docs는 아래와 같이 설명하고 있다.

WebSecurityConfigurer 인스턴스를 생성하기 위한 편리한 베이스 클래스를 제공합니다.
이 구현은 메서드를 재정의하여 사용자 정의할 수 있습니다

WebSecurityConfigurerAdapter는 웹 보안에 대해서 사용자 정의를 지정하는 WebSecurityConfigurer 인스턴스를 생성하기 위한 Adapter Class라고 볼 수 있다.

왜 Deprecate 됬을까?

Spring Security Github Issue를 살펴보면 WebSecurityConfigurerAdapter를 Deprecate시킨 이유를 2가지로 설명하고 있다.

  • Does Not Expose Beans
    • Bean이 외부로 노출되지 않고 Spring Boot에서 자동 구성을 위해서 사용할 수 없는 객체를 조용히 생성한다.
    • Spring Boot가 AuthenticationManager의 생성 여부를 스스로 파악하기 어렵고, 사용자가 AuthenticationManager를 Bean으로 사용하기도 어렵다.
  • Beans Cannot be Injected via Method Arguments
    • @Override라는 정적 특성을 활용하기 때문에 보안 구성이 메서드 인수로 Bean을 전달하지 않고, 종속성을 맴버 변수에 주입하거나, 메서드 참조를 통해서만 해결이 가능하다.
    • 물론 위의 경우가 아예 잘못된 경우라고 할 수는 없지만 Spring에서 메서드 인수로 Bean을 전달할 때는 Spring이 Bean에 대한 종속성 파악을 다 한 상황에서 인수 전달이 가능하지만, 맴버 변수나 @Autowired 메서드 등을 사용해서 종속성을 참조받는다면 Bean의 종속성 파악을 위해서 해결하기 위해서 @Configuration전체를 다시 초기화해야하는 상황이 필요하다.

WebSecurityConfigurerAdapter가 적용된 Configuration에 대해 Bean 생성이 이뤄지지 않음에서 발생하는 문제점들이 많아졌기에 이를 해결하고지 Deprecate했다고 볼 수 있다.

Spring Security 5.8 이상에서 WebSecurityConfiguration을 어떻게 만들까?

Spring Security 5.8.x 버전부터 6.x 버전으로 Migration을 위해서 WebSecurityConfigurerAdapter가 Deprecate되어 있다.

5.8.x 이상 버전에서 SecurityConfiguration 를 생성하는 방식은 아래와 같다.

// 5.7.x 이하 버전
@EnableMethodSecurity
public class MyConfiguration extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    // ...
  }
	
	// ...
}

// 5.8.x 이상 버전
@Configuration
@EnableMethodSecurity
public class MyConfiguration {
	@Bean
  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    return http
				// ...
        .build();
  }

	// ...
}

기존 WebSecurityConfigurerAdapter를 상속받아 메소드 오버라이드를 활용하여 구현하던 방식에서 @Bean 메소드를 생성하여 결과값을 리턴해주는 방식으로 변경되었다.

마무리

WebSecurityConfigurerAdapter가 Deprecate되고 새로운 방법을 제시하는 과정을 찾아보면서 제공되고 있는 프레임워크에 대해 사용하는것 뿐만 아니라 다양한 의견 제시와 개발, 발전이 활발하게 이루어지고 있다는 점을 Github Issue를 통해 엿볼 수 있는 좋은 기회였다고 생각한다.

출처

profile
쌓아가기

0개의 댓글