An expected CSRF token cannot be found
웹 어플리케이션이 요청을 보낼 때 필요한 CSRF 토큰이 요청에서 빠졌을 때 나타나는 에러 메시지다.
CSRF는 웹사이트에서 인증되지 않은 행위를 취하는 비정상적인 행위를 가능하게 하는 보안 취약점이다.
이 취약점을 막기 위해 웹사이트는 요청에 포함된 unique한 토큰을 필요로 한다.
토큰이 빠지거나 매치되지 않는다면 요청은 거절된다.
기본적인 인증을 사용하는 어플리케이션은 CSRF 공격에 취약하다.
Spring Security 4.0부터 CSRF 보호는 XML configuration에서 기본적으로 활성화 되어있다.
Spring은 CSRF 공격을 막기위해 Synchronizer Token Pattern, 세션 쿠키에 SameSite 속성 지정이 있다.
이 두 방법은 안전한 HTTP 메소드가 동일해야 한다.
즉, HTTP 메서드가 GET, HEAD, OPTIONS 및 TRACE인 요청은 어플리케이션 상태를 변경하지 않아야 한다.
1. Synchronizer Token Pattern
HTTP 요청에 보안 랜덤 값을 가진 _csrf 파라미터를 포함한다.
해커 웹사이트는 정확한 _csrf 파라미터 값을 알 수 없다.
2. SameSite Attribute
서버는 cookie를 설정할 때 SameSite 속성을 지정할 수 있다.
반드시, 브라우저가 SameSite 속성을 지원해야 한다.
대부분의 현대 브라우저들은 SameSite 속성을 지원한다.
Spring Security는 세션 쿠키의 생성을 직접 제어하지 않는다.
따라서, SameSite 속성을 지원하지 않는다.
Spring Session은 servlet 기반 어플리케이션에서 SameSite 속성을 지원한다.
Spring Framework's CookieWebSessionIdResolver는 WebFlux 기반 어플리케이션에서 SameSite 속성을 지원한다.
SameSite 속성을 가진 HTTP response header는 다음과 같다.
Set-Cookie: JSESSIONID=randomid; Domain=bank.example.com; Secure; HttpOnly; SameSite=Lax
SameSite 속성의 값은 Strict, Lax가 있다.
Strict | same-site에 지정한 어떤 요청이 올때 cookie를 포함할 것이다. cookie는 HTTP 요청에 포함되어 있지 않다. 강력한 방어를 하지만 사용자를 혼란스럽게 할 수 있다. |
Lax | 지정된 쿠키는 동일한 사이트에서 오거나 요청이 최상위 탐색에서 오고 메서드가 동일할 때 전송된다. 그렇지 않으면 쿠키는 HTTP 요청에 포함되지 않는다. |
🌿 프런트엔드에서의 CSRF
<meta name="_csrf" th:content="${_csrf.token}"/>
<meta name="_csrf_header" th:content="${_csrf.headerName}"/>
head에 추가
beforeSend : function(xhr){
xhr.setRequestHeader(header, token);
}
AJAX로 요청을 보낼 때 Custom Request Header를 설정
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
form으로 요청을 보낼 때 Hidden input field 설정
참고 👇
https://docs.spring.io/spring-security/reference/features/exploits/csrf.html
https://hyunsangwon93.tistory.com/28
'Web' 카테고리의 다른 글
JWT (0) | 2022.12.09 |
---|---|
CORS (0) | 2022.10.07 |
[Error] Request method 'DELETE' not supported (0) | 2022.06.04 |
get과 post 차이 (0) | 2022.02.18 |
URL과 URI (0) | 2021.09.13 |