web-dev-qa-db-ja.com

JWTトークンをWebベースのアプリケーションで適切かつ安全に保存する場所はどこですか?

ブラウザのストレージとCookieについて聞いたことがありますが、トークンを保存するための最良の安全な方法を理解できません。また、他のメソッドが存在するかどうか、またはサードパーティのライブラリが正しく機能するかどうかもわかりません。

それを行うために利用できる方法の完全なリストがあり、それぞれの利点/不便さ、そして何よりも何よりも最善の方法があればよいのですが。

9
Alex

JWTを保管する場所

トークンベースの認証では、JWTを保存する場所を選択できます。トークンはローカルストレージ/セッションストレージまたはCookieに保存することを強くお勧めします。

Webストレージ(ローカルストレージ/セッションストレージ)

一般に、JWTはブラウザーのローカルストレージに配置され、これはほとんどのユースケースでうまく機能します。

ユーザー名とパスワードを使用してユーザーをログインさせると、レスポンスの本文にはaccess_token JWTが含まれます。次に、クライアント側のコードでこの応答を処理する必要があります。このトークンは、localStorageまたはsessionStorageに保存できます。

sessionStorageを使用した例については、ここをクリックしてください

localStoragesessionStorageはどちらもStorageを拡張します。それらの唯一の違いは、データの永続性です。

localStorage-データは明示的に削除されるまで存続します。加えられた変更は保存され、サイトへの現在および将来のすべてのアクセスで利用できます。

sessionStorage-加えられた変更は保存され、現在のページだけでなく、同じウィンドウでのサイトへの将来のアクセスにも使用できます。ウィンドウを閉じると、ストレージは削除されます。

Webストレージの短所

  • Cookieとは異なり、ローカルストレージは特定のドメインにサンドボックス化されており、そのデータはサブドメインを含む他のドメインからアクセスできません。
  • 同じドメインのJavaScriptを介してWebストレージにアクセスできるため、サイトで実行されているすべてのJavaScriptがWebストレージにアクセスできます。これにより、クロスサイトスクリプティング(XSS)攻撃に対して脆弱になる可能性があります。
  • 開発者は、JWTが常にHTTPS経由で送信され、HTTP経由では送信されないようにする必要があります。

クッキーの使用

Cookieを使用してJWTを保存することもできます。 Cookieを設定する正確な方法は、使用しているクライアント側の言語によって異なります。

Cookieの有効期間を制御するためのさまざまなオプションがあります。

  • Cookieは、ブラウザを閉じた後に破棄できます(セッションCookie)。
  • サーバー側のチェックを実装し(通常、使用中のWebフレームワークによって行われます)、有効期限またはスライディングウィンドウの有効期限を実装できます。
  • Cookieは、有効期限が切れると永続化できます(ブラウザーを閉じた後に破棄されません)。
  • Cookieは、JavaScriptとサーバー側コードの両方で読み取ることができます。また、httpOnlyフラグが設定されている場合は、サーバー側のみで読み取ることができます。

クッキーの短所

  • Cookieの最大サイズは4KBしかないため、トークンに多くのクレームが添付されている場合は問題になる可能性があります。
  • Cookieは、脆弱なクロスサイトリクエストフォージェリ(CSRFまたはXSRF)攻撃になる可能性があります。このタイプの攻撃は、悪意のあるWebサイトが原因で、ユーザーが現在認証されている信頼済みサイトでユーザーのWebブラウザーが望ましくないアクションを実行したときに発生します。これは、ブラウザがCookieを処理する方法の悪用です。 WebアプリフレームワークのCSRF保護を使用すると、CookieはJWTを保存するための安全なオプションになります。 CSRFは、HTTP RefererおよびOriginヘッダーをチェックすることで部分的に防ぐこともできます。
  • アプリケーションがクロスドメインアクセスを必要とする場合、実装が難しい場合があります。 Cookieには、Cookieの送信を許可する場所を指定できるように変更できる追加のプロパティ(ドメイン/パス)があります。

元の記事: https://auth0.com/docs/security/store-tokens#how-to-implement

7
Dmitry S.