728x90

글에서 틀린부분이 있다면 지적해주시면 감사하겠습니다. 빠른 수정을 통해 잘못된 정보가 퍼지는 것을 막는걸 도와주세요.


우선 글을 시작하기에 앞서 본 포스팅은 https://colabear754.tistory.com/171 을 참고하여 공부하면서 겪은 문제들을 적어 놓은 글입니다. 자세한 내용은 해당 링크를 참조바랍니다.

 

[Spring Security] Spring Security와 JWT를 사용하여 사용자 인증 구현하기(Spring Boot 3.0.0 이상)

목차 시작하기 전에 글을 작성한 계기 예전에 REST API만 제공하는 백엔드 프로젝트를 진행하는 과정에서 API 사용 권한을 제한하기 위해 스프링 시큐리티와 JWT를 사용한 적이 있다. 이 때는 스프

colabear754.tistory.com


시작은 단순히 교육에서 배운 내용을 복기하고자 혼자서 토이 프로젝트를 하려고 했다. 그 과정에서 개발자가 되었을 때 최신기술에 누구보다 익숙해져있자라는 마인드로 스프링부트 최신버전, 시큐리티 최신버전을 선택했다가 고생을 좀 했다.


api별 접근 권한을 확인하기 위해서 사용한 커스텀 어노테이션이 동작하지 않을 때

권한에 따라 api의 호출을 제한하기 위해서 위 글에서는 @PreAuthorize 를 사용하였다. 이 때 내 프로젝트에서는 해당 어노테이션 및 커스텀 어노테이션을 적용하던 말던 그냥 api가 바로 호출되는 현상이 발생했었는데 이 문제는 SecurityConfig파일에 @EnableGlobalMethodSecurity(prePostEnabled = true) 를 적용하여서 해결했다. 하지만 해당 어노테이션은 곧 지원이 종료되기에 다른 방법을 적용해야했는데 그 때 @EnableMethodSecurity을 적용해주어 해결하였다.

 

PreAuthorize not working on Controller

I'm trying to define access rules at method-level but it's not working what so ever. SecurityConfiguration @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) pub...

stackoverflow.com

 

 

@EnableGlobalMethodSecurity is deprecated in the new spring boot 3.0

I use Spring Boot 3.0, and when I work on security configuration, I get a warning that the @EnableGlobalMethodSecurity is deprecated. @Configuration @EnableWebSecurity @AllArgsConstructor @

stackoverflow.com


시큐리티 컨피그 파일 형식

이건 문제라면 문제일 수도 있는데 기존에는 아래와 같이 csrf().disalbe(), sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 와 같이 설정한 친구들이 버전업이 되면서 인텔리제이에서 지원 안되니깐 빨리 바꿔라 라고 계속 에러문구가 떴다.

// 해당 코드는 포스팅 상단에 위치한 글 또는 프로젝트와는 전혀 상관없는 코드입니다. (참고용)

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http)
            throws Exception {
        http
                .csrf()
                .disable()
                .cors().and()
                .authorizeHttpRequests()
                .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
                .requestMatchers(
                        "/swagger-ui/**"
                        , "/swagger-ui.html"
                        , "/swagger-resources/**"
                        , "/v3/api-docs/**"
                ).permitAll()
                .requestMatchers(
                		...
                ).permitAll()
                .requestMatchers(
                		...
                ).hasRole(Role.ADMIN.toString())
                .anyRequest().authenticated()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authenticationProvider(authenticationProvider)
                .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);

        return http.build();

사실 무시하고 진행해도 상관은 없는데 빨간줄 뜨는게 신경쓰여서 찾아보니 람다 형식으로 바꿔서 작성하는 것을 추천한다라고 되어있었다. 이유는 csrf() 와 같이 기본 함수는 더 이상 지원을 하지 않고 커스텀한 함수들을 사용하라는 것 같았다.

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    private final String[] allowedUrls = {"/health-check/**",  // 정상적인 통신을 확인하는 테스트 api
            "/swagger-ui/**", "/swagger-resources/**", "/swagger-ui.html", "/v3/api-docs/**",   // swagger-ui
            "/auth/**"};    // 로그인, 로그아웃

    private final TokenAuthenticationFilter tokenFilter;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .csrf(AbstractHttpConfigurer::disable)
                .cors(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(request -> request
                        .requestMatchers(allowedUrls).permitAll()
                        .anyRequest().authenticated())
                .sessionManagement(session ->
                        session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .addFilterBefore(tokenFilter, BasicAuthenticationFilter.class);
        return http.build();
    }

그래서 위와 같이 disable 설정을 해주면 되고 추가로 requestMatcher 도 설정법이 바뀌었으니 참고하시면 좋을 거 같습니다.

 

Deprecated List (spring-security-docs 6.1.1 API)

 

docs.spring.io

 

+ Recent posts