IT 개발 라이프/CS

CSRF(Cross-Site Request Forgery)

10Biliion 2025. 1. 10. 09:29

 

1. CSRF란 무엇인가?

CSRF(Cross-Site Request Forgery)는 웹 보안 공격의 한 유형으로, 공격자가 인증된 사용자의 권한을 도용하여 사용자의 의지와는 무관하게 특정 요청을 서버로 보내도록 유도하는 방식입니다. 이를 통해 공격자는 피해자의 계정으로 악의적인 행동(데이터 삭제, 권한 변경, 거래 요청 등)을 수행할 수 있습니다.

예시)

  1. 사용자가 A 사이트에 로그인하여 인증 쿠키를 보유하고 있습니다.
  2. 공격자는 악성 웹 페이지를 생성하여 사용자가 이 페이지를 방문하도록 유도합니다.
  3. 사용자가 페이지를 방문하면, 공격자의 페이지에서 A 사이트로 악의적인 요청을 보냅니다.
  4. 브라우저는 사용자가 이미 인증된 세션을 보유하고 있기 때문에, 해당 요청은 인증된 사용자로 간주되어 처리됩니다.

2. CSRF의 작동 원리

CSRF 공격은 주로 웹 브라우저가 동일 출처 정책(Same-Origin Policy)을 따르면서도 인증된 요청을 자동으로 전송하는 특성을 악용합니다. 주요 특징은 다음과 같습니다:

  • 브라우저는 쿠키와 같은 인증 정보를 사용자가 직접 제공하지 않아도 자동으로 요청과 함께 전송합니다.
  • 공격자는 사용자의 브라우저를 이용하여 피해자 대신 요청을 보냅니다.

주요 조건

  • 피해자는 공격자가 노린 웹 사이트에 이미 로그인 상태여야 합니다.
  • 피해자는 악성 링크나 스크립트를 실행하도록 유도되어야 합니다.

3. CSRF 공격의 피해

CSRF 공격은 피해자와 서버 간의 신뢰를 악용하여 다양한 악영향을 끼칠 수 있습니다. 예를 들어:

  • 데이터 손실: 사용자의 데이터를 삭제하거나 수정할 수 있습니다.
  • 권한 변경: 사용자의 계정을 공격자 계정으로 전환하거나 권한을 상승시킬 수 있습니다.
  • 금전적 손실: 온라인 거래 시스템에서 송금 요청을 위조할 수 있습니다.

4. CSRF 방지 방법

4.1 CSRF Token 사용

CSRF Token은 서버가 클라이언트에게 고유의 토큰을 발급하여 요청 시 검증하는 방식입니다. CSRF Token은 다음과 같은 특징을 가집니다:

  1. 고유성: 각 사용자의 세션에 대해 고유한 토큰을 생성합니다.
  2. 검증: 서버는 요청 시 토큰의 유효성을 확인합니다.
  3. 보호: 토큰이 없거나 잘못된 경우 요청을 차단합니다.

구현 방법

  1. 서버가 HTML 폼에 CSRF Token을 추가합니다:
  2. <input type="hidden" name="csrf_token" value="{csrf_token}">
  3. 서버는 요청에서 받은 CSRF Token을 검증합니다:
  4. if (!requestToken.equals(sessionToken)) { throw new SecurityException("CSRF Token mismatch"); }

4.2 SameSite Cookie 설정

SameSite Cookie 속성을 사용하면 브라우저가 크로스 사이트에서 쿠키를 전송하지 않도록 제한할 수 있습니다.

  • Strict 모드: 동일 출처에서만 쿠키를 전송합니다.
  • Lax 모드: 일부 안전한 요청(GET 메서드 등)에만 쿠키를 전송합니다.

설정 방법

Set-Cookie: sessionid=abc123; SameSite=Strict; Secure

4.3 CORS 정책 강화

CORS(Cross-Origin Resource Sharing) 설정을 통해 신뢰할 수 있는 도메인에서만 요청을 허용하도록 제한합니다.

@CrossOrigin(origins = "https://trusted-domain.com")