1. ホーム
  2. security

[解決済み] JWTはlocalStorageとcookieのどちらに保存するべきか?重複

2022-06-25 01:55:09

質問

JWTを使ったREST APIのセキュリティ確保のために、いくつかの資料(例えばこんな感じ ガイド や、この 質問 を含む)、JWTは以下のどちらかに格納されます。 ローカルストレージ または クッキー . 私の理解に基づいています。

  • ローカルストレージ は XSS の対象となります。一般に、機密情報をそこに保存することは推奨されません。
  • クッキー を使えば、XSS のリスクを軽減する httpOnly" のフラグを適用することができます。しかし、バックエンドでクッキーからJWTを読み取る場合、CSRFの影響を受けることになります。

ですから、上記の前提に基づいて、JWT を Cookie に保存するのが最善でしょう。サーバーへのすべてのリクエストで、JWT は Cookie から読み取られ、Bearer スキームを使用して Authorization ヘッダーに追加されます。そうすれば、サーバーは(Cookieから読み取るのとは対照的に)リクエストヘッダでJWTを検証することができます。

私の理解は正しいでしょうか?もしそうなら、上記のアプローチにはセキュリティ上の懸念があるのでしょうか?あるいは、実際には、最初の場所でlocalStorageを使用することで済ませることができるのでしょうか?

どのように解決するのですか?

私は@pkid169が言った記事で言及されているXSRF Double Submit Cookiesの方法が好きですが、その記事には書かれていないことが1つあります。攻撃者ができることは、CSRF クッキー (HttpOnly ではないもの) を読み取るスクリプトを注入し、JWT クッキーが自動的に送信される CSRF トークンを使用して API エンドポイントの 1 つにリクエストを送信することだからです。

攻撃者が後で使用するためにJWTトークンを盗むことができないだけで、XSSを使用してユーザーに代わってリクエストを行うことは可能です。

JWTをlocalStorageに保存しても、XSRF-tokenをhttp専用のcookieに保存しても、どちらもXSSによって簡単に取得されます。HttpOnly クッキーにある JWT でさえ、高度な XSS 攻撃によって捕捉される可能性があります。

したがって、Double Submit Cookiesの方法に加えて、コンテンツのエスケープなど、XSSに対するベストプラクティスに常に従わなければなりません。これは、ブラウザに不要な動作をさせる実行可能コードをすべて削除することを意味します。典型的には、これは // <![CDATA[] タグと JavaScript が評価される原因となる HTML 属性を削除することを意味します。