CSRF (Cross-Site Request Forgery) 기초
CSRF (사이트 간 요청 위조)는 사용자가 자신의 의지와 무관하게 공격자가 의도한 특정 행위(요청)를 웹사이트에 하도록 만드는 공격 기법입니다.
사용자의 인증된 상태(로그인된 상태)를 악용하여 무결성을 위협하는 것이 핵심입니다.
1. 작동 원리
CSRF 공격은 다음 세 가지 요소가 결합하여 발생합니다.
- 신뢰할 수 있는 사이트 (Victim Site): 사용자(피해자)가 현재 로그인되어 있어 인증 정보(세션 쿠키)가 브라우저에 저장되어 있는 은행이나 쇼핑몰 같은 웹사이트.
- 악성 사이트 (Attacker Site): 공격자가 심어 놓은 악성 코드가 포함된 사이트.
- 피해자 (Victim): 신뢰할 수 있는 사이트에 로그인되어 있는 상태에서 악성 사이트를 방문한 사용자.
공격 시나리오 예시
- 피해자가 은행 사이트에 로그인합니다. (브라우저에 세션 쿠키 저장)
- 피해자가 악성 사이트를 방문합니다.
- 악성 사이트에는 다음과 같은 숨겨진 코드가 있습니다.
html <img src="[https://bank.com/transfer?to=attacker&amount=100000](https://bank.com/transfer?to=attacker&amount=100000)" style="display:none;"> - 브라우저는 이
<img>태그를 로드하면서 자동으로 신뢰할 수 있는 사이트(bank.com)로 요청을 보냅니다. - 이때 브라우저는 해당 사이트의 세션 쿠키를 첨부합니다.
- 은행 서버는 유효한 세션 쿠키를 보고 이 요청이 로그인된 사용자 본인의 정상적인 요청이라고 판단하여 이체를 실행합니다.
2. CSRF 방어 방법 (개발자 관점)
CSRF는 요청의 출처를 검증하여 방어할 수 있습니다.
- CSRF 토큰 사용 (CSRF Token):
- 가장 표준적인 방법입니다. 서버가 세션을 생성할 때 일회용 무작위 토큰을 발급하고, 이 토큰을 숨겨진 폼(
hidden input)에 넣어 클라이언트에게 보냅니다. - 클라이언트가 요청을 보낼 때 토큰을 함께 보내면, 서버는 세션에 저장된 토큰 값과 비교하여 요청의 유효성을 검증합니다.
- 가장 표준적인 방법입니다. 서버가 세션을 생성할 때 일회용 무작위 토큰을 발급하고, 이 토큰을 숨겨진 폼(
- SameSite 쿠키 속성:
- 쿠키 전송 규칙을 강화하여, 외부 도메인(악성 사이트)으로부터 오는 요청에는 쿠키가 자동으로 첨부되지 않도록 막습니다.
- Referer 검증:
- HTTP 요청 헤더의
Referer필드를 검사하여, 요청이 자신이 운영하는 도메인에서 온 것인지 확인합니다.
- HTTP 요청 헤더의