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 검증