
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf().disable();
return http.build();
}
Spring Security 코드를 작성하면서 CSRF 공격에 대비를 하지 않고 이를 비활성화시켜도 되는지에 대한 의문이 들었다. 이에 대해 잘 모른 채로 보안 코드를 작성하는 것은 옳지 않다고 생각되어서 CSRF 보안 코드를 왜 비활성화시키는지 찾아 정리해 보았다.
CSRF를 알아보기 앞서 쿠키와 세션에 대한 간단한 이해가 필요하다.
사용자가 특정 서버에 로그인하면 일반적으로 아래과 같은 작업들이 수행된다.
CSRF 공격을 시도하기 위해선 아래와 같은 몇 가지 조건이 필요하다.
위와 같은 조건이 만족되면 다음과 같은 과정을 통해 CSRF 공격이 수행된다.
이렇게 보안 수준을 향상시키는 CSRF 보안 코드를 disable 하는 이유가 뭘까? spring security documentation에는 non-browser clients 만을 위한 서비스라면 csrf를 disable 해도 좋다고 나와있다.

Spring Security 프레임워크는 기본적으로 CSRF 공격에 대한 방지를 수행한다.
이전에 많이 사용했던 MVC 구조는 세션과 쿠키를 통해 사용자 인증을 수행했기 때문에 CSRF 공격에 취약했다.
Stateful 한 서비스를 제공하기 위해 인증된 사용자 정보를 세션에 저장하고, 세션 ID가 쿠키에 저장되기 때문에 문제가 발생했던 것이다.
No cookies = No CSRF
브라우저에 저장되는 쿠키가 CSRF 공격의 매개체이기 때문에 쿠키가 없으면 CSRF 공격도 없다.
최근 많이 사용하는 REST API 방식은 세션 기반 인증과는 다르게 클라이언트가 권한이 필요한 요청을 하기 위해서는 요청에 필요한 인증 정보(OAuth2, JWT 토큰 등)를 포함시켜야 하는 stateless 의 특성을 갖고 있기 때문에 CSRF 공격에 대한 방어 설정을 비활성화해도 되는 것이다.
참고
https://junhyunny.github.io/information/security/spring-boot/spring-security/cross-site-reqeust-forgery/
https://velog.io/@woohobi/Spring-security-csrf%EB%9E%80