김 컴퓨터


CSRF (Cross-Site Request Forgery) 기초

CSRF (사이트 간 요청 위조)는 사용자가 자신의 의지와 무관하게 공격자가 의도한 특정 행위(요청)를 웹사이트에 하도록 만드는 공격 기법입니다.

사용자의 인증된 상태(로그인된 상태)를 악용하여 무결성을 위협하는 것이 핵심입니다.


1. 작동 원리

CSRF 공격은 다음 세 가지 요소가 결합하여 발생합니다.

  1. 신뢰할 수 있는 사이트 (Victim Site): 사용자(피해자)가 현재 로그인되어 있어 인증 정보(세션 쿠키)가 브라우저에 저장되어 있는 은행이나 쇼핑몰 같은 웹사이트.
  2. 악성 사이트 (Attacker Site): 공격자가 심어 놓은 악성 코드가 포함된 사이트.
  3. 피해자 (Victim): 신뢰할 수 있는 사이트에 로그인되어 있는 상태에서 악성 사이트를 방문한 사용자.

공격 시나리오 예시

  1. 피해자가 은행 사이트에 로그인합니다. (브라우저에 세션 쿠키 저장)
  2. 피해자가 악성 사이트를 방문합니다.
  3. 악성 사이트에는 다음과 같은 숨겨진 코드가 있습니다. html <img src="[https://bank.com/transfer?to=attacker&amount=100000](https://bank.com/transfer?to=attacker&amount=100000)" style="display:none;">
  4. 브라우저는 이 <img> 태그를 로드하면서 자동으로 신뢰할 수 있는 사이트(bank.com)로 요청을 보냅니다.
  5. 이때 브라우저는 해당 사이트의 세션 쿠키를 첨부합니다.
  6. 은행 서버는 유효한 세션 쿠키를 보고 이 요청이 로그인된 사용자 본인의 정상적인 요청이라고 판단하여 이체를 실행합니다.

2. CSRF 방어 방법 (개발자 관점)

CSRF는 요청의 출처를 검증하여 방어할 수 있습니다.

  1. CSRF 토큰 사용 (CSRF Token):
    • 가장 표준적인 방법입니다. 서버가 세션을 생성할 때 일회용 무작위 토큰을 발급하고, 이 토큰을 숨겨진 폼(hidden input)에 넣어 클라이언트에게 보냅니다.
    • 클라이언트가 요청을 보낼 때 토큰을 함께 보내면, 서버는 세션에 저장된 토큰 값과 비교하여 요청의 유효성을 검증합니다.
  2. SameSite 쿠키 속성:
    • 쿠키 전송 규칙을 강화하여, 외부 도메인(악성 사이트)으로부터 오는 요청에는 쿠키가 자동으로 첨부되지 않도록 막습니다.
  3. Referer 검증:
    • HTTP 요청 헤더의 Referer 필드를 검사하여, 요청이 자신이 운영하는 도메인에서 온 것인지 확인합니다.