Memories in SeoK

기억하고 싶은 것들, 기억해야 하는 것들

개발/자바 Java

[Java 중급] deprecated Spring Security Configuration

Seo K 2024. 6. 6. 23:42

WebSecurityConfigurerAdapter

configure 메서드를 Overriding하여 웹 보안 설정을 구성할 때 사용했던 기본 클래스
(보안 설정 예시: 특정 URL에 대한 접근 권한 설정, 폼 로그인, HTTP Basic 인증 등)

 

Spring Security 5.7부터 클래스가 deprecated, 6.2 현재 removed
대신 5.4부터 소개된 더 유연하고 모듈화된 Component 구성을 사용

Component 기반으로 설정을 모듈화하면 세밀한 제어와 상황에 따라 필요한 설정만 포함시키기가 더 용이해짐

  • 개별 보안 구성 요소를 Bean으로 선언 (Spring 컨테이너에 등록, Life Cycle을 Spring이 관리)
  • SecurityFilterChain 또는 WebSecurityCustomizer 인터페이스를 구현

cf1. Spring Blog (영문)
cf2. https://devlog-wjdrbs96.tistory.com/434
cf3. https://velog.io/@chiyongs/Spring-deprecated된-WebSecurityConfigurerAdapter-이젠-안녕

체인 호출 방식

SecurityContext.and()를 활용한 체인 호출로 여러 설정을 연결하면서 구성

 

Spring Security 6.1부터 메서드가 deprecated, 대신 각 설정을 보다 더 독립적으로 구성하는 방식을 권장

HttpSecurity 객체에 각 설정을 argument로 받아 구성하는 메서드를 활용해 설정 별로 블록 생성

  • 설정이 블록으로 분리되어 코드의 독립성 및 가독성 증가
  • 설정을 각 기능별로 수정할 수 있어 유지보수 용이
  • 설정 간의 관계가 더 명확하게 드러나므로 의도 파악 용이

HttpSecurity의 authorizeRequests() 메서드

Spring Security 6.1부터 메서드가 deprecated, 7.0에 remove 예정
대신 authorizeHttpRequests() 사용

AbstractRequestMatcherRegistry의 antMatchers(), mvcMatchers(), regexMatchers() 메서드

Spring Security 5.8부터 메서드가 deprecated, 6.2 현재 removed
대신 requestMatchers() 사용

cf1. Spring Security 공식 문서 (영문)

권장에 따라 구현한 예시

Spring Boot 3.x (Spring Security 6.x) Spring Security 공식 문서 (영문)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@EnableWebSecurity
@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain( HttpSecurity http ) throws Exception {
        http
            .csrf( httpSecurityCsrfConfigurer -> httpSecurityCsrfConfigurer.disable() )
            .authorizeHttpRequests( authorizationManagerRequestMatcherRegistry -> authorizationManagerRequestMatcherRegistry
                .requestMatchers( "/public/**" ).permitAll()
                .anyRequest().authenticated()
            )
            .logout( logout -> logout.logoutSuccessUrl( "/" ) );

        return http.build();
    }
}