Programing/Spring Security

Spring Starter security 2.x 3.x 설정 방식 차이

리커니 2023. 11. 21. 09:56
반응형

이번 포스팅에서는 Spring 2.x 와 3.x 의 설정 방식의 차이에 대해서 알아보겠습니다.

JWT 를 쓰는 환경이고, 같은 설정 코드를 비교해서 어떤 점이 달라졌는지 확인해보겠습니다.

 

2.x 설정 코드 입니다.

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@RequiredArgsConstructor
public class SecurityConfig {
    private final TokenProvider tokenProvider;
    private final JwtAuthenticationEntryPoint jwtAtuthenticationEntryPoint;
    private final JwtAccessDeniedHandler jwtAccessDeniedHandler;
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    
        @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                .csrf().disable()
                .cors().disable()

                /* 401, 403 Exception 핸들링 */
                .exceptionHandling()
                .authenticationEntryPoint(jwtAtuthenticationEntryPoint)
                .accessDeniedHandler(jwtAccessDeniedHandler)

                /* 세션 사용하지 않음 */
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)

                /* HttpServletRequest를 사용하는 요청들에 대한 접근 제한 설정 */
                .and()
                .authorizeHttpRequests()
                .antMatchers(CmmnVar.ignoreUrls).permitAll()
                /* swagger 관련 허용 */
                .antMatchers(CmmnVar.swaggerUrls).permitAll()
                .anyRequest().authenticated()

                /** JwtSecurityConfig 적용 */
                .and()
                .apply(new JwtSecurityConfig(tokenProvider))
                .and().build();
    }
}

 

 

3.x 설정 코드 입니다.

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@RequiredArgsConstructor
public class SecurityConfig {
    private final TokenProvider tokenProvider;
    private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
    private final JwtAccessDeniedHandler jwtAccessDeniedHandler;
    private final MessageConfig messageConfig;
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf(AbstractHttpConfigurer::disable)
            .cors(AbstractHttpConfigurer::disable)
            .headers(c -> c.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable).disable())
            .authorizeHttpRequests(auth -> {
                auth
                    .requestMatchers(CommonVariables.ignoreUrls).permitAll()
                    .requestMatchers(CommonVariables.swaggerUrls).permitAll()
                    .anyRequest().authenticated();
            }).exceptionHandling(c ->
                    c.authenticationEntryPoint(jwtAuthenticationEntryPoint).accessDeniedHandler(jwtAccessDeniedHandler)
            ).sessionManagement(c -> c.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .apply(new JwtSecurityConfig(tokenProvider, messageConfig));
        return http.build();
    }
}

 

위에서 부터 천천히 보시면 3.x 에서는 @EnableGlobalMethodSrcurity 가 Deprecated 되었습니다.

해당 어노테이션은 메서드 기반의 시큐리티를 적용할 수 있는 옵션을 제공합니다. 

 3.x 에서는 @EnableMethodScurity 로 이를 대체합니다.

 

passwordEncoder 설정이나 다른 방식은 크게 차이가 없지만,

filterChain method를 보시면 HttpSecurity의 메서드 호출 방식이 변경 되었습니다.

csrf method를 비교해보겠습니다.

 

2.x

public CsrfConfigurer<HttpSecurity> csrf() throws Exception {
    ApplicationContext context = getContext();
    return getOrApply(new CsrfConfigurer<>(context));
}

 

3.x

public HttpSecurity csrf(Customizer<CsrfConfigurer<HttpSecurity>> csrfCustomizer) throws Exception {
    ApplicationContext context = getContext();
    csrfCustomizer.customize(getOrApply(new CsrfConfigurer<>(context)));
    return HttpSecurity.this;
}

 

이와 같이 거의 모든 메서드가 매개변수를 받아 처리하는 함수형 방식으로 변경이 되면서 좀 더 유연하고 간결하게 설정할 수 있도록 변경 되었습니다.

반응형