내 서비스를 지키는 3중 방어막: CSRF 방어 기술 총정리

보안은 단일 장벽이 아닌 ‘다중 방어(Defense in Depth)’가 핵심입니다. 특히 사용자의 권한을 도용하는 CSRF 공격을 막기 위해서는 브라우저, 서버, 그리고 세션 관리 차원에서의 복합적인 대응이 필요합니다.

목차

  1. 브라우저의 첫 번째 방어선: SameSite 쿠키

  2. 가장 확실한 신분증: CSRF 토큰 (CSRF Token)

  3. 요청의 출처를 묻다: Origin 및 Referer 검증

  4. 보안 시너지: 언제 무엇을 써야 할까?

  5. 요약 및 결론


1. 브라우저의 첫 번째 방어선: SameSite 쿠키

SameSite는 쿠키의 속성 중 하나로, 다른 사이트에서 발생한 요청에 쿠키를 포함할지 여부를 브라우저가 결정하게 합니다.

  • 동작 원리: CSRF 공격은 브라우저가 쿠키를 자동으로 전송한다는 점을 악용합니다. SameSite 설정을 통해 이 자동 전송을 제어할 수 있습니다.

  • 세 가지 설정값:

    • Strict: 동일한 도메인에서 발생한 요청에만 쿠키를 보냅니다. 가장 안전하지만 사용자 편의성(다른 사이트 링크 클릭 시 로그인 풀림 등)이 낮아질 수 있습니다.

    • Lax (현재 크롬 등 주요 브라우저의 기본값): 대체로 안전합니다. ‘안전한’ 요청(GET 방식의 링크 클릭 등)에만 쿠키를 허용합니다.

    • None: 모든 요청에 쿠키를 보냅니다. 반드시 Secure 속성(HTTPS)과 함께 사용해야 합니다.


2. 가장 확실한 신분증: CSRF 토큰 (CSRF Token)

서버와 클라이언트가 ‘비밀 암호’를 공유하는 방식입니다.

  • 동작 원리:

    1. 사용자가 로그인하거나 폼(Form)을 요청할 때, 서버는 임의의 난수 토큰을 생성하여 사용자의 세션에 저장하고 클라이언트에게 전달합니다.

    2. 클라이언트는 데이터 수정 요청(POST, PUT 등)을 보낼 때 이 토큰을 HTTP 헤더나 파라미터에 포함합니다.

    3. 서버는 요청에 포함된 토큰과 세션에 저장된 토큰이 일치하는지 확인합니다.

  • 핵심: 공격자는 사용자의 쿠키는 가질 수 있을지 몰라도, 서버가 발행한 고유한 토큰값은 알 수 없으므로 요청을 위조할 수 없습니다.


3. 요청의 출처를 묻다: Origin 및 Referer 검증

서버가 요청을 받았을 때, “이 요청이 정말 우리 사이트에서 보낸 것이 맞는가?”를 HTTP 헤더 정보를 통해 확인하는 방법입니다.

  • Origin 헤더: 요청이 시작된 도메인(프로토콜, 호스트, 포트) 정보를 담고 있습니다. (예: https://ci2u.com)

  • Referer 헤더: 요청이 발생하기 직전의 페이지 URL 정보를 담고 있습니다. (어떤 페이지를 거쳐 왔는가?)

  • 검증 방법: 서버 측 미들웨어에서 request.headers['origin'] 값을 확인하여, 허용된 우리 서비스의 도메인이 아니면 요청을 즉시 차단(403 Forbidden)합니다.

  • 특징: 구현이 매우 간단하여 1차적인 방어선으로 훌륭합니다.


4. 보안 시너지: 언제 무엇을 써야 할까?

어느 하나만 선택하는 것이 아니라, 상황에 맞게 조합하는 것이 베스트 프랙티스입니다.

방어 기법 권장 사용 상황 특징
SameSite 모든 웹 서비스 기본 설정 브라우저 수준에서 자동으로 차단하여 매우 효율적임
CSRF 토큰 결제, 개인정보 변경 등 중요한 요청 구현은 복잡하지만 가장 강력한 보안 제공
Origin 검증 API 서버 보안의 기본 구현이 쉽고 모든 POST 요청에 대해 일괄 적용 가능

5. 결론: 요약 및 제언

내 서비스를 지키는 3중 방어막: CSRF 방어 기술 총정리

웹 보안은 공격자보다 한 발 앞서 나가는 준비성에서 시작됩니다.

  1. 쿠키 관리: 모든 중요한 쿠키에 SameSite=Lax 이상을 적용하십시오.

  2. 데이터 무결성: 상태를 변경하는 모든 요청에는 CSRF 토큰을 필수로 사용하십시오.

  3. 로그 확인: 서버 측에서 Origin 검증을 통해 수상한 출처의 요청을 필터링하십시오.

[함께 읽어볼 만한 주제]

  • JWT(JSON Web Token) 환경에서의 CSRF 방어 전략

  • 세션 기반 인증 vs 토큰 기반 인증의 보안성 비교

  • 보안 헤더(HSTS, X-Frame-Options) 설정으로 웹사이트 강화하기


전문가 코멘트: 보안은 ‘창과 방패의 싸움’입니다. SameSite가 기본값이 된 요즘에도 교묘한 우회 공격은 존재합니다. 따라서 CSRF 토큰과 같은 서버 측 검증을 반드시 병행하시길 권장합니다.