🛡️

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 토큰을 포함

핵심 포인트

1

ApplicationController에 protect_from_forgery 자동 설정 (Rails 기본)

2

csrf_meta_tags가 <head>에 토큰 삽입

3

form_with가 hidden authenticity_token 필드 자동 추가

4

서버가 POST/PATCH/DELETE 요청의 토큰 검증

5

토큰 불일치 시 ActionController::InvalidAuthenticityToken 예외

6

Turbo/Rails UJS가 AJAX 요청에 X-CSRF-Token 헤더 자동 추가

장점

  • 자동 적용 — 개발자가 신경 쓸 것 없음
  • form_with가 자동으로 토큰 삽입
  • OWASP 권장 방어 기법
  • Turbo와 자동 호환

단점

  • API 앱에서는 비활성화 또는 조정 필요
  • CORS 설정과 충돌 가능
  • 세션 만료 시 토큰 불일치 에러
  • 멀티 탭 사용 시 문제 가능

사용 사례

모든 Rails 웹 애플리케이션 폼 제출 보호 AJAX 요청 보호 API와 웹의 인증 분리