안녕하세요
오늘은 스프링 시큐리티 Config 설정 중에서 만난 오류에 대해서 알아보려고 합니다.
csrf()' is deprecated since version 6.1 and marked for removal
위 오류는 Spring Security 에서 config 설정을 할 때 일어난 오류 입니다.
기존에 csrf 방어는 디폴트로 활성화가 되어 있지만, 공부를 하는 입장에서는 비활성화 상태로 하기 위해서
코드를 작성하다가 오류가 생겼습니다.
Deprecated 는 이제 과거 코드이고, 지원하지 않는다고 하여 Spring Security 문서를 보니
함수형으로 바꿔서 쓰라고 친절하게 예시 코드가 보여 주었습니다.
스프링6.0 이 출시되면서 스프링부트 또한 3.x 버전으로 업그레이드가 되었습니다.
스프링6.0 이전 버전의 경우는 스프링 시큐리티 5.x 버전을 사용하다
스프링6.0 이후 버전은 스프링 시큐리티6.x 버전을 지원합니다.
그러므로 위와 같은 문제가 발생하게 된 것이죠
Spring Security 에서 래퍼런스 문서입니다.
기존에는 위 처럼 메소드 체이닝 방식을 지원했지만. 이제는 사라졌고
현재는
위 처럼 기존의 메소드 체이닝이 아닌 함수형 방식을 사용하라고 합니다.
🔨 코드 예시
기존 코드 (Deprecated)
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.csrf().disable() // Deprecated
.authorizeHttpRequests(it -> { // 요청 설정
it.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
.permitAll() // static Resource 에 대해서는 모든 요청 허가
// swagger 는 인증 없이 통과
.requestMatchers(
SWAGGER.toArray(new String[0])
)
.permitAll()
// open-api 하위 모든 주소는 인증 없이 허용하겠다는 설정
.requestMatchers(
"/open-api/**"
)
.permitAll()
// 이 외에 모든 요청은 인증을 통과해야 한다.
.anyRequest().authenticated();
})
.formLogin(Customizer.withDefaults()); // 폼 로그인은 디폴트로 나오게한다.
return httpSecurity.build();
}
변경 코드(=전체코드)
@EnableWebSecurity // security 활성화
@Configuration
public class SecurityConfig {
// 스웨거 주소 리스트로 담아서 시큐리티에 넣기
private List<String> SWAGGER = List.of(
"/swagger-ui.html",
"/swagge-ui/**",
"/v3/api-docs/**"
);
// 예전에는 상속받아서 설정 하였음
// 이제는 Bean 으로 등록을 해서 사용할 수 있다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.csrf((csrf) -> csrf. disable())
.authorizeHttpRequests(it -> { // 요청 설정
it.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
.permitAll() // static Resource 에 대해서는 모든 요청 허가
// swagger 는 인증 없이 통과
.requestMatchers(
SWAGGER.toArray(new String[0])
)
.permitAll()
// open-api 하위 모든 주소는 인증 없이 허용하겠다는 설정
.requestMatchers(
"/open-api/**"
)
.permitAll()
// 이 외에 모든 요청은 인증을 통과해야 한다.
.anyRequest().authenticated();
})
.formLogin(Customizer.withDefaults()); // 폼 로그인은 디폴트로 나오게한다.
return httpSecurity.build();
}
}
✅ 결론
메소드 체이닝 방식을 지양하고, 함수형 방식을 지향 하는 코드로 변경이 됨
(기존에도 지원을 했지만, 메소드 체이닝 방식을 자주 사용했다고 함)
(그래서 이제 부터라도, 함수형 방식 으로만 쓸 수 있게끔 제한을 한것 같음)
csrf 뿐 만 아니라, 여러 메소드 들에서도 메소드 체이닝 방식을 없애고 함수형 방식을 지원한다고 합니다.
이미 잘만들어진 메소드는 함수형이나 메소드 참조 로 전달하는 방법이 제일 좋다고 생각을 합니다.
스프링6.0 -> 스프링 시큐리티 6.x 버전 사용
스프링6.0 이전 버전 -> 스프링 시큐리티 5.x 버전 사용
하지만 무긍무진한 발전가능성을 가진 스프링을 꾸준히 사용하기 위해서는 변화가 있을 때 마다 적용을 하며
사용자 또한 바뀔 필요가 있습니다
httpSecurity.csrf().disable() (❌)
httpSecurity.csrf((csrf) -> csrf. disable()) (👍)