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 검증: 요청 출처 헤더 확인
→ 토큰이 효과적인 이유: 공격자가 요청은 위조해도 토큰 값은 못 넣음