Spring Security deprecated 문제 해결

·2023년 12월 9일
0

책의 예제를 참고해서 Oauth 구글 로그인을 하기 위해 SecurityConfig 파일을 작성하는데
스프링 3.1.x 버전에서 많은 메서드들이 deprecated 되었다.
문제를 해결하려고 구글링 했는데 대부분 블로그 글이 이전 버전 자료여서 알맞게 수정하는데 시간이 꽤 걸렸다...

기존 예제코드

@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final CustomOAuth2UserService customOAuth2UserService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .headers().frameOptions().disable()
                .and()
                    .authorizeRequests()
                    .antMatchers("/", "/css/**", "/images/**", "/js/**", "/h2-console/**", "/profile").permitAll()
                    .antMatchers("/api/v1/**").hasRole(Role.USER.name())
                    .anyRequest().authenticated()
                .and()
                    .logout()
                        .logoutSuccessUrl("/")
                .and()
                    .oauth2Login()
                        .userInfoEndpoint()
                            .userService(customOAuth2UserService);
    }
}

변경 코드

@Configuration
@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig {
    private final CustomOAuth2UserService customOAuth2UserService;
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf((csrf) -> csrf.disable())
                .headers((headerConfig) ->
                        headerConfig.frameOptions(frameOptionsConfig ->
                                frameOptionsConfig.disable()
                        ))
                .authorizeRequests((authorizeRequests) ->
                                authorizeRequests
                                        .requestMatchers("/","/oauth2/authorization/google", "/api/brands/**", "/api/products/**").permitAll()
                                        .requestMatchers("/admin/**").hasRole(Role.ADMIN.name())
                                        .requestMatchers("/api/buying/**", "/api/selling/**", "api/buy/**", "api/sell/**").hasRole(Role.USER.name())
                                        .anyRequest().authenticated()
                        )
                .logout((logoutConfig) ->
                        logoutConfig.logoutSuccessUrl("/")
                )
                .oauth2Login((oauth2) -> oauth2
                        .loginPage("/oauth2/authorization/google") // 권한 접근 실패 시 로그인 페이지로 이동
                        .defaultSuccessUrl("http://localhost:3000") // 로그인 성공 시 이동할 페이지
                        .failureUrl("/oauth2/authorization/google") // 로그인 실패 시 이동 페이지
                        .userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint
                                .userService(customOAuth2UserService)));

        return http.build();
    }

}

https://docs.spring.io/spring-security/reference/servlet/authorization/authorize-http-requests.html

https://docs.spring.io/spring-security/site/docs/current/api/deprecated-list.html

https://spring.io/blog/2019/11/21/spring-security-lambda-dsl

  • 공식 문서 참조해서 코드를 수정했다.
    버전에 맞게, 그리고 진행 중인 프로젝트에 맞게 작성해 주었다.
  • lamda DSL 구성으로 and()로 옵션들을 이어줄 필요가 없어졌다.
  • oauth2 사용하지 않은 SecurityConfig 파일 참고하다가 oauth2Login 말고 formLogin을 썼는데, Oauth2 기반으로 로그인을 할 땐 oauth2Login를 써야 한다고 한다(당연함)

스프링 시큐리티를 완전히 이해하지 못하고 주먹구구식으로 코드를 짜려고 하다 보니 쓸데없는 시간이 너무 많이 걸리고 막막했다...
스프링 시큐리티 어렵다•••

0개의 댓글