Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- spring integration
- 역학
- write by chatGPT
- 인프라
- 리눅스
- python
- kotlin
- 코틀린
- 자바네트워크
- spring data jpa
- Database
- flet
- 소프트웨어공학
- 유닉스
- 고전역학
- 자바
- JVM
- 파이썬
- 데이터베이스
- write by GPT-4
- GPT-4's answer
- 웹 크롤링
- chatGPT's answer
- 시스템
- android
- Java
- oracle
- 자바암호
- NIO
- jpa
Archives
- Today
- Total
기억을 지배하는 기록
Spring Security 6.4 새로운 기능 본문
728x90
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. antMatchers
→ requestMatchers
기존 방식
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
'Spring.io' 카테고리의 다른 글
타임리프(Thymeleaf) 개발자 가이드 (0) | 2024.12.02 |
---|---|
Spring Data JPA - @Transactional (0) | 2024.11.26 |
Spring Data JPA - 분산 트랜잭션 (0) | 2024.11.26 |
Spring Data JPA - 특징 및 개발주의사항 (0) | 2024.11.26 |
Spring Data JPA - JpaRepository (0) | 2024.11.26 |
Comments