Skip to content
hyunwoo9301 edited this page Jul 20, 2017 · 2 revisions

CSRF

CSRF(Cross site request forgery, 사이트간 요청 위조)란 웹 사이트의 취약점을 이용하여 사용자가 의도하지 않는 요청을 송신하도록 하는 공격을 의미.

공격방법

CSRF공격방법에는 정형화된 수법이 있다기 보다는 웹에 요청을 보낼수 있는 모든 방법이 공격방법이 된다고 할 수 있다. javascript와 ajax를 이용한 방법, 전통적인 form방법, img태그를 이용한 방법 등등 요청을 보낼수 있는 방법이라면 그 어떤 것이라도 가능하다.

CSRF 공격의 사례입니다

  1. 사용자가 폼 인증을 통해서 www.example.com에 로그인
  2. 서버가 사용자를 인증합니다. 이 때, 서버에서 반환된 응답에는 인증 쿠키 포함
  3. 사용자가 로그아웃하지 않은 상태에서 악의적인 사이트를 방문
<h1>You Are a Winner!</h1>
<form action="http://example.com/api/account" method="post">
    <input type="hidden" name="Transaction" value="withdraw" />
    <input type="hidden" name="Amount" value="1000000" />
    <input type="submit" value="Click Me"/>
</form>
  1. 사용자가 "submit" 버튼을 클릭, 브라우저가 요청에 인증 쿠키를 함께 포함시켜서 전송
  2. 요청은 서버에서 사용자의 인증 컨텍스트로 실행, 인증된 사용자가 수행할 수 있는 모든 작업을 수행할 수 있음

Solution

일반적으로 가장 널리 이용되는 방법에는 Synchronizer token pattern(동기화된 토큰 패턴)이 있다. 이 패턴은 서버 사이드(세션 스코프 등)에 보관된 토큰을 CSRF방어가 필요한 요청마다 포함(요청할 form에 hidden필드를 이용하여 토큰을 추가)시켜서 요청하고 서버에서 비교하는 방식으로 CSRF를 방어하는 방법이다. 가장 간단한 방식으로 사용자 경험에 영향을 주지 않는 방식으로 방어할 수 있으므로 널리 사용된다.

참고

http://reiphiel.tistory.com/entry/cross-site-request-forgery

http://www.egocube.pe.kr/Translation/Content/asp-net-web-api/201402030001

Clone this wiki locally