CSRF는 Cross Site Request Forgery의 줄임말로 사이트 간 요청 위조를 의미합니다.
공격자가 희생자의 권한을 도용하여 특정 웹사이트에 기능을 실행하게 할 수 있기 때문에 반드시 대응책이 필요한 웹 취약점 중 하나입니다.
예를 들어 공격자가 희생자의 사용자 정보를 도용하여 다수의 방문자가 사용하고 있는 사이트에 광고성 혹은 유해한 게시글을 업로드 하는 것이 가능하게 됩니다. 물론 대형 사이트들은 이와 같은 CSRF에 대응책을 마련하고 있습니다.
CSRF를 통해 공격을 하기 위해서 만족해야할 조건이 있습니다.
대부분 사용자들은 본인이 자주 방문하는 사이트에 대해 자동 로그인 기능을 사용하기 때문에 피싱 사이트에 접속했을 시 해당 로그인된 사용자 정보를 도용하여 희생자가 본인의 로그인 정보로 위조 요청을 보낼 사이트에 의도치 않은 기능을 실행시키도록 하는 것입니다.
희생자가 피싱 사이트에 접속하지 않더라도 XSS에 성공한 사이트에서 CSRF 공격을 실행할 수도 있습니다.

<img src="http://examplesite/user/logout" width="0" height="0">
위는 img 태그를 사용하는 방식으로 CSRF 공격을 한 형태입니다.
웹 브라우저는 img 태그에서 src 속성에 적힌 URL 주소에 HTTP GET 요청을 보내서 이미지 데이터를 받아옵니다.
이 URL이 이미지 파일을 가리킬 필요가 없이 브라우저는 단순히 지정된 URL로 요청을 보내고 서버로부터 어떤 형태의 응답이든 받아들이기 때문에 위의 코드를 통해서 유저를 강제로 로그아웃 시키는 것이 가능하게 됩니다.
CSRF에 대응하는 방법은 크게 3가지가 있습니다.
CAPTCHA는 웹사이트에서 사람이 접근하려고 하는 것인지 봇이 접근하는 것인지 판단하기 위하여 사용되는 튜링 테스트의 일종입니다.
예를 들어, 중요한 폼을 제출할 때 CAPTCHA를 해결해야 하는 단계를 추가함으로써, 사용자가 실제로 해당 폼을 직접 제출하고 있다는 것을 확인할 수 있습니다.
CAPTCHA를 통과해야만 요청이 진행되기 때문에, CSRF로 인한 무단 요청을 막을 수 있고 사용자가 실제로 해당 요청을 의도했는지를 확인할 수 있기 때문에 유용한 방어 방법 중 하나입니다.

요청이 들어올 때 request의 header에 담겨있는 referer 값을 확인하여 같은 도메인에서 보낸 요청인지 검증하여 차단하는 방법입니다.
거의 대부분의 경우 이 Referer 검증법으로 공격을 방어할 수 있습니다.
하지만 동일 사이트 내에서 XSS 취약점이 발견된다면 이를 통하여 CSRF 공격을 실행할 수 있다는 점을 유의해야 하며 이는 페이지 단위까지 쪼개어서 도메인 검증을 하는것으로 페이지 간 CSRF 공격을 방어할 수 있습니다.
사용자의 세션에 임의의 값을 저장하여 모든 요청마다 그 값을 포함하여 전송합니다.
그리고 요청이 들어올 때 마다 백엔드에서 세션에 저장된 값과 요청으로 전송된 값이 일치하는지 검증하여 방어하는 방법입니다. Referer 검증법과 같이 XSS를 통한 CSRF 공격에 취약하다는 특징이 있습니다.
XSS 공격에 약한 이유는 사용자의 브라우저에 악성 스크립트를 심어 CSRF 토큰을 탈취한다면, 공격자가 이 토큰을 사용하여 정당한 요청처럼 위장할 수 있기 때문입니다.
http://www.AAAAA.com 이라는 웹 페이지에 있는 링크를 클릭하여 http://www.BBBBBB.com 으로 이동했을 때 referer는 http://www.AAAAA.com이 된다.
참고 사이트
티베트 모래여우님의 CSRF 블로그 글