728x90
CSRF(Cross-Site Request Forgery)란❓
CSRF (Cross-Site Request Forgery)는 웹 애플리케이션의 취약점을 악용하는 공격 방식 중 하나로, 사용자가 의도하지 않은 요청을 수행하게 만드는 공격입니다.
CSRF 공격의 목적은 사용자가 웹 애플리케이션에서 인증된 세션을 가지고 있는 상태에서, 공격자가 의도한 행동을 사용자로 하여금 실행하게 하는 것입니다.
이는 사용자가 현재 로그인한 세션을 이용하여 악의적인 요청이 서버에 전달되도록 하여, 사용자의 의도와 무관하게 데이터 변경, 거래 발생 등의 작업이 수행되게 만듭니다.
CSRF(Cross-Site Request Forgery)의 동작 원리
CSRF 공격이 성공하기 위해서는 아래의 조건을 충족해야 합니다.
CSRF 공격이 성공하기 위한 조건
사용자 인증
- 사용자가 공격 대상 웹사이트에 로그인하여 유효한 세션 쿠키를 가지고 있어야 합니다.
- 이 세션 쿠키는 공격자가 생성한 악성 요청에 포함되어 서버에서 인증된 요청으로 인식됩니다.
쿠키
- 쿠키 기반으로 서버 세션 정보를 획득할 수 있어야 합니다.
요청의 구조 이해
- 공격자는 서버가 어떤 URL 패턴과 요청 파라미터를 사용하는지 알고 있어야 합니다.
- 예를 들어, 사용자의 계좌에서 돈을 이체하는 요청이 POST /transfer 엔드포인트를 사용하고, amount와 recipient이라는 파라미터를 요구하는 경우, 공격자는 이 정보를 알고 있어야 합니다.
CSRF 공격
- 사용자가 서버에 로그인합니다.
- 사용자가 웹사이트에 로그인하면 서버는 세션 정보를 저장하고, 브라우저에 세션을 식별할 수 있는 세션 쿠키를 설정합니다.
- 이 세션 쿠키는 인증된 사용자를 식별하는 데 사용됩니다.
- 공격자는 인증된 브라우저 사용자가 악성 스크립트를 누르도록 유도합니다.
- 공격자는 사용자가 클릭하거나 방문하도록 유도할 악성 링크나 페이지를 준비합니다.
- 이 악성 링크나 페이지는 이메일, 소셜 미디어, 광고 배너 등 다양한 방법으로 배포될 수 있습니다.
- 사용자가 악성 페이지를 접속합니다.
- 사용자가 악성 페이지를 방문하면, 해당 페이지에 악성 스크립트나 코드가 포함되어 있어 사용자의 브라우저에서 의도하지 않은 HTTP 요청이 생성됩니다.
- 사용자가 접속한 악성 페이지에서 사용자가 의도하지 않은 악의적인 요청을 서버에 보냅니다.
- 악성 페이지에서 자바스크립트나 HTML 폼을 사용하여 사용자가 인증된 세션으로 요청을 서버에 전송합니다.
- 이 요청은 사용자의 세션 쿠키를 자동으로 포함하게 되어 서버에 인증된 요청으로 보이게 됩니다.
- 서버는 인증된 사용자의 요청으로 판단하고 악의적인 요청에 대한 응답을 합니다.
- 서버는 요청이 세션 쿠키와 함께 도착했기 때문에 이를 인증된 사용자로부터의 요청으로 간주하고 처리합니다.
- 이로 인해 사용자는 의도하지 않은 작업(예: 계좌 이체, 정보 변경 등)을 수행하게 됩니다.
CSRF(Cross-Site Request Forgery) 방지 방법
Referer 헤더 검증
- 서버는 요청의 Referer 헤더를 검사하여 요청의 출처를 확인합니다. 요청이 합법적인 출처에서 온 것인지 검증할 수 있습니다.
- 주의: Referer 헤더는 사용자가 브라우저의 보안 설정이나 프라이버시 도구를 통해 수정하거나 숨길 수 있기 때문에, 이 방법만으로 완전한 보안을
보장할 수는 없습니다.
CSRF 토큰 검증
- CSRF 토큰은 각 요청에 대해 고유한 CSRF토큰을 포함시키는 방법입니다. 이 토큰은 서버에서 생성되며, 클라이언트에서 요청할 때 함께 전송됩니다.
- 서버는 이 토큰을 검증하여 요청의 유효성을 확인합니다.
방법
<form action="/submit" method="POST">
<input type="hidden" name="csrf_token" value="generated_csrf_token_value">
<!-- 폼 필드들 -->
</form>
- 서버가 사용자에게 고유한 CSRF 토큰을 생성하고, 이 토큰을 세션에 저장합니다.
- 클라이언트 측에서 폼을 렌더링할 때 CSRF 토큰을 포함시킵니다.
- 클라이언트가 폼을 제출할 때 이 토큰을 서버로 전송합니다.
- 서버는 요청에 포함된 토큰과 세션에 저장된 토큰을 비교하여 요청의 유효성을 검증합니다.
SameSite 쿠키 속성 설정
SameSite 쿠키 속성을 설정하여 쿠키가 다른 사이트에서 보낸 요청에 포함되지 않도록 할 수 있습니다. 이를 통해 CSRF 공격을 방지할 수 있습니다.
- 값:
- SameSite=Strict: 쿠키는 같은 사이트에서만 전송됩니다.
- SameSite=Lax: 쿠키는 동일 사이트에서의 요청과 안전한 HTTP 메서드(GET 등)에서만 전송됩니다.
- SameSite=None: 쿠키는 모든 요청에서 전송됩니다. 하지만 이 경우 Secure 속성을 함께 설정해야 합니다.
'Security' 카테고리의 다른 글
[Security] XSS란 무엇일까❓ 정의부터 방어 기법까지 (0) | 2024.08.20 |
---|---|
[Security] 웹 보안의 필수 요소, CORS: 기본 개념부터 동작 원리까지 (0) | 2024.08.20 |