1. 결함의 본질

요청이 진짜 사용자의 의도인지 서버가 검증하지 않는 결함

→ 공격자 코드를 심는 게 아니라, 피해자의 인증된 세션을 빌려 정상 기능을 몰래 호출

XSS와의 결정적 차이: CSRF엔 악성 스크립트 X, XSS는 코드를 실행시키고, CSRF는 정상 요청을 위조

2. 공격 대상

서버(상태 변경): 서버에게 정상 로그인 사용자의 요청이라고 속여 송금/비번 변경/글 삭제 같은 상태 변경

(사용자 브라우저를 노리는 XSS와 대비)

3. 전제 조건

  • 쿠키 기반 인증: 브라우저가 요청 시 쿠키를 자동으로 실어 보냄
  • 상태 변경 기능: 호출당하면 뭔가 바뀌는 엔드포인트(송금/설정 변경 등)
  • 요청 출처 검증 부재: 서버가 ‘이 요청이 우리 사이트에서 온 건지’ 안 따짐

→ 핵심: 공격자는 쿠키 값을 몰라도 됨

4. 공격 경로

  • GET → <img>, <a> 한 줄로 끝
  • POST → 자동 제출되는 숨김 <form> 필요
  • JSON 바디 요구 → 난이도 ↑

5. 판별점

  • 이 요청이 상태를 바꾸나? (조회만 하면 CSRF 무의미)
  • 인증이 쿠키 자동전송에 의존하나?
  • CSRF 토큰/Origin 검증 같은 출처 확인이 없나?

→ 셋 다 예 → CSRF 가능

6. 방어

  • CSRF 토큰: 폼마다 예측 불가 토큰 심고 서버가 검증. 공격자는 이 값을 모름
  • SameSite 쿠키: 크로스 사이트 요청엔 쿠키를 안 싣게 함 (근본 차단에 가까움)
  • Origin/Referer 검증: 요청 출처 헤더 확인

→ 토큰이 효과적인 이유: 공격자가 요청은 위조해도 토큰 값은 못 넣음