web-dev-qa-db-ja.com

期限切れのJWTトークンを更新することは良い戦略ですか?

私がベストプラクティスを理解している場合、JWTには通常、有効期間が短命(〜15分)です。ユーザーに15分ごとにログインさせたくない場合は、15分ごとにトークンを更新する必要があります。

有効なセッションを7日間(UXの観点)維持する必要があるため、2つの解決策があります。

  • 長期間有効なjson Webトークンを使用する(1週間)-悪い習慣?
  • 古いものの有効期限が切れた後に新しいjson Webトークンを取得する(JWT 15分、1週間の更新が許可されています)

HTTPSの使用を強制しています。

JWT標準 は、トークンの更新について話しません。期限切れのトークンを更新することは良い戦略ですか?

59

トークンの更新は、トークンの所有者stillがアクセス権を持っていることを認証サービスで確認するために行われます。これは、トークンの検証が暗号化手段を介して行われるため、認証サービスに連絡する必要がないため必要です。これにより、トークンの評価がより効率的になりますが、トークンの有効期間中はアクセス権を撤回することができなくなります。

頻繁に更新しないと、トークンに付与されたアクセス権を削除することは非常に困難です。トークンの有効期間を1週間にすると、ユーザーアカウントの削除、パスワードの変更(または再ログインを必要とする他のイベント)、アクセス許可の変更など、別の手段を実装する必要が生じる可能性があります。ユーザーのために。

したがって、頻繁な更新間隔に固執してください。 15分ごとに1回では、認証サービスのパフォーマンスを損なうことはできません。

2019年11月18日編集:@Rishabh Poddarのコメント。古い更新トークンが使用されるたびに、新しい更新トークンを生成する必要があります。詳細については、この セッション管理の詳細な説明 を参照してください。

38
Neil Smithline

トークンは15分ごとに更新する必要がありますが、更新するためにユーザーを再度認証する必要はありません。

  • 認証後、15分間有効なJWTを配布します。
  • トークンが期限切れになるたびに、クライアントにトークンを更新させます。これが7日以内に行われると、再認証なしで新しいJWTを取得できます。
  • セッションが7日間非アクティブになった後、新しいJWTトークンを渡す前に認証が必要です。

これにより、たとえば、ユーザーがパスワードを変更した後に認証を要求できます。

14
Sjoerd

ユーザーが認証されると、7日間構成されたアクセストークンを取得できます。ただし、必要に応じてアクセスを取り消すのが難しくなるため、セキュリティ面でのベストプラクティスにはなりません。もちろん、これはニーズによって異なりますが、ベストプラクティスは、更新トークンを取得し、それを使用して、期間ごとにアクセストークンを更新することです。

5
Igor Liv

私の設定は..

誰かがログインしたら、カスタムフィールドを使用して、expが5日のJWTを生成し、useExpを10分にします。

誰かが認証済みのリクエストを行う場合、新しいトークンを要求しない限り、useExpは将来のものでなければなりません。

誰かが新しいトークンに対して認証されたリクエストを行うとき、useExpは過去のものでもかまいませんが、expは未来のものでなければなりません。有効な場合は、ログインしたかのように新しいトークンを生成します。

両方のexpが過去の場合は、認証されていないリクエストを行って、メールとパスワードでログインする必要があります。

5
Michael Baldry

セッション管理にJWTを利用しているようです。あなたが取り組んでいるのは、この認証スキームで発生する典型的な問題です。 JWTは、セッション管理要件には理想的ではありません。権限を取り消したりログアウトしたりするために、セッションをより長く存続させるには(他の説明のように)さまざまなトリックが必要です。これは、この設定で直面する必要がある トレードオフの概要を説明する記事 です。

妥協点を受け入れることができれば、JWTはセッション管理で問題ありません。より詳細な制御が必要な場合は、Cookieベースのセッション管理スキームをご覧ください。

3
Daniel Szpisjak

通常、JWTの場合、15分まで有効なaccessトークンと、それよりも長い間(24時間など)有効なrefreshトークンがあります。

APIエンドポイントにアクセスするために、ブラウザーはaccessトークンのみを送信します。 401 HTTPステータスを受信すると、refreshトークンを指定のエンドポイントに送信してトークンを更新し、2つの新しいトークン(更新とアクセスの両方)を取得して続行します。

ここに素晴らしいものがあります。両方のトークンには有効期限があり、両方のトークンが署名されています。したがって、トークン固有の検証を実行する前に、同じロジックを使用してすべてのトークンを(アクセスまたは更新に関係なく)常に検証する必要があります。

3
keithRozario

2つのJWT( @ keithRozario@ Sjoerd )または1つのJWTで2つのフィールド( @ Michael Baldry@ Laurens Rietveld ):

2つのJWTまたは2つのフィールドを呼び出しましょうaccess tokenおよびrefresh token

ハッカーが何らかの方法でアクセストークンを取得した場合、リフレッシュトークンも漏洩し、ハッカーはリフレッシュトークンを使用してアクセストークンを要求できる可能性が非常に高くなります。その意味で、アクセストークンの短い有効期限は、ここではあまり役に立ちません。

someone トークンを更新するすべてのリクエストを確認するために、失効リストをサーバー側で維持することを提案しました。まあ、人々がJWTを使用する主な理由の1つは、サーバーがセッションを維持する必要がないため、よりスケーラブルであることです。失効リストを維持するという考えは、この利点を壊しませんか?

私が考えることができる1つの方法は、アクセストークンに別のフィールドを追加して、トークンの更新をたとえば30分に制限することです。したがって、アクセストークンと更新トークンの両方がリークされた場合でも、損失を軽減できます。しかし、それが良い習慣かどうかはわかりません。

1
Krist Jin