CSRF(Cross Site Request Forgery)란 사이트 간 요청 위조이다.
해커가 사용자의 권한을 도용하여 사용자의 의지와는 무관하게 해커가 의도한 행위를 특정 웹사이트에 요청하게 만드는 공격이다. XSRF라고도 불린다.
정리하면,
공격자가 사용자를 홀리고 (광고성 글),
사용자의 권한을 이용하여 공격자에게 이로운 일을 한다.
(다크 아칸이 떠오릅니다! )
다음의 상황을 가정해보자
width
와 height
가 0 이기때문에 사용자는 인지할 수 없다.<img src="사용자 비밀번호 가져오기" width="0" height="0" />
기본적으로 <img>
태그는 GET
요청으로 수행된다.
만약 src
의 값이 사용자 비밀번호를 가져오는 url 이었다면, 홀라당 개인정보를 털렸을 것이다.
Referer
검증Request Header에 포함된 Referer는 현재 요청된 페이지의 링크 이전의 웹 페이지 주소를 포함한다.
(그리고 Referer
는 실제로 단어 "Referrer"에서 철자를 빼먹은 것입니다ㅋㅋㅋㅋ)
요청을 받는 서버는 CSRF를 막기위해 정해준 Referer
만 허용해주는 유효성 검사 로직을 추가하는 조치를 취한다.
이후에 피싱페이지에서 의도하지 않은 행위를 한다면,
이전에 작성한 Referer 값 유효성 검사에서 걸러질 것이다.
즉, 해당 요청이 요청될 수 있는 위치가 아닌 곳은 예외를 발생시켜서 막을 수 있다.
그러나, 오히려 내가 설정해준 위치에서 XSS 취약점이 발견된다면,
이를 통해서 CSRF가 수행될 수 있다는 단점이 있다.
CSRF Token
을 생성해서 세션에 저장한다.CSRF Token
을 페이지 요청 태그의 hidden 값에 넣어준다.<input type="hidden" name="_csrf" value="${CSRF_TOKEN}" />
CSRF Token
을 같이 보낸다.CSRF Token
을 검증한다.그러나 Referer
검증과 마찬가지로, XSS 공격을 통해서 수행될 수 있다.
(아니 선생님...)
---[출처]