CSRF란?
Cross-Site Request Forgery의 약자로, 사이트 간 요청 위조를 의미한다.
인증된 사용자가 자신의 의지와는 무관하게 웹 애플리케이션에 공격자가 의도한 특정 요청을 보내도록 유도하는 것으로,
제품 구입, 자금 이체, 비밀번호 변경, 기록 삭제 등의 요청을 악의적으로 보내는 것을 말한다.
CSRF 공격이 가능한 이유는 웹 브라우저가 사용자가 인증한 상태를 유지하기 때문이다.
공격자는 사용자가 인증된 상태를 악용해 공격자가 의도한 행위를 하도록 유도한다. 이러한 공격자가 유도한 요청들은 사용자가 직접 전송한 것이 아니기 때문에 사용자는 이를 인지하지 못할 수 있다.
초등학생 수준으로 설명을 하자면,
CSRF는 공격자가 사용자 대신 몰래 웹 사이트에 요청하는 공격으로, 마치 사용자가 한 것처럼 속여서 무언가를 하게 만든다.
작동 원리는,
사용자가 게임 사이트를 이용중이라고 가정해보자.
CSRF와 XSS?
XSS가 사용자가 특정 사이트를 신뢰하기 때문에 발생하는 취약점이라면, CSRF는 특정 사이트가 사용자를 신뢰하기 때문에 발생하는 취약점이다.
쉽게 설명하면, 공격자가 웹 사이트 몰래 장난 코드를 숨겨놓고, 다른 사람이 그걸 보게 만들면 코드가 실행되는 공격이다. 게시판에 장난 버튼을 숨겨놓은 거랑 비슷하다.
XSS는 클라이언트의 브라우저에서 발생하고, CSRF는 서버에서 발생한다.
XSS는 사용자의 쿠키를 탈취할 수 있고, CSRF는 서버로부터 권한을 탈취할 수 있는 문제이다.
공격 예시를 간단히 예로 들자면,
XSS
<좀 더 쉬운 예시>
CSRF
<좀 더 쉬운 예시>
여기서 CSRF와 XSS를 명확히 구분하는 방법은, CSRF에는 특정 발생 조건이 존재한다.
💡XSS와 CSRF 차이
| 구분 | CSRF | XSS |
|---|---|---|
| 공격 대상 | 서버 (사용자의 인증을 이용해 요청) | 사용자 브라우저 (스크립트를 실행 시킴) |
| 공격 목적 | 사용자의 세션으로 서버 상태 변경 | 사용자 정보 탈취, UI 조작 등 |
| 공격 방식 | 요청을 위조해 서버를 속임 | 악성 스크립트를 삽입하여 사용자 브라우저에서 실행 |
| 전제 조건 | 사용자가 로그인 상태여야 함 | 입력 검증/출력 인코딩이 미흡해야 함 |
| 대표 공격의 예 | 자동 송금, 비밀번호 변경 | 쿠키 탈취, 키로깅, 파싱 |
| 응답 조작 여부 | 불가능 (Same-Origin Policy로 응답 열람 불가) | 가능 (브라우저에서 직접 실행) |
| 방어 방법 | CSRF 토큰, Referer 체크, | |
| SameSite 쿠키 설정 | 입력 검증, 출력 인코딩, CSP 설정 |