교차 사이트 요청 위조
기본 프레임워크는 웹 사이트를 신뢰하는 사용자로부터 권한이 없는 명령이 전송되는 웹 사이트를 악의적으로 이용하는 교차 사이트 요청 위조(CSRF)에 대한 애플리케이션 보호 기능을 제공합니다.
CSRF(XSRF라고도 함)는 사용자가 특정 사이트에 대해 갖는 신뢰를 이용하는 교차 사이트 스크립트(CSS 또는r XSS)와 다릅니다. CSRF은 원 클릭 공격, 사이드재킹 또는 세션 라이딩이라고도 합니다.
CSRF를 실행하려면 사용자가 승인한 것으로 알려진(또는 가정되는) 사이트에 액세스하는 링크 또는 스크립트를 페이지에 포함해야 합니다. 예를 들어, 사용자 A는 사용자 B가 메시지를 게시한 포럼을 찾아볼 수 있습니다. CSRF를 사용하면 사용자 B가 이미지 파일이 아닌 사용자 A의 은행 웹 사이트의 스크립트를 참조하고 $1,000,000 인출을 요청하는 다음 HTML 이미지 요소를 생성할 수 있습니다.
<img src="http://bank.example/withdraw?amount=1000000&for=USER-B">
사용자 A의 은행이 인증 정보를 쿠키에 보관하고 쿠키가 만기되지 않은 경우, 이미지 로드를 위한 사용자 A 브라우저의 시도는 인증 쿠키와 함께 인출 양식을 제출하고 사용자 A의 승인 없이 트랜잭션을 승인합니다.
이 시나리오의 문제점은 다음과 같은
세 가지 사항으로 요약할 수 있습니다.
- 브라우저 정책으로 인해, 다른 웹 사이트에서 요청을 보낸 경우라도 인증 쿠키를 은행 서버로 전송됩니다.
- 사용자 A의 은행은 인증 정보를 쿠키에 보관하고 인증 시 전적으로 쿠키에 의존합니다.
- 사용자 A의 은행이 GET 요청과 POST 요청을 구분하지 않습니다.
기본 프레임워크의 CSRF 보호는 브라우저 정책이므로 첫 번째 사항에 적용되지 않습니다. 그러나 인증을 위해
쿠키와 추가 토큰을 모두 사용함으로써 두 번째 및 세 번째
지점에 적용됩니다. CSRF 공격은 일반적으로 서버로 전송되는
각 요청의 고유 토큰을 항상 확인함으로써 방지됩니다. 기본 프레임워크에서 토큰은 다음과 같은 방식으로 사용됩니다.
- 로그인이 완료되면 세션에 대해 새로 생성된 토큰이 설정됩니다(유효성 검증을 위해). 이 토큰은 애플리케이션의 클라이언트측에서 사용할 수 있습니다.
- 토큰은 다음과 같은 방법으로 사용합니다.
- 이 토큰은 모든 AJAX 요청 및 기본 프레임워크 유틸리티에서 사용됩니다.
- 서버에 대한 POST 또는 GET 요청이 작성되면 애플리케이션이 자동으로 요청에서 CSRF 토큰을 사용할 수 있는지에 대한 유효성을 검증합니다.