Web

CSRF

잔망루피 2022. 9. 15. 19:17
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

 

Cross Site Request Forgery (CSRF) :: Spring Security

When should you use CSRF protection? Our recommendation is to use CSRF protection for any request that could be processed by a browser by normal users. If you are only creating a service that is used by non-browser clients, you will likely want to disable

docs.spring.io

 

https://baessi.tistory.com/98

 

스프링 시큐리티 CSRF 적용하기[xml 설정]

오늘은 스프링 시큐리티에서 CSRF에 토큰 적용 방법에 대해 알아보도록 하겠습니다. 사용방법은 간단합니다. 저 같은 경우 JAVA 설정이 아닌 XML에서 스프링 시큐리티를 설정하였습니다. spring-contex

baessi.tistory.com

 

https://hyunsangwon93.tistory.com/28

 

Spring Boot CSRF AJAX 전송 방법

CSRF ? 사이트 간 요청 위조(또는 크로스 사이트 요청 위조, 영어: Cross-site request forgery, CSRF, XSRF)는 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행

hyunsangwon93.tistory.com

 

https://dev.to/ms_74/cross-site-request-forgery-attacks-csrf-what-a-frontend-developer-should-know-l5b

 

Cross-site Request Forgery Attacks (CSRF): What a frontend developer should know

After discussing about Cross Site Scripting Attacks (XSS) in the previous posts, I am going to...

dev.to

 

반응형

'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