본문 바로가기
Development/Spring Boot

스프링 부트 2.0에서 3.0 스프링 시큐리티 마이그레이션 (변경점)

by Nahwasa 2023. 2. 9.

목차

     

      스프링 부트 3.0 부터 스프링 시큐리티 6.0.0 이상의 버전이 적용되었습니다. 스프링 부트 2.7.8 까지는 deprecated는 되었더라도 기존 설정대로 대부분 사용 가능했으나, 스프링 부트 3.0 부터는 아예 삭제된 부분들이 있어서 마이그레이션 시 주의할 부분(변경점)에 대해 다룹니다.

     

    - 스프링 부트 2.7 이하 스프링 시큐리티 기본 세팅 : 링크

    - 스프링 부트 3.0 이상 스프링 시큐리티 기본 세팅 : 작성중

     

     

    0. 스프링 시큐리티 설정 마이그레이션 예시

      완전히 동일한 세팅은 아니지만, 스프링 부트 2.6 기반으로 작성된 기본 세팅 코드와 스프링 부트 3.0 기반으로 작성된 기본 세팅 코드 입니다. 이하에 나올 변경점들이 적용되어 있는걸 코드로 볼 수 있습니다.(각각 위 2.7 이하 기본 세팅과 3.0 이상 기본 세팅 글에 사용된 코드입니다.)

     

    (기존) github

    (변경) github

     

     

     

    1. antMatchers(), mvcMatchers(), regexMatchers()

    -> requestMatchers() (또는 securityMatchers()) 로 변경

     

     

    2. authorizeRequests()

    -> authorizeHttpRequests() 로 변경

     

     

    3. JSP 등 컨트롤러에서 화면 파일명을 리턴해 화면을 바꾸는 경우

    (FORWARD 방식으로 페이지 이동할 경우)

    -> 이하 '4'에서 세팅 시 authorizeHttpRequests 쪽에 dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll() 를 추가해줘야 함 (스프링 시큐리티 6.0부터 forward 방식 페이지 이동에도 default로 인증이 걸리도록 변경되었음)

     

     

    4. HttpSecurity 설정

    기존 extends WebSecurityConfigurerAdapter 를 통해 세팅

    -> 이제 WebSecurityConfigurerAdapter를 상속받는 방식은 삭제되었음. SecurityFilterChain 빈을 스프링 컨테이너에 등록해줘야 함.

     

    (기존)

    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeHttpRequests((authz) -> authz
                    .anyRequest().authenticated()
                )
                .httpBasic(withDefaults());
        }
    
    }

     

    (변경) - 이 때 기존에 antMatchers나 mvcMatchers를 사용했다면 requestMatchers로 변경해야 함.

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

     

     

    5. WebSecurity 설정 방식

    -> 마찬가지로 WebSecurityCustomizer 빈을 컨테이너에 등록하는 것으로 변경되었다가, 스프링 시큐리티 6부터는 아예 '4'에서 보던 HttpSecurity쪽에 등록하는 것으로 변경되었음.

     

    (기존)

    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeHttpRequests((authz) -> authz
                    .anyRequest().authenticated()
                )
                .httpBasic(withDefaults());
        }
        
        @Override
        public void configure(WebSecurity web) {
            web.ignoring().antMatchers("/nahwasa1", "/nahwasa2");
        }
    }

     

    (변경)

    @Configuration
    public class SecurityConfiguration {
    
        @Bean
        public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            http
                .authorizeHttpRequests(request -> request
                	.requestMatchers("/nahwasa1", "/nahwasa2").permitAll()
                    .anyRequest().authenticated()
                )
                .httpBasic(withDefaults());
            return http.build();
        }
    
    }

     

     

    6. UserDetailsService 등록 방식

    -> 이제 스프링 컨테이너에만 등록되면 됨.

     

    (기존)

    @Service
    public class LoginIdPwValidator implements UserDetailsService {
    	...
    }
    
    
    @Configuration
    public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    	...
        @Override
        public void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(loginIdPwValidator);
        }
    }

     

    (변경)

    @Service
    public class LoginIdPwValidator implements UserDetailsService {
    	...
    }
    
    
    (스프링 시큐리티쪽에 별도로 설정할 것 없이 적용됨)

     

     

    7. JDBC 인증

    -> 스프링 컨테이너에 등록

     

    (기존)

    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
        @Bean
        public DataSource dataSource() {
            return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .build();
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();
            auth.jdbcAuthentication()
                .withDefaultSchema()
                .dataSource(dataSource())
                .withUser(user);
        }
    }

     

    (변경)

    @Configuration
    public class SecurityConfiguration {
        @Bean
        public DataSource dataSource() {
            return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION)
                .build();
        }
    
        @Bean
        public UserDetailsManager users(DataSource dataSource) {
            UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();
            JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);
            users.createUser(user);
            return users;
        }
    }

     

     

    references

    https://docs.spring.io/spring-security/reference/5.8.0/migration/servlet/authorization.html#_permit_forward_when_using_spring_mvc

     

    Authorization Migrations :: Spring Security

    The following steps relate to changes around how authorization is performed.

    docs.spring.io

     

    https://docs.spring.io/spring-security/site/docs/5.7.0-M2/api/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter.html#configure%25org.springframework.security.config.annotation.web.builders.WebSecurity%29

     

    WebSecurityConfigurerAdapter (spring-security-docs 5.7.0-M2 API)

    Provides a convenient base class for creating a WebSecurityConfigurer instance. The implementation allows customization by overriding methods. Will automatically apply the result of looking up AbstractHttpConfigurer from SpringFactoriesLoader to allow deve

    docs.spring.io

     

    https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

     

    Spring | Home

    Cloud Your code, any cloud—we’ve got you covered. Connect and scale your services, whatever your platform.

    spring.io

     

    https://docs.spring.io/spring-security/reference/5.8/migration/index.html

     

    Preparing for 6.0 :: Spring Security

    The first step is to ensure you are the latest patch release of Spring Boot 2.7. Next, you should ensure you are on the latest patch release of Spring Security 5.8. If you are using Spring Boot, you will need to override the Spring Boot version from Spring

    docs.spring.io

     

    https://github.com/spring-projects/spring-security/issues/12479

     

    Configuration rules that worked in Spring Security 5.7.6 don't work in 6.0.1 · Issue #12479 · spring-projects/spring-security

    Describe the bug Configuration rules that worked in Spring Security 5.7.6 don't work in 6.0.1. After migrating the security configuration to Spring Security 6.0.1, there is an endless redirect ...

    github.com

     

    댓글