[security] JWT를 localStorage 또는 쿠키에 저장해야합니까? [복제]

JWT를 사용하여 REST API를 보호하기 위해 일부 자료 (이 가이드 및이 질문 등 )에 따르면 JWT는 localStorage 또는 Cookies에 저장할 수 있습니다 . 내 이해를 바탕으로 :

  • localStorage 는 XSS의 영향을받으며 일반적으로 민감한 정보를 저장하지 않는 것이 좋습니다.
  • 쿠키 를 사용하면 XSS의 위험을 완화하는 “httpOnly”플래그를 적용 할 수 있습니다. 그러나 백엔드의 쿠키에서 JWT를 읽으려면 CSRF를 받게됩니다.

따라서 위의 전제에 따라 JWT를 쿠키에 저장하는 것이 가장 좋습니다. 서버에 대한 모든 요청에서 JWT는 쿠키에서 읽고 Bearer 체계를 사용하여 Authorization 헤더에 추가됩니다. 그러면 서버는 요청 헤더에서 JWT를 확인할 수 있습니다 (쿠키에서 읽는 것과 반대).

내 이해가 맞습니까? 그렇다면 위의 접근 방식에 보안 문제가 있습니까? 아니면 실제로 처음부터 localStorage를 사용하여 벗어날 수 있습니까?



답변

@ pkid169가 말한 기사에서 언급 한 XSRF Double Submit Cookies 방법이 마음에 들지만 기사에서 말하지 않는 한 가지가 있습니다. 공격자가 할 수있는 일은 CSRF 쿠키 (HttpOnly가 아님)를 읽는 스크립트를 삽입 한 다음 JWT 쿠키가 자동으로 전송되는이 CSRF 토큰을 사용하여 API 엔드 포인트 중 하나에 요청하는 것이므로 여전히 XSS로부터 보호되지 않습니다.

따라서 실제로는 여전히 XSS에 취약합니다. 공격자가 나중에 사용하기 위해 JWT 토큰을 훔칠 수는 없지만 XSS를 사용하여 사용자를 대신하여 요청할 수 있습니다.

JWT를 localStorage에 저장하든 http 전용이 아닌 쿠키에 XSRF 토큰을 저장하든 관계없이 둘 다 XSS에서 쉽게 얻을 수 있습니다. HttpOnly 쿠키의 JWT조차도 고급 XSS 공격에 의해 잡힐 수 있습니다.

따라서 Double Submit Cookies 방법 외에도 콘텐츠 이스케이프를 포함하여 항상 XSS에 대한 모범 사례를 따라야합니다. 이는 브라우저가 원하지 않는 작업을 수행하게하는 실행 코드를 제거하는 것을 의미합니다. 일반적으로 이것은 자바 스크립트가 평가되도록하는 // <! [CDATA [태그 및 HTML 속성을 제거하는 것을 의미합니다.


답변

Stormpath 의 적시 게시물은 내 요점을 정교하게 설명하고 내 질문에 답했습니다.

TL; DR

쿠키에 JWT를 저장 한 다음 내가 언급 한 모든 요청에 ​​대해 Authorization 헤더에 JWT를 전달하거나 기사에서 제안한대로 백엔드에 의존하여 CSRF를 방지합니다 (예 : xsrfTokenAngular의 경우 사용 ).


답변

  • 토큰을 LocalStorage 또는 SessionStorage에 저장하지 마십시오. 이러한 토큰은 자바 스크립트에서 읽을 수 있으므로 XSS 공격에 취약합니다.
  • 귀하의 토큰을 쿠키에 저장하지 마십시오. 쿠키 (HttpOnly 플래그 포함)가 더 나은 옵션입니다. XSS에 취약하지만 CSRF 공격에 취약합니다.

대신 로그인시 액세스 토큰과 새로 고침 토큰의 두 가지 토큰을 전달할 수 있습니다. 접근 토큰은 자바 스크립트 메모리에 저장하고 새로 고침 토큰은 HttpOnly 쿠키에 저장해야합니다. 새로 고침 토큰은 새 액세스 토큰을 만드는 데만 사용되며 더 이상은 없습니다.

사용자가 새 탭을 열거 나 사이트 새로 고침시 쿠키에 저장된 새로 고침 토큰을 기반으로 새 액세스 토큰 생성 요청을 수행해야합니다.

또한이 기사를 읽는 것이 좋습니다 : https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/


답변

기존 쿠키를 이용하는 CSRF 공격을 방지하기 위해 SameSite지시문을 사용하여 쿠키를 설정할 수 있습니다 . lax또는로 설정하십시오 strict.

이는 아직 초안 이며 2019 년 현재 모든 브라우저 에서 완전히 지원되지않지만 데이터의 민감도 및 / 또는 사용자가 사용하는 브라우저에 대한 제어에 따라 실행 가능한 옵션이 될 수 있습니다. 지시문을로 설정 SameSite=lax하면 ” ‘안전한’… HTTP 메소드를 사용하는 최상위 탐색”이 허용됩니다.


답변