새소식

반응형
Java/Spring

[Spring Boot] Spring Security WebSecurityConfigurerAdapter Deprecated 로 인해 Security 설정 바꿔보기

  • -
반응형

Spring Security 로 로그인 구현 하다보니 WebSecurityConfigurerAdapter 가 Deprecated 되어 있는걸 확인했다.

평소에 로그인 구현했던 방법은 WebSecurityConfigurerAdapter 를 상속받아 configure 메소드들을 오버라이드 하여

구현했습니다.

 

하지만 이제 WebSecurityConfigurerAdapter 가 deprecated 되어 사용할 수 없다보니 다른 방법으로 구현해야 합니다.

 

WebSecurityConfigurerAdapter 공식문서를 보면 아래와 같이 나와있다.

Deprecated.
Use a SecurityFilterChain Bean to configure HttpSecurity or a WebSecurityCustomizer Bean to configure WebSecurity

더 이상 사용되지 않습니다. SecurityFilterChain Bean을 사용하여 HttpSecurity를 ​​구성하거나 WebSecurityCustomizer Bean을 사용하여 WebSecurity를 ​​구성하십시오.

 

위 내용을 보면 SecurityFilterChain 을 Bean 등록해서 사용하라고 합니다.

 

Spring Security 공식문서 에서 Bean 등록으로 SecurityFilterChain 설정하는 방법을 명시해놨습니다.

 

configure(HttpSecurity http)

기존 configure(HttpSecurity http) 를 오버라이드 했던 내용은 SecurityFilterChain을 Bean 등록해서 사용해야 한다.

 

configure(WebSecurity web)

보통 정적자원에 대한 요청은 검사하지 않고 통과시키기 위한 ignoring 설정을 많이 했다.

해당 내용은 위와 같다.

 

본인의 기존 내용을 Spring Security FilterChain 을 사용하여 변경해보겠다.

 

기존내용
@Configuration 
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
public void configure(WebSecurity web) throws Exception {
    //정적 파일(css, js, img)에 대한 인증은 무시하도록 설정
    web.ignoring().antMatchers("/static/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .authorizeRequests()
        .antMatchers(
            "/main/**"
            ,"/static/**"
            ,"/market/main"
            ,"/boast/main"
            ,"/server/main"
            ,"/auth/**"
        ).permitAll()
        .anyRequest().authenticated()
        .and()
            .formLogin()
                .loginPage("/auth/login/main")
                .usernameParameter("userName")
                .passwordParameter("userPassword")
                .loginProcessingUrl("/auth/loginCheck")
                .failureUrl("/auth/login/main")
                .defaultSuccessUrl("/auth/login/success")
                .permitAll()
            .and()
                .logout()
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/main")
            .and()
            /*.csrf().ignoringAntMatchers("/auth/**").and()*/
            .exceptionHandling()
                .authenticationEntryPoint(authEntiryPoint());
        }

    @Bean
    AuthenticationEntryPointHandler authEntiryPoint() {
        return new AuthenticationEntryPointHandler();
    }
}

 

 

기본설정만 볼 경우 아래의 내용만 추가해서 확인
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

    http
    //HTTP 페이지 권한설정
    .authorizeHttpRequests((authorize) -> 
        authorize
        // anyRequest() = 모든요청에, authenticated = 인증을 한다.
        .anyRequest().authenticated()
    )
    .formLogin();

    return http.build(); 
}
}

위 코드와 같이 모든 요청에 대해 인증을 진행하고 기본 Spring Security 의 기본 formLogin() 을 사용하면

"/login" URL 의 기본 페이지가 구성된다.

 

기본 패스워드는 console 창에 친절하게 입력해준다.

Spring Security 기본 계정은  Username = user, Password  = console창에 뜬 값이다.

 

 

여기서 큰 차이점이 있다.

아래 전체코드는 Spring Security 5.6 이전 버전으로 HttpSecurity 객체의 .authorizeRequests() 를 통해

인가 설정을 했으나 위 코드는 Spring Security 5.6 이후 버전에 나온 authorizeHttpRequest() 메서드를 통해

인가 설정을 했다.

 

.authorizeRequests() VS .authorizeHttpRequest()

두개의 차이점은 .authorizeRequest() 메서드를 통해 설정하던 내용을 불필요한 작업을 제거한 후

간단하게 설정하는게 authorizeHttpRequest() 메서드라고 한다.

 

전체 코드

Spring Security FilterChain을 Bean 등록하여 변경

@Configuration 
@EnableWebSecurity
public class SecurityConfig{

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

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .authorizeRequests()
        .antMatchers(
            "/main/**"
            ,"/static/**"
            ,"/market/main"
            ,"/boast/main"
            ,"/server/main"
            ,"/auth/**"
        ).permitAll()
        .anyRequest().authenticated()
        .and()
            .formLogin()
                .loginPage("/auth/login/main")
                .usernameParameter("userName")
                .passwordParameter("userPassword")
                .loginProcessingUrl("/auth/loginCheck")
                .failureUrl("/auth/login/main")
                .defaultSuccessUrl("/auth/login/success")
                .permitAll()
            .and()
                .logout()
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/main")
            .and()
            /*.csrf().ignoringAntMatchers("/auth/**").and()*/
            .exceptionHandling()
                .authenticationEntryPoint(authEntiryPoint());
        }

    @Bean
    AuthenticationEntryPointHandler authEntiryPoint() {
        return new AuthenticationEntryPointHandler();
    }

}

 

위와 같이 SecurityFilterChain을 Bean 등록하여 HttpSecurity 를 구성하였다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.