본문 바로가기

Spring Boot/Security

CSRF : enable(), disable()

Security 6.x 기준 CSRF는 기본적으로 enable() 상태이다

 

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain defaultChain(HttpSecurity http) throws Exception {
        http
                .csrf(csrf -> csrf.enable()) // 기본값, 메서드는 없음
                .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());

        return http.build();
    }

 

 

이걸 언제 disable()로 사용해야 하는가?

 

https://b1uffer.tistory.com/432

 

CSRF 예제에서

<form action="/transfer" method="post">

 

폼 요청이 브라우저 기반 요청임

이 요청은 CSRF 보호 대상이 된다

 

그래서 토큰 없이 요청하게 되면 403 Forbidden이 뜸

 

그리고 API를 보면

    @GetMapping("/transfer")
    public String transferForm(Model model, CsrfToken csrfToken) {
        model.addAttribute("_csrf", csrfToken);
        return "transfer";
    }

 

얘는 MVC 기반 요청으로, 데이터를 넘기는게 아니라 html을 보여주는 GET 요청이다

 

 

Security는 POST / PUT / PATCH / DELETE 와 같은 상태 변경 요청에 대해 CSRF를 검사하기 때문에,

  • form 로그인
  • 세션 기반 인증
  • 브라우저에서 쿠키를 자동으로 전송하는 경우

에는 절대로 csrf.disable() 메서드를 사용하면 안된다

 

오히려 위와 같은 상황에서는 .csrf 메서드를 아예 빼고 디폴트 상태로 사용하는게 좋다

 

 

 

그렇다면, 언제 csrf를 disable로 사용해야 하는가?

  • REST API
  • JWT 인증
  • 쿠키 기반 세션을 사용하지 않을 때

이 때는 꺼도 된다

Spring Security의 CSRF 예방은 쿠키 기반 인증 공격을 막는다

그런데 REST API와 JWT 인증의 경우

Authorization: Bearer ...

 

형태로, 쿠키를 쓰지 않기 때문에 애초에 CSRF 공격이 불가능하다. 그래서 꺼도 됨