Java & Spring

[Spring] POSTMAN에서의 알 수 없는 Forbidden(403)은 CSRF가 원인이었다

ju_young 2024. 1. 12. 20:30
728x90

문제

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

728x90