본문 바로가기
Backend/Spring

[Spring] Spring Boot 3.x SecurityConfig 설정 (Spring Security + OAuth2.0)

by 비전공자 기록광 2023. 12. 16.
반응형

업무를 하며 오랜만에 spring security를 다시 만지게 됐다.

신규 프로젝트라 내 마음대로 셋팅을 할 수 있어 기존 많이 쓰던 Java 11 + Spring Boot 2.x 대신 Java 17 + Spring Boot 3.x로 셋팅했다. 그리고 별생각 없이 SecurityConfig를 이전 방식대로 했다가 엄청난 에러 모음을 만났다.

올해 초에 스프링 시큐리티 관련 내용을 블로깅 했기에 업데이트된 버전도 같이 올렸다.

 

 

spring boot 2.x 에서 3.x 로 넘어가며 많은 기능들이 deprecated 됐다.

 

 

[Spring] Spring Security + OAuth2.0으로 소셜 로그인 구현 ver 1. SSR (OAuth2.0 / 구글 로그인 / 네이버 로그인

2023.01.09 - [Backend/Spring] - [Spring] Spring Security 기본 개념 (JWT / OAuth2.0 / 동작 방식 / 구성 요소) [Spring] Spring Security 기본 개념 (JWT / OAuth2.0 / 동작 방식 / 구성 요소) JWT (Jason Web Token) 유저 인증, 식별하

datamoney.tistory.com

 

내가 이전에 작성했던 SecurityConfig은 이렇다.

 

@Configuration
@EnableWebSecurity
public class SecurityConfig { //WebSecurityConfigurerAdapter was deprecated
 
    private final CustomOAuth2UserService customOAuth2UserService;
 
    public SecurityConfig(CustomOAuth2UserService customOAuth2UserService) {
        this.customOAuth2UserService = customOAuth2UserService;
    }
 
    @Bean
    public BCryptPasswordEncoder encoder() {
        return new BCryptPasswordEncoder();
    }
 
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .formLogin().disable()
                .httpBasic().disable()
                .authorizeRequests()
                .antMatchers("/api/user").permitAll()
                .and()
                .oauth2Login().userInfoEndpoint().userService(customOAuth2UserService);
        return http.build();
    }
}

 

 

아래가 새로운 설정이다.

 

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private final CustomOAuth2UserService customOAuth2UserService;

    public SecurityConfig(CustomOAuth2UserService customOAuth2UserService) {
        this.customOAuth2UserService = customOAuth2UserService;
    }
 
    @Bean
    public BCryptPasswordEncoder encoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception {
        http
                .csrf(AbstractHttpConfigurer::disable)
                .sessionManagement((sessionManagement) ->
                        sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                )
                .formLogin(AbstractHttpConfigurer::disable)
                .httpBasic(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests((authorizeRequests) -> authorizeRequests
                        .requestMatchers(new MvcRequestMatcher(introspector, "/api/user")).permitAll()
                )
                .oauth2Login(oauth2Login ->
                        oauth2Login.userInfoEndpoint(userInfoEndpointConfig ->
                                userInfoEndpointConfig.userService(customOAuth2UserService)))
        ;
        return http.build();
    }
}

 

 

이전 버전과의 다른점으로 더 이상 .and( ) 가 필요 없다는 걸 한 눈에 볼 수 있다.

그리고 싹다 람다형식으로 바뀌었다.

 

 

관련 내용은 공식 문서에서 확인할 수 있는데

바뀐 이유에 대해서 말하자면〰️

 

1. 리턴 타입의 명확성

2. 일관성 문제

 

때문이라고 한다.

 

 

신규 프로젝트를 하며 혼자서 이것 저것 적용하고 있다.

restTemplate 대신 webClient도 사용하고..

JPA와 함께 JOOQ도 적용하고...

 

오랜만에 새로운 걸하니 재밌다. 다만 같이 봐주고 더 나은 방향으로 이끌어 줄 사람이 있었으면 하지만...

더 열쉬미해야지... 🤧

 


참고

 

Configuration Migrations :: Spring Security

The Lambda DSL is present in Spring Security since version 5.2, and it allows HTTP security to be configured using lambdas. You may have seen this style of configuration in the Spring Security documentation or samples. Let us take a look at how a lambda co

docs.spring.io

반응형

댓글