CSRF(Cross-Site Request Forgery) 공격은 인증된 사용자를 속여 의도하지 않은 동작을 실행하게 하는 웹 보안 위협이다. 공격자가 악의적인 요청을 구성하고 사용자의 세션 쿠키를 이용해 서버를 속이는 4단계 메커니즘과 효과적인 방어 전략을 설명한다.
핵심 포인트- CSRF는 사용자의 인증된 세션을 악용해 서버가 공격자의 요청을 정상 사용자 요청으로 처리하게 만든다.
- 공격자는 img src 태그나 자동 제출 폼으로 피해자가 모르는 사이에 서버 요청을 트리거한다.
- Anti-CSRF 토큰은 각 세션마다 고유하고 예측 불가능한 값을 생성해 요청 출처를 검증한다.
- SameSite 쿠키 속성, Referer 헤더 검증, HTTP 메서드 규율을 조합해 다층 방어를 구성한다.
- GET 요청은 데이터 조회에만, POST는 상태 변경에만 사용하는 메서드 규율이 공격 표면을 줄인다.
상세 정리- 공격 전제조건: 피해자가 대상 사이트에 로그인해 세션 쿠키가 브라우저에 저장된 상태여야 한다. 공격자는 피해자를 악의적 페이지로 유도한다.
- 1단계 (취약점 발견): 공격자가 예측 가능한 URL 패턴으로 중요 동작을 수행하는 엔드포인트를 찾는다.
- 2단계 (요청 구성): bank.com/transfer?amount=1000&toAccount=attackerAccount 같은 요청을 만든다.
- 3단계 (사용자 기만): img src 태그나 자동 제출 폼을 악성 페이지에 숨겨 피해자가 방문하면 자동으로 트리거된다.
- 4단계 (실행): 브라우저가 피해자의 세션 쿠키를 자동으로 포함해 전송하므로 서버는 정상 요청으로 처리한다.
- Anti-CSRF 토큰 방어: 서버가 세션별 고유 토큰을 생성해 폼에 숨겨 전달한다. 요청 시 토큰이 일치해야만 처리한다. 공격자는 토큰 값을 알 수 없다.
- SameSite 쿠키 방어: Strict 또는 Lax 모드 설정으로 크로스-사이트 요청에서 쿠키 전송을 차단한다.
- Referer 헤더 검증: 요청의 Referer 헤더를 확인해 신뢰할 수 있는 출처에서만 처리한다. 단, 헤더 누락이나 위조 가능성이 있어 단독 방어로는 부족하다.
- HTTP 메서드 규율: GET은 데이터 조회에만 사용해야 한다. 상태를 변경하는 작업은 POST, PUT, DELETE로 처리해야 URL 링크 하나로 공격하기 어렵다.
왜 읽나- 웹 애플리케이션의 CSRF 취약점을 이해하고 Anti-CSRF 토큰, SameSite 쿠키, 메서드 규율을 조합한 방어 레이어를 구현하려는 백엔드와 풀스택 개발자에게 유용하다.