BUILD_SSO

[Spring Security 5] Deprecated된 WebSecurityConfigurerAdapter, Spring Security 버전 문제 해결 방법 본문

Books/스프링 부트와 AWS로 혼자 구현하는 웹 서비스

[Spring Security 5] Deprecated된 WebSecurityConfigurerAdapter, Spring Security 버전 문제 해결 방법

sohyeonnn 2023. 6. 5. 16:20

Spring Security를 학습하던 도중 WebSecurityConfigurerAdapter 상속이 안되는 문제가 발생했습니다.
결과부터 말하자면 스프링 버전이 업데이트되면서 'WebSecurityConfigAdapter'는 Spring Security 5에서 deprecated 되었고, Spring Security 5.2.0 이상에서는 완전히 제거되었다고 합니다.
해결 방법, 문제 발생 코드, 해결 코드를 순서대로 작성해 보겠습니다.

 

◼ 해결 방법

스프링 공식 문서에서는 WebSecurityConfigAdapter 상속 대체 방법으로 @Bean을 생성하여 구성하는 기능을 권장하고 있습니다.

 

  • 버전업 이전 방식
//이전 방법
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

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

}

 

  • 버전업 이후 방식

바뀐 방법은 SecurityFilterChain bean을 등록하는 것입니다.

//Spring Security 5.2.0 이후 버전
@Configuration
public class SecurityConfiguration {

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

}

 

◼ 문제발생 코드

문제가 발생한 클래스 전문입니다.

package com.book.springboot.config.auth;

import com.book.springboot.domain.user.Role;
import lombok.RequiredArgsConstructor;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigAdapter {

    private final CustomOAuth2UserService customOAuth2UserService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .headers().frameOptions().disable()
                .and()
                .authorizeRequests()
                .antMatchers("/", "/css/**", "/images/**", "/js/**", "/h2-console/**").permitAll()
                .antMatchers("/api/v1/**").hasRole(Role.USER.name())
                .anyRequest().authenticated()
                .and()
                .logout()
                .logoutSuccessUrl("/")
                .and()
                .oauth2Login()
                .userInfoEndpoint()
                .userService(customOAuth2UserService);
    }
}

 

◼ 해결 코드

권장 방법대로 SecurityFilterChain bean을 등록하여 해결했습니다.

package com.book.springboot.config.auth;

import com.book.springboot.domain.user.Role;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig {

    private final CustomOAuth2UserService customOAuth2UserService;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .headers().frameOptions().disable()
                .and()
                .authorizeRequests()
                .antMatchers("/", "/css/**", "/images/**", "/js/**", "/h2-console/**").permitAll()
                .antMatchers("/api/v1/**").hasAuthority(Role.USER.getKey())
                .anyRequest().authenticated()
                .and()
                .logout()
                .logoutSuccessUrl("/")
                .and()
                .oauth2Login()
                .userInfoEndpoint()
                .userService(customOAuth2UserService);
        return http.build();
    }
}

 

 

참고

Comments