사이트 간 요청 위조(CSRF)
사이트 간 요청 위조(Cross-site request forgery, CSRF, XSRF)는 웹의 취약점을 노린 공격 수법중 하나다.
이건 웹사이트가 인증된 사용자를 신뢰한다는 점을 악용한다. 순진한 사용자가 공격코드가 삽입된 페이지를 열게끔 유도해서 뒤통수를 때리도록 하는 것이다.
사이트를 이용해서 사용자를 공격하는 XSS과는 반대이다.
서버를 건드리는 것이기 때문에 사용자에겐 직접 해를 줄 수는 없고, 보통 사용자의 권한으로 광고성 게시물 같은걸 올릴때나 활용된다고 한다.
CSRF가 이뤄지기 위해서는 아래의 두 조건이 필요하다.
1.사용자가 공격할 사이트에 로그인되어있을것
2.사용자가 해커가 만든 피싱 사이트에 접속
1번이 충족된 상태에서 2번이 실행되는 동시에 바로 공격이 시작되는 것이다.
해결책1 - Referrer 검증
서버에서 request의 referrer를 확인해서 도메인이 일치하는지 확인하는 방법이다.
referrer란 http에서 현재 요청된 페이지의 이전 링크를 저장하는 것이다.
생각해보면, 게시글을 등록하는 등의 행위는 당연히 동일한 도메인의 특정 페이지에서 이어지는 것이 논리적으로 당연하다.
따라서 뜬금없는 도메인에서 해당 요청을 수행했다면 CSRF 등의 공격이라 간주하고 차단할 수 있다는 것이다.
이것만 잘 처리해놔도 CSRF 공격을 원천차단할 수 있다. 동일 도메인 내에서 꼼꼼히 다 막아준다면.
해결책2 - 보안 토큰(CSRF 토큰)
사용자의 세션에 난수값을 대충 저장해두고, 업로드 등의 요청을 할때마다 그 난수값을 반드시 보내도록 하는 것이다.
난수값이 일치하지 않는다면 유효한 요청이 아닌 것이다.
참조
https://ko.m.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%9A%94%EC%B2%AD_%EC%9C%84%EC%A1%B0
https://itstory.tk/entry/CSRF-%EA%B3%B5%EA%B2%A9%EC%9D%B4%EB%9E%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-CSRF-%EB%B0%A9%EC%96%B4-%EB%B0%A9%EB%B2%95
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Referer
https://sj602.github.io/2018/07/14/what-is-CSRF/