CSRF란?

Cross-Site Request Forgery

사이트 간 요청 위조 (Cross-site request forgery)는 웹 사이트 취약점 공격의 하나로, 사용자가 자신의 의자와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격을 말한다.

이는 특정 웹사이트가 사용자의 웹 브라우저를 신용하는 상태를 노린 것이다. 일단 사용자가 웹사이트에 로그인한 상태에서 사이트간 요청 위조 공격 코드가 삽입된 페이지를 열면, 공격 대상이 되는 웹사이트는 위조된 공격 명령이 믿을 수 있는 사용자로부터 발송된 것으로 판단하게 되어 공격에 노출된다.

CSRF 공격이 이루어지려면 다음 조건이 만족되어야 한다.

  1. 위조 요청을 전송하는 서비스에 희생자가 로그인한 상태
  2. 희생자가 해커가 만든 피싱 사이트에 접속
  3. 사용자의 인증정보(쿠키)를 사용한 스크립트가 실행
  4. 서버는 공격 명령을 사용자의 요청으로 인식하고 실행

예를들어 나무위키의 경우 <img src="https://namu.wiki/logout"> 와 같은 코드를 넣어주면 해당 문서를 보는 경우 로그아웃이 된다.

flow

방어

Refere 검증

Back-end에서 request의 referer를 확인하여 Domain이 일치하는지 검증한다. 대부분의 CSRF 공격 방어가 가능하지만 XSS 취약점이 있는 경우 방어가 불가능해질 수 있다.

XSS(Cross Site Scripting)

공격하려는 사이트에 스크립트를 넣어 공격하는 기법

Security Token 사용(CSRF Token)

사용자의 세션에서 임의의 난수값을 저장하고 사용자의 요청마다 해당 난수값을 포함시켜 전송한다. 이후 Back-end에서 요청을 받을 때마다 세션에 저장된 토큰값과 요청 파라미터에서 전달되는 토큰값이 같은지 검증하는 방법이다. 이 또한 XSS 취약점이 있는 경우 방어가 불가능해질 수 있다.

웹 브라우저의 Same Origin 정책으로 인해 자바스클비트에서 타 도메인의 쿠키값을 확인, 수정하지 못한다는 것을 이용한 방어 기법이다.

script 단에서 요청시 난수를 생성하여 쿠키에 저장하고 동일한 난수 값을 요청 파라미터에 저장하여 서버에 전송한다.

서버단에서 쿠키의 토큰 값과 파라미터의 토큰값이 일치하는지만 검사하면 된다. 서버에서 토큰값을 저장할 필요가 없어 세션 검증보다 가볍다.

RESTful 설계에서 데이터 조작시 POST만 사용

데이터를 조작하는 기능을 제작할 때 GET요청은 허용하지 않고 POST요청만 허용하는 방향으로 설계를 진행하는 것도 도움이 된다.

Reference

CSRF

사이트 간 요청 위조

CSRF 공격

Cross-Site Request Forgery Prevention _ OWASP Cheat Sheet Series