기억을 지배하는 기록

Spring Security 6.4 새로운 기능 본문

Spring.io

Spring Security 6.4 새로운 기능

Andrew's Akashic Records 2024. 12. 3. 17:14
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
Comments