CSRF(Cross-Site Request Forgery)는 인증된 사용자를 속여 의도하지 않은 요청을 실행하게 하는 공격이다. 사용자가 이미 로그인된 상태를 악용한다.
공격 원리
1. Alice가 bank.com에 로그인 (세션 쿠키 발급)
2. Alice가 공격자 사이트 방문
3. 공격자 사이트에 숨겨진 폼:
<img src="https://bank.com/transfer?to=attacker&amount=1000000">
4. 브라우저가 자동으로 bank.com 쿠키와 함께 요청 전송
5. 은행 서버가 Alice의 요청으로 인식 → 이체 실행
방어 방법
CSRF 토큰
html
<!-- 서버가 숨겨진 토큰 삽입 -->
<form action="/transfer" method="POST">
<input type="hidden" name="csrf_token" value="랜덤한_토큰">
<input type="number" name="amount">
<button type="submit">이체</button>
</form>
<!-- 공격자는 토큰을 알 수 없으므로 위조 불가 -->
Set-Cookie: session=abc; SameSite=Strict; Secure
SameSite=Strict: 동일 사이트 요청에만 쿠키 전송
SameSite=Lax: 안전한 메서드에서는 허용
Referer 검증
python
if request.headers.get('Referer', '') != 'https://example.com':
abort(403)
CSRF vs XSS
| 항목 | XSS | CSRF |
|---|
| 공격 대상 | 브라우저에서 스크립트 실행 | 서버에 위조 요청 전송 |
| 필요 조건 | 취약한 페이지 | 인증된 사용자 세션 |
관련 개념
- •XSS — 유사한 웹 공격
- •JWT — CSRF에 덜 취약한 토큰 기반 인증
- •OWASP — CSRF는 OWASP Top 10에 포함
참고문헌
- •OWASP — CSRF Prevention Cheat Sheet