web-dev-qa-db-ja.com

JWTはlocalStorageまたはcookieに保存する必要がありますか?

JWTを使用してREST AP​​Iを保護するために、いくつかの資料(この guide およびこの question など)に従って、JWTは次のいずれかに格納できます。 localStorageまたはCookies。私の理解に基づいて:

  • localStorageはXSSの対象であり、一般に機密情報を格納することは推奨されません。
  • Cookiesを使用すると、XSSのリスクを軽減するフラグ「httpOnly」を適用できます。ただし、バックエンドのCookieからJWTを読み取る場合、CSRFの対象となります。

したがって、上記の前提に基づいて-JWTをCookieに保存するのが最適です。サーバーへのすべてのリクエストで、JWTはCookieから読み取られ、ベアラースキームを使用してAuthorizationヘッダーに追加されます。サーバーは、(CookieからJWTを読み取るのではなく)要求ヘッダーでJWTを検証できます。

私の理解は正しいですか?その場合、上記のアプローチにはセキュリティ上の懸念がありますか?または、実際にlocalStorageを使用するだけで済ませることができますか?

57
pkid169

@ pkid169が述べた記事で言及したXSRF Double Submit Cookiesメソッドが好きですが、記事があなたに言っていないことが1つあります。攻撃者ができることは、CSRF Coo​​kie(HttpOnlyではない)を読み取るスクリプトを挿入し、JWT Cookieが自動的に送信されるこのCSRFトークンを使用して、APIエンドポイントの1つにリクエストを送信するためです。

したがって、実際にはあなたはまだXSSの影響を受けやすく、攻撃者がJWTトークンを盗んで後で使用することはできませんが、XSSを使用してユーザーに代わってリクエストを行うことができます。

JWTをlocalStorageに保存するか、XSRFトークンをhttp専用のCookieに保存するかは、どちらもXSSによって簡単に取得できます。HttpOnlyCookieのJWTでも、高度なXSS攻撃によって取得できます。

そのため、Double Submit Cookiesメソッドに加えて、コンテンツのエスケープを含むXSSに対するベストプラクティスに従う必要があります。これは、ブラウザが望まないことをする原因となる実行可能コードを削除することを意味します。通常、これは、JavaScriptが評価される// <![CDATA [タグとHTML属性を削除することを意味します。

33
Iman Sedighi

タイムリーな Stormpathからの投稿 は、私のポイントをかなり詳しく説明し、私の質問に答えました。

TL; DR

JWTをCookieに保存してから、前述のようにすべてのリクエストでAuthorizationヘッダーにJWTを渡すか、記事で示唆されているように、CSRFを防ぐためにバックエンドに依存します(Angularの場合はxsrfTokenを使用) 。

14
pkid169