1. 개요
CSR(Cross-site Request Forgery)란?
⇒ 사이트간 요청 위조로 권한을 도용당한 인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정,삭제,등록)를 특정 웹사이트에 요청하게 만드는 공격
이러한 공격이 가능한 이유는 http 프로토콜의 상태없음(stateless)특성에 기인한 특정 웹 어플리케이션에 대한 자원접근(Request)들의 상관관계를 특정지을 수 없기 때문에, 세션 유지등에 일반적으로 사용되는 쿠키 정보 등이 조건만 만족한다면 자동적으로 송신되기 때문에 가능합니다.
참고: 상관관계가 없다는 말의 의미
연속되는 프로세스를 가진 웹 어플리케이션에서 각 페이지에 대한 요청이 연속적으로 이어지는지에 대한 제어를 할 수 없다는 것을 의미합니다.
2. 대책
첫 번째. Synchronizer token pattern(동기화된 토큰 패턴)
→ 서버 사이드(세션 스코프 등)에 보관된 토큰을 CSRF방어가 필요한 요청마다 포함(요청할 form에 hidden필드를 이용하여 토큰을 추가)시켜서 요청하고, 서버셍서 비교하는 방식으로 CSRF를 방어하는 방법.
이 경우 토큰은 세션 ID와 동일한 수준의 보호수단이 필요하다.(SSL이용 , URL노출 금지, 출력대상 페이지 캐시 컨트롤, XSS취약점 방어 등)
두 번째. Referer 검증
→ 서버측에서 request의 referer를 확인하여 Domain이 일치하는지 검증하는 방법으로 대부분의 CSRF공격 방어가 가능하지만, XSS취약점이 있는경우 방어가 불가능하다.
세 번째. Double Submit Cookie 검증
→ 웹브라우저의 Same Origin 정책으로 인해 자바스크립트에서 타 도메인의 쿠키값을 확인, 수정하지 못한다는 것을 이용한 방어 기법.
script단에서 요청시 난수를 생성하여 쿠키에 저장하고 동일한 난수 값을 요청 파라미터에 저장하여 서버에 전송. 서버단에서 쿠키의 토큰 값과 파라미터의 토큰값이 일치하는지만 검사하면된다. 서버에 토큰값을 저장할 필요가 없어 세션 검증보다 가볍다.