CSRF : 교차 사이트 요청 위조

사용자가 로그인한 상태에서 의도와 무관하게 악성 행위(게시글 삭제, 비밀번호 변경 등)를 강제로 수행하게 만드는 웹 보안 공격

스크린샷 2025-11-05 오전 11.38.46.png

<aside> 💡

피싱 사이트 접속 유도는 개시글 방문이나 메일 등등 여러 방법으로 유도할수 있다.

</aside>

방어 방법

Referer check (리퍼러 체크)

**HTTP 요청 헤더(request header) 정보에서 Referrer 정보를 확인할 수 있다**
- (Referer 헤더는 HTTP 요청이 발생한 출발지 웹 페이지의 URL을 담고있다)

**사용자가 taetae.com 에서 /count 경로에 접속 할때 서버로 전송되는 요청의 헤더에는 다음과 같은 정보가 포함된다.**
- Host = taetae.com
- Referer = taetae.com/count 

**하지만 공격자의 웹 사이트 xxx.com 에서 /count 에 접근 하게 되면**
- Host = taetae.com
- Referer = xxx.com/count 
	
**서버는 Host(taetae.com)와 Referer(xxx.com)의 도메인이 서로 다르다는 것을 확인한다.**

	서버 도메인 이름과 **Referer의 도메인이 일치하는 것을 확인하고, 정상적인 요청으로 판단하여 처리를 
	진행한다.

	따라서 서버는 이 요청을 외부에서 들어온 비정상적인 요청 (CSRF 공격)으로 판단하고 차단하게 된다.**

CSRF 토큰사용 (세션 기반)

**사용자가 페이지를 방문할때나 로그인 한 경우 CSRF 토큰을 생성해 서버 세션에 저장한다.

이후 사용자가 요청한 페이지의 HTML 코드를 서버에서 생성할 때 쿠키나, 헤더에 저장된 세션 아이디를 통해 서버
세션에 저장한 CSRF토큰 값을 읽어와 HTML 폼 내부의 숨겨진 필드(<input type="hidden">)에 삽입 후 페이지를 반환 한다.** 
- 공격자 서버에서 구성되는 페이지는 저장된 CSRF 토큰을 알수 없기 때문에 HTML 폼에 토큰을 삽입할수 없다.

**서버는 요청에서 온 토큰과 세션에 저장되어 있는 토큰을 비교 한다

정상적인 출처에서 온 경우 요청을 처리 한다.

만약 불일치 한 경우 요청을 차단한다.**

<aside> 💡

Spring Security 의 CSRF 보호 ****기본 방식이다

</aside>

Double Submit Cookie (무상태)

**사용자가 페이지를 방문할때나 로그인 한 경우 CSRF 토큰을 생성해 쿠키에 담아 클라이언트에 전송한다.

이후 사용자가 요청을 보낼때 쿠키에 저장된 CSRF 토큰의 정보를 요청 데이터에 수동으로 삽입 한다.
-** 이때 xxx.com에서 taetae.com에 설정된 쿠키를 읽을수 없기 때문에 토큰의 정보를 요청 데이터에 
	수동으로 삽입할수 없다.(Same-Origin Policy)

**서버는 쿠키에 담긴 CSRF 토큰과 데이터 정보에 담긴 CSRF 토큰 두개를 획득 한다.

이 두개의 CSRF 토큰이 일치 하는지 확인한다

정상적인 출처에서 온 경우 요청을 처리 한다.

만약 불일치 한 경우 요청을 차단한다.**

<aside> 💡

JWT 방식과 어울리는 방어 방법이다.

</aside>