- 사용자가 자신도 모르는 사이에 공격자가 의도한 행동을 특정 웹 사이트에 수행하도록 만드는 공격
- 사용자가 이미 인증된 세션을 가지고 있을 때 발생하며, 공격자는 사용자의 권한을 이용해 악의적인 요청을 보낸다.
- 사용자가 현재 방문 중인 웹사이트와 다른 사이트(다른 도메인)로 부터 악의적인 요청이 발생했기 때문이다.
- 공격이 example.com 과 같은 신뢰할 수 있는 사이트에서 발생하는 것이 아니라, evil.com 과 같은 다른 도메인에서 발생하는 점이 핵심이다.
CSRF 공격의 원리
- 인증된 세션
- 사용자가 bank.com 에 로그인하여 세션 쿠키 session_id 를 발급받는다.
- 악성 요청 유도
- 사용자가 이메일에서 “특별 할인” 링크를 클릭하여 evil.com 에 방문한다.
- 자동 요청 전송
- evil.com 은 자동으로 사용자의 브라우저를 통해 bank.com/transfer 로 요청을 보낸다.
- 브라우저는 session_id 쿠키를 함께 전송한다.
- 요청 처리
- bank.com 은 요청을 받고, session_id 쿠키를 확인하여 사용자를 인증된 것으로 인식하고 송금 요청을 처리한다.
CSRF 방지 방법
- CSRF 토큰 사용
- CSRF 토큰은 서버가 생성하고 클라이언트에 전달하는 임의의 난수 값, 각 요청마다 고유한 토큰을 포함시켜서 서버가 이를 검증하도록 한다.
- SameSite 쿠키 속성 설정
- 쿠키가 같은 사이트 내의 요청에서만 전송되도록 제한 할 수 있다.
- Referer 헤더 검사
- 요청의 출처를 확인하여, 적절한 출처에서 온 요청만 처리한다.
- Referer 헤더를 검증하여 요청이 적절한 출처에서 온 것인지 확인
- Spring Security 사용
- 기본 설정에서 CSRF 보호가 자동으로 활성화
동일 사이트 요청 (Same-Site Request)
- 정의: 동일 도메인, 서브도메인, 프로토콜 및 포트를 사용하는 요청입니다.
- 예: example.com에서 example.com/about로 이동하는 경우.
크로스 사이트 요청 (Cross-Site Request)
- 정의: 다른 도메인, 서브도메인, 프로토콜 또는 포트를 사용하는 요청입니다.
- 예: example.com에서 evil.com으로 이동하는 경우.