CSRF의 모든 문제와 그것을 방지하는 적절한 방법을 이해하려고합니다. (내가 읽고 이해하고 동의 한 리소스 : OWASP CSRF Prevention CHeat Sheet , CSRF에 대한 질문 )
내가 이해하는 것처럼 CSRF와 관련된 취약점은 웹 서버의 관점에서 들어오는 HTTP 요청의 유효한 세션 쿠키가 인증 된 사용자의 희망을 반영한다고 가정하여 도입되었습니다. 그러나 원본 도메인에 대한 모든 쿠키는 브라우저에 의해 요청에 마술처럼 첨부되므로 실제로 모든 서버는 요청에 유효한 세션 쿠키가 있음을 유추 할 수 있습니다. 요청이 인증 된 세션을 가진 브라우저에서 온 것입니다. 코드 에 대해 더 이상 가정 할 수 없습니다해당 브라우저에서 실행하거나 사용자가 원하는 것을 실제로 반영하는지 여부 이를 방지하는 방법은 요청에 브라우저의 자동 쿠키 처리 이외의 다른 방법으로 추가 인증 정보 ( "CSRF 토큰")를 포함시키는 것입니다. 느슨하게 말하면 세션 쿠키는 사용자 / 브라우저를 인증하고 CSRF 토큰은 브라우저에서 실행되는 코드를 인증합니다.
간단히 말해 세션 쿠키를 사용하여 웹 응용 프로그램의 사용자를 인증하는 경우 각 응답에 CSRF 토큰을 추가하고 각 (변경) 요청마다 일치하는 CSRF 토큰이 필요합니다. 그런 다음 CSRF 토큰은 서버에서 브라우저로 다시 왕복하여 서버로 요청을하는 페이지가 해당 서버에 의해 승인됨을 증명합니다.
내 질문에 대해서는 왕복에서 해당 CSRF 토큰에 사용되는 특정 전송 방법에 관한 것입니다.
AngularJS , Django , Rails 에서 CSRF 토큰을 쿠키 (예 : Set-Cookie 헤더)로 서버에서 클라이언트로 보낸 다음 클라이언트의 Javascript를 쿠키에서 긁어내어 첨부하는 것이 일반적입니다 (예 : AngularJS , Django , Rails ). 서버로 다시 보낼 별도의 XSRF-TOKEN 헤더로.
(대체 방법은 예를 들어 Express 에서 권장하는 방법입니다. 여기서 서버에서 생성 한 CSRF 토큰은 서버 측 템플릿 확장을 통해 응답 본문에 포함되어 서버로 다시 공급되는 코드 / 마크 업에 직접 연결됩니다. 이 예는 웹을 사용하는 1.0-ish 방식이지만 JS가 많은 클라이언트에게는 일반적으로 적합합니다.)
CSRF 토큰의 다운 스트림 전송으로 Set-Cookie를 사용하는 것이 왜 일반적입니까? 이것이 좋은 생각입니까? 나는이 모든 프레임 워크의 저자들이 그들의 선택을 신중하게 고려했지만 이것이 잘못되지 않았다고 생각합니다. 그러나 언뜻보기에는 쿠키를 사용하여 쿠키의 디자인 제한 사항을 해결하는 것이 어려워 보입니다. 실제로 쿠키를 왕복 전송으로 사용하면 (서버가 브라우저에 CSRF 토큰을 알리기 위해 Set-Cookie : 헤더 다운 스트림, 브라우저가 서버로 반환하기위한 Cookie : 헤더 업스트림) 쿠키를 사용하면 취약점이 다시 나타납니다. 해결하려고합니다.
위의 프레임 워크는 CSRF 토큰의 전체 왕복에 쿠키를 사용하지 않습니다. 이들은 Set-Cookie 다운 스트림을 사용하고 그 다음에 다른 것 (예 : X-CSRF-Token 헤더)을 업스트림으로 사용하므로이 취약점을 차단합니다. 그러나 다운 스트림 전송으로 Set-Cookie를 사용하더라도 오해의 소지가 있으며 위험합니다. 브라우저는 이제 진짜 악성 XSRF 요청을 포함한 모든 요청에 CSRF 토큰을 첨부합니다. 기껏해야 요청을 요구보다 커지게하고 최악의 경우 서버 코드를 잘못 사용하여 실제로 사용하려고 시도 할 수 있습니다. 또한 CSRF 토큰의 실제 수신자는 클라이언트 측 Javascript이므로이 쿠키는 http 전용으로 보호 할 수 없습니다.