Cross Site Request Forgery, 사이트간 요청 위조)
: 웹사이트의 취약점을 이용하여 사용자가 의도하지 않은 요청을 송신하도록 하는 공격을 의미힌다
HTTP의 Stateless 특성에 기인한 특정 웹 애플리케이션에 대해 일련의 요청 들의 상관관계를 특정할 수 없으므로 세션 유지 등에 일반적으로 쿠키 정보 등이 조건만 만족하면 자동으로 송신되기 떄문에 가능하다.
공격시나리오
- 공격자가 공격코드를 가진 웹페이지를 제작하여 공개 or 특정 웹사이트에 공격용 코드를 삽입
- 피해자가 공격자가 준비해둔 페이지에 접속
- 피해자(피해자의 브라우저)는 공격자가 준비해둔 요청을 서버로 송신
공격방법
정형화된 수법은 없고 웹에 요청을 보낼 수 있는 모든 방법이 공격 방법이 될 수 있다.
ex) javascript, ajax, form 방법, img태그를 이용한 방법 등..
방어 방법
1) Referrer 검증
- Request Header에 있는 요청을 한 페이지의 정보가 담긴 Referrer 속성을 검증하여 차단하는 방법
- 같은 도메인 상에서 요청이 들어오지 않는다면 차단하는것
- 대부분 방어가 가능
2) Security Token(CSRF token)
- 랜덤한 수를 사용자의 세션에 저장하여 사용자의 모든 요청(Request)에 대하여 서버 쪽에서 검증하는 방법
- 요청을 받을 떄마다 백엔드에서 세션에 저장된 토큰값과 요청 파라미터에서 전달되는 토큰 값이 같은지 검증
3) Double Submit Cookie
- Security Token 검증의 한 종류
- 세션을 사용할 수 없는 상황에서 사용할 수 있다.
- Same Origin 정책으로 인해 자바스크립트에서 타 도메인의 쿠키 값을 확인/수정하지 못한다는 것을 이용한 방어 기법
- 스크립트 단에서 요청 시 난수 값을 생성하여 쿠키에 저장하고 동일한 난수 값을 요청 파라미터(혹은 헤더)에도 저장하여 서버로 전송
- 서버단에서 쿠키의 토큰값과 파라미터의 토큰값이 일치하는지 검사
- 서버에 따로 토큰 값을 저장할 필요가 없어 세션을 이용한 검증보다 개발 공수가 적은 편
- 피싱 사이트에서 도메인이 달라 쿠키에 값을 저장하지 못하므로(Same Origin 정책) 가능한 방어 기법