💐 Spring/Spring Security

(Deprecated) WebSecurityConfigurerAdapter에 대응하기

iseunghan 2022. 12. 9. 00:30
반응형

 

Spring Boot 2.7 (Spring 5.7.0-M2) 부터 WebSecurityConfigurerAdapter는 Deprecated가 되었다.

 

Spring Security without the WebSecurityConfigurerAdapter

<p>In Spring Security 5.7.0-M2 we <a href="https://github.com/spring-projects/spring-security/issues/10822">deprecated</a> the <code>WebSecurityConfigurerAdapter</code>, as we encourage users to move towards a component-based security configuration.</p> <p

spring.io

스프링 공식 블로그에서 제공하는 방식을 빠르게 정리해보겠다.

변경된 시큐리티 설정

HttpSecurity 설정

기존 설정 방식

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
    }

}

스프링은 SecurityFilterChain 빈을 등록하는 방법을 소개한다.

@Configuration
public class SecurityConfiguration {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
        return http.build();
    }

}

WebSecurity 설정

기존 방식

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/*.html", "/*.css", "/*.js");
    }

}

WebSecurityCustomizer를 빈으로 등록하는 방식

@Configuration
public class SecurityConfiguration {

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

}
  • 스프링 공식문서에서는 해당 방법을 권장하지 않는다.

ignoring을 한다면 애초에 시큐리티를 타지 않기 때문에 csrf 공격이나 다른 공격에 취약할 수 밖에 없다.

그러므로 스프링 시큐리티는 해당 방법을 권장하지 않는다.

권장하는 방법은 아래와 같다.

(HttpSecurity http) {
    http
        .requestMatchers(...atCommonResource()).permitAll()
    ...
}

그냥 정적 리소스의 Path를 permitAll()을 해주면 되는 것이다. 정적 리소스에 대한 인증은 거치지 않으면서도 시큐리티의 기본적인 보안 기능을 적용시키는게 권장사항이다.

  • 디버그도 함께 찍고 싶다면 아래 코드를 추가한다.
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    return (web) -> web.`debug`(securityDebug)
        .ignoring()
        .antMatchers("/css/**", "/js/**", "/img/**", "/lib/**", "/favicon.ico");
}

AuthenticationManager 빈 등록

기존 방식

@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
  return super.authenticationManagerBean();
}

변경된 방식

@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
    return authenticationConfiguration.getAuthenticationManager();
}

REFERENCES

반응형