Spring Security 최신 문법 정리

SeHun.J·2024년 2월 20일
1

이전과 비교하면 매우 깔끔하게 바뀐 걸 확인할 수 있습니다.
다만, 문법이 많이 바뀌어서 강의를 들으면서 수정한 코드를 전후 비교로 올립니다!

버전 기준은 Spring Security 6.2.1 입니다.

이전 문법

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdaper {
	
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    	http.csrf().disable();
        http.authorizeRequests()
        	.antMatchers("/user/**").authenticated()
            .antMatchers("/manager/**").access("hasAnyRole('ROLE_ADMIN', 'ROLE_MANAGER')")
            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
            .anyRequest().permitAll()
            .and()
            .formLogin()
            .loginPage("/login");
    }
}

최신 문법

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf(csrf -> csrf.disable()); /* AbstractHttpConfigurer::disable */
        http.authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/user/**").authenticated()
                .requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER")
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().permitAll()
        );
        http.formLogin(form -> form.loginPage("/login"));
        return http.build();
    }
}

비교

첫번째 차이점은 WebSecurityConfigurerAdaper가 deprecated되고, 상속 대신 SecurityFilterChain를 @Bean으로 등록하는 방식으로 변경되었습니다.

// 이전
public class SecurityConfig extends WebSecurityConfigurerAdaper {}

// 최신
public class SecurityConfig {

    @Bean
    protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {}
}

두번째 차이점은 이전에는 http를 기준으로 메소드().메소드() 형태로 이어나갔다면, 최신 문법에서는 람다표현식을 사용합니다. 또한 .and()로 연결하지 않고, 그 아래에 새롭게 http.메소드() 형태로 이어나가시면 됩니다.

// 이전
http.csrf().disable();
http.authorizeRequests()
    .antMatchers("/user/**").authenticated()
    .antMatchers("/manager/**").access("hasAnyRole('ROLE_ADMIN', 'ROLE_MANAGER')")
    .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
    
// 최신
http.csrf(csrf -> csrf.disable()); /* AbstractHttpConfigurer::disable */
http.authorizeHttpRequests(authorize -> authorize
        .requestMatchers("/user/**").authenticated()
        .requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER")
        .requestMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().permitAll()
);
http.formLogin(form -> form.loginPage("/login"));
return http.build();

세번째 차이점은 access 검사에서 특정 Role에 있는지 검사할 때, 텍스트로 작성하던 문법은 메소드화 되었고, ROLE_을 붙일 필요없이 역할 이름만 작성하면 됩니다.

공부하면서 다른 문법도 추가할 예정입니다!
(ex. WebSecurityCustomizer)

profile
취직 준비중인 개발자

0개의 댓글