[Security] 시큐리티 6.1.0 csrf()' is deprecated since version 6.1 and marked for removal

728x90

안녕하세요 

오늘은 스프링 시큐리티 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()) (👍)

 

728x90