본문 바로가기
Spring.io

Spring Security 6.4 새로운 기능

by Records that rule memory 2024. 12. 3.
728x90

The architecture and key components of Spring Security 6.4.

 

Spring Security 6.4에서 기존 방식에서 새로운 방식으로 변경된 내용을 더 자세히 살펴보겠습니다.


1. authorizeRequests()authorizeHttpRequests()

기존 방식

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
        .and()
        .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/dashboard")
        .and()
        .logout()
            .logoutSuccessUrl("/login")
            .invalidateHttpSession(true);
}

 

새로운 방식

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/public/**").permitAll()
            .requestMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
        )
        .formLogin(form -> form
            .loginPage("/login")
            .defaultSuccessUrl("/dashboard")
        )
        .logout(logout -> logout
            .logoutSuccessUrl("/login")
            .invalidateHttpSession(true)
        )
        .build();
}

 

차이점 설명

  • authorizeRequests()authorizeHttpRequests()로 변경되어 Lambda 표현식을 사용합니다.
  • 설정의 가독성과 간결성이 크게 향상되었습니다.
  • SecurityFilterChain을 통해 @Bean 방식으로 구성합니다.

2. WebSecurityConfigurerAdapter 제거

기존 방식

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest().authenticated();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER");
    }
}

 

새로운 방식

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            )
            .build();
    }

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

    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user = User.withUsername("user")
            .password("{noop}password")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

 

차이점 설명

  • WebSecurityConfigurerAdapter가 제거되고 SecurityFilterChain@Bean을 사용하여 보안을 구성합니다.
  • 사용자 정보를 설정하는 부분도 InMemoryUserDetailsManager를 통해 설정합니다.

3. antMatchersrequestMatchers

기존 방식

http
    .authorizeRequests()
        .antMatchers("/api/**").hasRole("API_USER")
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated();

 

새로운 방식

http
    .authorizeHttpRequests(auth -> auth
        .requestMatchers("/api/**").hasRole("API_USER")
        .requestMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated()
    );

 

차이점 설명

  • antMatchers는 deprecated 되었고, 대신 requestMatchers를 사용합니다.
  • requestMatchers는 URL 외에도 HTTP 메서드 및 기타 조건을 더 유연하게 처리할 수 있습니다.

4. AuthenticationManager 구성

기존 방식

@Bean
public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
    return http.getSharedObject(AuthenticationManagerBuilder.class)
        .userDetailsService(userDetailsService())
        .passwordEncoder(passwordEncoder())
        .and()
        .build();
}

 

새로운 방식

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

@Bean
public UserDetailsService userDetailsService() {
    UserDetails user = User.withUsername("user")
        .password(passwordEncoder().encode("password"))
        .roles("USER")
        .build();
    return new InMemoryUserDetailsManager(user);
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

 

차이점 설명

  • HttpSecurity.getSharedObject를 사용하지 않고 AuthenticationConfiguration을 통해 AuthenticationManager를 구성합니다.
  • 비밀번호 인코더와 사용자 세부 정보를 별도의 @Bean으로 정의합니다.

5. CSRF 설정

기존 방식

http.csrf().disable();

 

새로운 방식

http.csrf(csrf -> csrf.disable());

 

차이점 설명

  • Lambda 표현식을 사용하여 설정을 더 명확하게 만듭니다.

6. Session Management

기존 방식

http.sessionManagement()
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

 

새로운 방식

http.sessionManagement(session -> session
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
);

 

차이점 설명

  • Lambda 표현식을 통해 세션 관리 설정이 더 직관적이 되었습니다.

7. Logout 설정

기존 방식

http.logout()
    .logoutUrl("/logout")
    .logoutSuccessUrl("/login");

 

새로운 방식

http.logout(logout -> logout
    .logoutUrl("/logout")
    .logoutSuccessUrl("/login")
);

 

차이점 설명

  • Logout 설정도 Lambda 표현식을 사용하여 더 간결해졌습니다.

8. 커스텀 필터 추가

기존 방식

http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);

 

새로운 방식

http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);

 

차이점 설명

  • 커스텀 필터 추가 방식은 변경되지 않았습니다.

결론

Spring Security 6.4에서는 Lambda 표현식과 SecurityFilterChain 중심으로 보안 구성을 선언적으로 변경하는 것을 목표로 합니다. 새로운 방식은 기존 코드보다 더 간결하고 읽기 쉽습니다. 이러한 변경 사항은 최신 Java 스타일과 잘 맞으며, 확장성과 유지보수성을 크게 향상시킵니다.

728x90