CSRF 보호
Cross-Site Request Forgery 공격 자동 방어
CSRF(Cross-Site Request Forgery)는 악성 사이트가 사용자의 브라우저를 이용해 다른 사이트에 위조 요청을 보내는 공격입니다.
Rails의 자동 방어:
1. <%= csrf_meta_tags %> — HTML <head>에 CSRF 토큰 삽입
2. form_with — 폼에 자동으로 authenticity_token hidden field 추가
3. protect_from_forgery with: :exception — 토큰 불일치 시 예외 발생
동작 원리:
서버가 세션에 CSRF 토큰 저장
모든 폼/AJAX 요청에 이 토큰 포함
서버가 요청의 토큰과 세션 토큰 비교
불일치 → 422 Unprocessable Entity
주의사항:
API 앱은
protect_from_forgery with: :null_session사용AJAX 요청은
X-CSRF-Token헤더로 전송Turbo는 자동으로 CSRF 토큰을 포함
핵심 포인트
ApplicationController에 protect_from_forgery 자동 설정 (Rails 기본)
csrf_meta_tags가 <head>에 토큰 삽입
form_with가 hidden authenticity_token 필드 자동 추가
서버가 POST/PATCH/DELETE 요청의 토큰 검증
토큰 불일치 시 ActionController::InvalidAuthenticityToken 예외
Turbo/Rails UJS가 AJAX 요청에 X-CSRF-Token 헤더 자동 추가
장점
- ✓ 자동 적용 — 개발자가 신경 쓸 것 없음
- ✓ form_with가 자동으로 토큰 삽입
- ✓ OWASP 권장 방어 기법
- ✓ Turbo와 자동 호환
단점
- ✗ API 앱에서는 비활성화 또는 조정 필요
- ✗ CORS 설정과 충돌 가능
- ✗ 세션 만료 시 토큰 불일치 에러
- ✗ 멀티 탭 사용 시 문제 가능