티스토리 뷰

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
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크