어 나 갱수.

[Spring] SpringSecurity 6.1에서 SecurityConfig 마이그레이션 본문

Spring

[Spring] SpringSecurity 6.1에서 SecurityConfig 마이그레이션

김경수 2024. 4. 28. 12:31
728x90

SpringWebflux 환경에서 아래와 같이 SecurityConfig 클래스를 생성하였습니다.

@Configuration
@EnableWebFluxSecurity
class SecurityConfig {

    @Bean
    fun passwordEncoder() = BCryptPasswordEncoder()


    @Bean
    protected fun filterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
        return http
            .httpBasic().disable()
            .formLogin().disable()
            .csrf().disable()
            .cors().disable()
            .authorizeExchange()
            .anyExchange().permitAll()
            .and().build()
    }
}

 

아래와 같은 에러가 발생하였습니다.

 

문제 분석

해당 문제는 SpringSecurity 6.1 이상 버전을 사용하면 발생하는 문제입니다.

 

Spring Security 6.1.0

SpringBoot 3.1.0 버전은 Spring Security 6.1.0 버전을 dependency 합니다.

 

Spring Security 6.1.0의 release note를 살펴보면 and()와 non-lambda DSL methods를 deprecating 했습니다.

 

non-lambda DSL이란 ?

Spring Security 5.2 release부터 lamda DSL을 지원해왔습니다. 예전에는 lambda DSL사용이 선택사항이었습니다.
이번 release 부터 dprecated 되어 무조건 lambda DSL사용을 해야 했습니다.

 

Spring Security 6.1 이상에서, httpBasic(), formLogin(), csrf(), cors(), authorizeExchange() 등의 메서드를 사용하여 보안 구성을 진행할 때, 이전 버전에서 사용되던 .disable() 방식 대신 새로운 람다 기반의 구성 방식을 채택하고 있습니다.

이는 보안 구성을 더 유연하고 세밀하게 조정할 수 있도록 돕기 위한 변경입니다.

 

해당 프로젝트에서는 SpringSecurity 6.2.1 버전을 사용함으로 SecurityConfig 클래스의 수정이 필요합니다.

 

문제 해결

문제를 해결하기 위해서는, Spring Security의 새로운 설정 방식에 맞추어 SecurityConfig 클래스를 업데이트해야 했습니다. 각 설정을 비활성화하기 위해 .disable() 메소드를 직접 호출하는 대신, 해당 설정을 lambda 표현식으로 전달하고 내부에서 .disable()을 호출하는 방식으로 변경했습니다.

이러한 변경을 통해, Spring Security의 최신 버전과 호환되는 방식으로 코드를 재구성할 수 있었습니다.

@Configuration
@EnableWebFluxSecurity
class SecurityConfig {

    @Bean
    fun passwordEncoder() = BCryptPasswordEncoder()


    @Bean
    protected fun filterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
        return http
            .httpBasic { httpBasic -> httpBasic.disable() }
            .formLogin { formLogin -> formLogin.disable() }
            .csrf { csrf -> csrf.disable() }
            .cors { cors -> cors.disable() }
            .authorizeExchange { auth ->
                auth
                    .anyExchange().permitAll()
            }
            .build()
    }
}

 

https://stackoverflow.com/questions/74683225/updating-to-spring-security-6-0-replacing-removed-and-deprecated-functionality

 

Updating to Spring Security 6.0 - replacing Removed and Deprecated functionality for securing requests

I'm trying to upgrade to Spring Boot 3.0.0 and Spring Security 6.0. I've found that method for securing requests authorizeRequests() has been deprecated. And also method antMatchers() and @

stackoverflow.com

 

728x90