[Spring Boot] Spring Boot 3.x SecurityConfig 설정하기

유호경·2024년 3월 18일

프로젝트를 진행하면서 자바 버전과 Spring, Spring Security 등의 버전을 비교적 최신 버전으로 교체하면서

deprecated된 기능들이 많아서 config 설정에 어려움을 겪어 공유하고자 한다.

이전 버전대의 Spring Security 설정 파일을 그대로 적용하면 다음과 같은 에러가 난다.

이전 버전에서는 위와 같이 WebSecurityConfigurerAdapter를 사용하여 매소드들을 Overrid하여 사용했다.

Spring Boot 3.x 버전에서는 deprecated되었기 때문에 다음과 같이 수정하였다.

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

  private final JwtTokenProvider jwtTokenProvider;


    @Bean
    protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
            httpSecurity
                // REST API이므로 basic auth 및 csrf 보안을 사용하지 않음
                .httpBasic(httpBasic ->httpBasic.disable())
                .csrf(csrf -> csrf.disable())
                
                // JWT를 사용하기 때문에 세션을 사용하지 않음
                .sessionManagement(sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(auth -> auth
                    // 해당 API에 대해서는 모든 요청을 허가
                    .requestMatchers(All_PERMIT_URL_ARR).permitAll()
                    // USER 권한 허용
                    .requestMatchers(USER_PERMIT_URL_ARR).hasAnyRole("USER", "ADMIN")
                    // ADMIN 권한 허용
                    .requestMatchers(ADMIN_PERMIT_URL_ARR).hasRole("ADMIN")
                    // 이 밖에 모든 요청에 대해서 인증을 필요로 한다는 설정
                    .anyRequest()
                    .authenticated()
                )
        
                // JWT 인증을 위하여 직접 구현한 필터를 UsernamePasswordAuthenticationFilter 전에 실행
                .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class);
            return httpSecurity.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

 }

기본적으로 csrf 비활성화 시키고, 특정 엔드포인트를 인가 예외시키는 설정이다. 대부분 람다식으로 처리되는 특징을 엿볼 수 있다.

profile
하면된다.

0개의 댓글