← 목록으로

CSRF (Cross-Site Request Forgery): 원리와 방어

[Web] Web · 작성: 2026-07-19 19:15:17 · 조회 3

CSRF는 로그인된 사용자의 브라우저가, 사용자 본인도 모르게 다른 사이트를 열었을 때 공격자가 원하는 상태 변경 요청을 보내게 만드는 공격이다. XSS와 달리 스크립트 실행 권한이 없어도 되고, "브라우저가 쿠키를 자동으로 붙여서 요청을 보낸다"는 성질만 이용한다.

원리

피해자가 로그인된 상태로 은행 사이트를 쓰고 있다고 하자. 공격자가 만든 페이지에 이런 폼이 있으면:

<form action="https://bank.example.com/transfer" method="POST" id="f">
  <input type="hidden" name="to" value="attacker-account">
  <input type="hidden" name="amount" value="1000000">
</form>
<script>document.getElementById('f').submit();</script>

피해자가 이 페이지를 여는 순간 브라우저가 bank.example.com으로 요청을 보내면서 저장된 세션 쿠키를 자동으로 첨부한다. 서버 입장에서는 정상 로그인 사용자가 보낸 요청과 구분이 안 된다.

GET 요청만으로 상태가 바뀌는 엔드포인트(예: /delete?id=1)는 <img src="..."> 태그 하나로도 트리거된다.

탐지 방법

  1. 상태를 바꾸는 요청(POST/PUT/DELETE)에 CSRF 토큰이 있는지 확인
  2. 토큰이 있다면: 요청에서 토큰을 제거하거나 다른 세션의 토큰으로 바꿔서 보내도 요청이 성공하는지 확인 (검증을 제대로 안 하는 구현이 의외로 많다)
  3. SameSite 쿠키 속성 확인 (Strict/Lax/None) — 개발자 도구 Application 탭에서 확인 가능
  4. GET으로 상태 변경이 가능한 엔드포인트가 있는지 확인 (그 자체로 문제)

방어

Web 카테고리의 글 (3/11)

  1. SQL Injection: 원리, 탐지, 방어
  2. XSS (Cross-Site Scripting): Stored / Reflected / DOM 차이와 방어
  3. CSRF (Cross-Site Request Forgery): 원리와 방어
  4. IDOR / BOLA: 권한 검증이 빠졌을 때
  5. SSRF (Server-Side Request Forgery): 서버가 대신 요청하게 만들기
  6. 파일 업로드 취약점: 웹쉘로 이어지는 경로
  7. 안전하지 않은 역직렬화 (Insecure Deserialization)
  8. SSTI (Server-Side Template Injection): 원리와 탐지
  9. OS Command Injection: 원리와 필터 우회
  10. JWT 취약점: alg=none부터 알고리즘 컨퓨전까지
  11. Race Condition (TOCTOU) 취약점
← XSS (Cross-Site Scripting): Stored / Reflected / DOM 차이와 방어 IDOR / BOLA: 권한 검증이 빠졌을 때 →