반응형

**CSRF(Cross-Site Request Forgery)**를 실무 관점에서 정리해줄게.
역시 원리 → 예시 → 공격 목표 → WAF/개발 방어까지 포함했어.


🔥 1. CSRF(Cross-Site Request Forgery) 개념

정의:
CSRF는 사용자가 로그인한 상태를 이용해, 공격자가 몰래 의도하지 않은 요청을 서버에 보내도록 하는 공격이야.

쉽게 말하면:

  • 사용자는 정상적으로 사이트에 로그인 되어 있음
  • 공격자는 사용자가 모르는 사이 권한 있는 요청을 서버에 보내게 함
  • 공격자는 서버가 요청을 정상 사용자로 인식하게 만듦

🔹 2. CSRF 공격 원리

 
[사용자 브라우저] 로그인 상태 유지 → [악성 사이트 방문][자동 전송된 요청][타겟 서버에서 실행]
  • 로그인 쿠키나 세션 토큰을 사용
  • 사용자가 버튼 클릭 안 해도 요청 발생 가능

예:

  • 사용자가 은행 로그인 상태로 공격자 페이지 방문 → 몰래 송금 요청 전송

🔹 3. CSRF 공격 예시

1) HTML Form 자동 전송

 
<form action="https://bank.com/transfer" method="POST" id="csrfForm"> <input type="hidden" name="amount" value="1000"> <input type="hidden" name="toAccount" value="attacker"> </form> <script> document.getElementById('csrfForm').submit(); </script>

2) Image 태그 요청 방식(GET)

3) Link 클릭 유도

➡️ 사용자는 아무런 의심 없이 클릭하거나 방문만 해도 서버에서 요청 실행


🔹 4. 공격 목표

  • 계정 권한을 이용한 송금, 포인트 이동
  • 비밀번호 변경
  • 개인정보 수정
  • 관리자 권한 악용

🔹 5. WAF / 보안관제 대응

  1. CSRF 토큰 검증
  • 요청 시 서버가 랜덤 토큰 발급
  • 모든 상태 변경 요청에 토큰 포함
  • 공격자가 토큰 모르면 요청 거부
  1. Referer / Origin 체크
  • 요청 헤더의 출처 검증
  • 외부 사이트에서 오는 요청 차단
  1. SameSite Cookie
  • SameSite=Lax|Strict 설정
  • 외부 사이트에서 쿠키 자동 전송 방지
  1. WAF 탐지
  • 상태 변경 요청 POST/PUT/DELETE 패턴 감시
  • 외부 출처 Referer 없는 요청 탐지
  • 반복 공격 IP 차단

🔹 6. 개발 단계 방어

  • CSRF Token 사용: 각 세션별 랜덤 값
  • Hidden Form + Token 검증
  • GET 요청은 상태 변경 금지
  • SPA / API: CORS + 토큰 기반 인증
 
# Flask CSRF 예시 from flask_wtf.csrf import CSRFProtect csrf = CSRFProtect(app)

🎯 한 문장 요약

CSRF = 공격자가 사용자의 로그인 세션을 이용해 사용자가 의도하지 않은 요청을 서버로 보내게 만드는 공격이며, CSRF 토큰, Referer 체크, SameSite 쿠키 설정으로 방어 가능하다.

반응형

+ Recent posts