2023-10-09 @이영훈
Spring boot 3.x에서 Spring Security 6 버전이 적용이 되었습니다 (기존에는 5.8 버전)
Spring Security 6.1부터는 여러 method들을 deprecated 시켰습니다. 다음 7버전에서는 해당 method들이 삭제된다고 합니다.
Spring Security 6에서 deprecated된 함수들을 migration하는 과정을 기록으로 남깁니다
모든 deprecated된 함수를 다루지는 않고 저의 프로젝트에서 필요한 내용들 위주로 살펴봅니다
문제 상황 확인 & 해결 방법 탐색
다음과 같이 함수들이 deprecated 되었습니다
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true)
@Configuration
class ProjectConfig {
@Bean
fun filterChain(http: HttpSecurity): SecurityFilterChain {
http.cors()
.and()
.csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore(exceptionHandlerFilter(), BasicAuthenticationFilter::class.java)
.addFilterAt(loginAuthenticationFilter(), BasicAuthenticationFilter::class.java)
.authorizeHttpRequests()
.anyRequest().permitAll()
return http.build()
}
}
Kotlin
복사
cors() 함수를 살펴보면, 7.0 버전에서 삭제된다고 하고, cors(Customizer)를 사용하라고 되어있습니다.
csrf() 함수도 살펴보면, 7.0 버전에서 삭제된다고 하고, csrf(Customizer)를 사용하라고 안내하고 있습니다.
수정하는 방식이 모두 Customizer를 사용해서 수정하라고 안내하고 있습니다.
Customizer를 살펴보겠습니다.
•
Callback interface that accepts a single input argument and returns no result.
callback 함수입니다. lambda로 만들면 된다는 것을 알 수 있습니다.
그리고 공식문서를 확인합니다.
•
6.0 버전으로 migration guide 를 확인할 수 있습니다.
•
Servlet에서 CORS 적용하는 문서도 확인할 수 있습니다.
@Configuration
@EnableWebSecurity
open class WebSecurityConfig {
@Bean
open fun filterChain(http: HttpSecurity): SecurityFilterChain {
http {
// by default uses a Bean by the name of corsConfigurationSource
cors { } // callback으로 구현한 것을 확인할 수 있습니다. 안에 lambda는 따로 없고 기본값을 사용합니다. 기본값은 corsConfigurationSource 빈 입니다
// ...
}
return http.build()
}
@Bean
open fun corsConfigurationSource(): CorsConfigurationSource {
val configuration = CorsConfiguration()
configuration.allowedOrigins = listOf("https://example.com")
configuration.allowedMethods = listOf("GET", "POST")
val source = UrlBasedCorsConfigurationSource()
source.registerCorsConfiguration("/**", configuration)
return source
}
}
Kotlin
복사
글에서는 cors { } 만 다루었는데, 공식문서를 찬찬히 읽어보면 lambda 기반의 설정 방식을 사용하면 된다는 것을 확실하게 알 수 있습니다.
해결
다음과 같이 cors(), csrf(), sessionManagement()를 모두 Customizer 인터페이스를 구현하는, lambda 기반의 설정 방식으로 수정하였습니다.
and()는 Spring Security에서 더이상 사용하지 않아서 삭제하였습니다.
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true)
@Configuration
class ProjectConfig {
@Bean
fun filterChain(http: HttpSecurity): SecurityFilterChain {
http.cors { }
.csrf { csrf -> csrf.disable() }
.sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) }
.addFilterBefore(exceptionHandlerFilter(), BasicAuthenticationFilter::class.java)
.addFilterAt(loginAuthenticationFilter(), BasicAuthenticationFilter::class.java)
.authorizeHttpRequests { it.anyRequest().permitAll() }
return http.build()
}
}
Kotlin
복사