문제
Spring Security에 scrf를 추가해주고 POSTMAN에서 request를 보내면 다음과 같이 forbidden이 발생한다.
원인 파악
SecurityFilterChain
에 csrf를 추가해주면 CsrfFilter
라는 놈을 거치게된다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
// ...
.csrf(Customizer.withDefaults());
return http.build();
}
}
CsrfFilter
코드를 보면 tokenRepository(default는 HttpSessionCsrfTokenRepository)에서 서버에서 저장한 csrf token을 가져오고 request header에서도 X-XSRF-TOKEN
(csrfToken.getHeaderName) 값을 가져온다.
CsrfToken csrfToken = this.tokenRepository.loadToken(request);
...
String actualToken = request.getHeader(csrfToken.getHeaderName());
즉, POSTMAN에서 request를 할 때 header에 X-XSRF-TOKEN
를 지정해주어야한다는 것이다. 지정해주지않으면 위처럼 forbidden(403) 에러가 발생한다.
해결
POSTMAN에서 두 가지를 입력해주면 된다.
HEADER 추가
Tests script
var xsrfCookie = postman.getResponseCookie("XSRF-TOKEN");
postman.setEnvironmentVariable("xsrf-token", xsrfCookie.value);
[reference]
https://www.baeldung.com/postman-send-csrf-token
https://docs.spring.io/spring-security/reference/servlet/exploits/csrf.html#csrf-integration