Peony의 기록 창고 🌼
반응형

Springboot 3.1.0 환경에서 Spring Security로 인증 방식을 구현하던 중 FilterChain 등록 코드에서 deprecated 에러가 등장했다.

'csrf()' is deprecated and marked for removal 

 

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 부터 lambda DSL을 지원해왔었다. 다만 이번 release 부터 deprecated 되어 사용할 수 없게 되었다.

non-lambda DSL 코드

@Bean
    protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http.cors().and().csrf().disable()
                .exceptionHandling()
                .authenticationEntryPoint(jwtAuthenticationEntryPoint)
                .accessDeniedHandler(jwtAccessDeniedHandler)

                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)

                .and()
                .authorizeHttpRequests()
                .requestMatchers(HttpMethod.DELETE, "/**/user").authenticated()
                .anyRequest().permitAll()

                .and()
                .apply(new JwtFilterConfig(tokenProvider))
                .and().build();
    }

 

? 왜 deprecated?

  • non-lambda DSL 방식에서는 반환 타입이 무엇인지 알지 못해 어떤 객체가 구성되고 있는지 명확하지 않았다.
  • 이는 중첩이 깊어질수록 혼란스러워졌다.
  • 많은 코드가 non-lambda DSL, lambda DSL 스타일 사이에서 불일치를 발생시켜 구성을 이해하기 어렵게 만들고, 잘못된 구성을 만들어냈다.

 

Lambda DSL?

lambda DSL은 말 그대로 람다를 사용한 DSL이다.

Tip : Customizer.withDefaults()Spring Security에서 제공하는 기본값을 사용하여 보안 기능을 활성화 했다.

    @Bean
    protected SecurityFilterChain filterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception {
        http.cors(Customizer.withDefaults())
            .csrf(AbstractHttpConfigurer::disable)
            // exception handling 할 때 우리가 만든 클래스를 추가
            .exceptionHandling(exceptionHandling ->
                    exceptionHandling.authenticationEntryPoint(jwtAuthenticationEntryPoint)
                            .accessDeniedHandler(jwtAccessDeniedHandler))
            //세션 설정을 Stateless 로 설정
            .sessionManagement(sessionManagement ->
                    sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            )
            //권한 설정
            .authorizeHttpRequests(httpRequest ->
                    httpRequest.requestMatchers(new MvcRequestMatcher(introspector, "/**/user/**")).authenticated()
                        //TODO : h2 지우면 변경해야함
//                            .requestMatchers(HttpMethod.DELETE, "/**/user").authenticated()
                            .anyRequest().permitAll())
            // JwtFilter 를 addFilterBefore 로 등록했던 JwtSecurityConfig 클래스를 적용
            .apply(new JwtFilterConfig(tokenProvider));
        return http.build();
    }

 

Lambda DSL의 이점

  • 메서드 체이닝에서 .and()를 사용하여 연결하지 않아도 된다.
    • 람다 메서드를 호출 후 추가 구성을 위해 HttpSecurity 인스턴스가 자동으로 반환
  • 자동 들여쓰기를 사용하면 configuration을 보다 쉽게 읽을 수 있다.
  • Spring Integration 및 Spring Cloud Gateway와 같은 다른 Spring DSL과 유사한 구성 스타일을 가지고 있다.

 

reference

https://docs.spring.io/spring-security/reference/migration-7/configuration.html

반응형
profile

Peony의 기록 창고 🌼

@myeongju