[좌충우돌 개발일지 - Spring Security] WebSecurityConfigurerAdapter - Deprecated

2022. 12. 14. 06:01프로그래머스/TIL

spring security 강의를 듣던 중 강사님께서 쓰시는 WebSecurityConfigurerAdapter가 현재는 Deprecated 되었다.

난 강의를 늦게 들어서 먼저 강의를 수강했던 팀원들의 도움을 받았다.

기존에는 WebSecurityConfigurerAdapter를 상속받아서 Configuration을 만들었었는데

이를 SecurityFilterChain을 빈 등록해서 사용하는 방식으로 바뀌었다. 아래는 잘 설명되어있는 블로그 글이다.
https://devlog-wjdrbs96.tistory.com/434

 

[Spring] Security WebSecurityConfigurerAdapter Deprecated 해결하기

WebSecurityConfigurerAdapter Deprecated 해결하기 최근에 Spring Security를 설정해보려고 WebSecurityConfigurerAdapter를 사용하려 보니 Deprecated가 되어 있었는데요. @RequiredArgsConstructor @EnableWebSecurity public class WebSecur

devlog-wjdrbs96.tistory.com

=> 해당 글에 있는 공식문서를 이용해서 고치면 좋을 것 같다.

 

spring boot 2.7.6 사용 


기존코드와 변경된 코드의 차이점

[ 기존 코드 ]

@Configuration
@EnableWebSecurity
public class WebSecurityConfigure extends WebSecurityConfigurerAdapter {

  @Override
  public void configure(WebSecurity web) {
    web.ignoring().antMatchers("/assets/**");
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
        .antMatchers("/me").hasAnyRole("USER", "ADMIN")
        .anyRequest().permitAll()
        .and()
      .formLogin()
        .defaultSuccessUrl("/")
        .permitAll()
        .and()
    ;
  }

}

[ 변경 코드 ]

@Configuration
@EnableWebSecurity
public class WebSecurityConfigure {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().antMatchers("/assets/**");
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/me").hasAnyRole("USER", "ADMIN")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .defaultSuccessUrl("/")
                .permitAll()
                .and();
        return http.build();
    }
}

 

  • WebSecurityCustomizer에서 ignoring은 spring security에서 관리할 필요가 전혀없는 요청에 대해 스프링 시큐리티에서 무시하도록 하는 설정이다. -> 일반적으로 정적 리소스를 무시한다.
    • 이걸 무시하면 뭐가 좋을까? FilterChainProxy 라는 클래스가 있는데 이는 스프링 시큐리티의 진입점과 같은 역할을 한다. 요청이 들어왔을 때 해당 요청을 처리할 스프링시큐리티 필터체인을 구성하고 요청을 처리한다.
    • 근데 이 필터체인에 포함되는 필터의 수가 꽤 많기 때문에 매번 모든 요청에 대해 구성하고 실행하는건 비효율적이다. -> ex) 정적 요청 (물론 정적 리소스에 대해 실행한다고 해서 문제가 되진 않음. 다만 비효율적)
    • 설정안하면 index.html을 들고올때 스프링 시큐리티를 처리하고 그 페이지 내부적으로 어떤 아이콘이나 사진들을 들고 올때도 처리를 하게됨. -> 하나의 페이지에서도 처리될 필요가 없는 정적 리소스에 대한 시큐리티 처리가 여러번 처리됨. -> 굉장히 비효율적
  • filterChain
    • authorizeRequests는 요청들에 대해서 인증/인가하겠다는 것을 의미
    • anyMatchers는 /me에 접근을 하기 위해서 해당 role 중 하나를 가지고 있어야한다는 것
    • defaultSuccessUrl은 인증/인가에  성공하면 어느 경로로 이동하는지를 설정.