Backend/Spring
[Spring] Spring Boot 3.x SecurityConfig 설정 (Spring Security + OAuth2.0)
비전공자 기록광
2023. 12. 16. 19:37
반응형
업무를 하며 오랜만에 spring security를 다시 만지게 됐다.
신규 프로젝트라 내 마음대로 셋팅을 할 수 있어 기존 많이 쓰던 Java 11 + Spring Boot 2.x 대신 Java 17 + Spring Boot 3.x로 셋팅했다. 그리고 별생각 없이 SecurityConfig를 이전 방식대로 했다가 엄청난 에러 모음을 만났다.
올해 초에 스프링 시큐리티 관련 내용을 블로깅 했기에 업데이트된 버전도 같이 올렸다.
spring boot 2.x 에서 3.x 로 넘어가며 많은 기능들이 deprecated 됐다.
내가 이전에 작성했던 SecurityConfig은 이렇다.
@Configuration
@EnableWebSecurity
public class SecurityConfig { //WebSecurityConfigurerAdapter was deprecated
private final CustomOAuth2UserService customOAuth2UserService;
public SecurityConfig(CustomOAuth2UserService customOAuth2UserService) {
this.customOAuth2UserService = customOAuth2UserService;
}
@Bean
public BCryptPasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.formLogin().disable()
.httpBasic().disable()
.authorizeRequests()
.antMatchers("/api/user").permitAll()
.and()
.oauth2Login().userInfoEndpoint().userService(customOAuth2UserService);
return http.build();
}
}
아래가 새로운 설정이다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final CustomOAuth2UserService customOAuth2UserService;
public SecurityConfig(CustomOAuth2UserService customOAuth2UserService) {
this.customOAuth2UserService = customOAuth2UserService;
}
@Bean
public BCryptPasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement((sessionManagement) ->
sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.formLogin(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.authorizeHttpRequests((authorizeRequests) -> authorizeRequests
.requestMatchers(new MvcRequestMatcher(introspector, "/api/user")).permitAll()
)
.oauth2Login(oauth2Login ->
oauth2Login.userInfoEndpoint(userInfoEndpointConfig ->
userInfoEndpointConfig.userService(customOAuth2UserService)))
;
return http.build();
}
}
이전 버전과의 다른점으로 더 이상 .and( ) 가 필요 없다는 걸 한 눈에 볼 수 있다.
그리고 싹다 람다형식으로 바뀌었다.
관련 내용은 공식 문서에서 확인할 수 있는데
바뀐 이유에 대해서 말하자면〰️
1. 리턴 타입의 명확성
2. 일관성 문제
때문이라고 한다.
신규 프로젝트를 하며 혼자서 이것 저것 적용하고 있다.
restTemplate 대신 webClient도 사용하고..
JPA와 함께 JOOQ도 적용하고...
오랜만에 새로운 걸하니 재밌다. 다만 같이 봐주고 더 나은 방향으로 이끌어 줄 사람이 있었으면 하지만...
더 열쉬미해야지... 🤧
참고
반응형