1. ホーム
  2. security

[解決済み] JWT(JSONウェブトークン)の有効期限を自動的に延長する機能

2022-03-16 04:52:47

質問内容

新しいREST APIにJWTベースの認証を実装したいのですが、どうすればよいですか?しかし、トークンに有効期限が設定されているため、自動的に有効期限を延長することは可能でしょうか?私は、ユーザーがその期間にアプリケーションを積極的に使用していた場合、X分ごとにサインインする必要があることを望んでいません。それは大きなUXの失敗となるでしょう。

しかし、有効期限を延長すると、新しいトークンが作成されます(古いトークンは有効期限が切れるまで有効です)。そして、リクエストのたびに新しいトークンを生成するのは、私には馬鹿げているように聞こえます。複数のトークンが同時に有効である場合、セキュリティ上の問題があるように聞こえます。もちろん、ブラックリストを使って古い使用済みのものを無効にすることはできますが、トークンを保存しておく必要があります。JWTの利点の1つは、保存が不要なことです。

Auth0がそれを解決する方法を見つけました。JWTトークンだけでなく、リフレッシュトークンも使っているようです。 https://auth0.com/docs/tokens/refresh-tokens

しかし、これを(Auth0なしで)実装するには、リフレッシュトークンを保存し、その有効期限を管理する必要があります。では、本当のメリットは何でしょうか?トークンは1つだけにして(JWTではない)、有効期限をサーバーで管理するのはどうでしょうか?

他の選択肢はないのでしょうか?JWTの使用はこのシナリオに適していないのでしょうか?

解決方法は?

私はAuth0で働いており、リフレッシュトークン機能の設計に携わっています。

すべてはアプリケーションの種類によりますが、ここでは私たちが推奨するアプローチを紹介します。

ウェブアプリケーション

有効期限が切れる前にトークンをリフレッシュするのが良いパターンです。

トークンの有効期限を1週間に設定し、ユーザーがウェブアプリケーションを開くたびに、また1時間ごとにトークンをリフレッシュしてください。もしユーザーが1週間以上アプリケーションを開かなかった場合、再度ログインする必要がありますが、これはウェブアプリケーションのUXとして許容されるものです。

トークンをリフレッシュするには、有効で期限切れでないJWTを受け取り、新しい有効期限フィールドを持つ同じ署名付きJWTを返す新しいエンドポイントがAPIに必要です。それから、ウェブアプリケーションはトークンをどこかに保存します。

モバイル/ネイティブアプリケーション

ほとんどのネイティブアプリケーションは、ログインを一度だけしか行いません。

リフレッシュ・トークンは有効期限がなく、常に有効なJWTと交換することができるという考え方です。

有効期限のないトークンの問題点は 決して は絶対にない、という意味です。携帯電話を失くしたらどうするのですか?ですから、何らかの方法でユーザーを識別する必要があります。また、アプリケーションはアクセスを取り消す方法を提供する必要があります。そこで、「maryo's iPad"」というように、デバイスの名前を使うことにしました。そして、ユーザーはアプリケーションにアクセスし、"maryo's iPad"へのアクセスを取り消すことができます。

もうひとつの方法は、特定のイベント発生時にリフレッシュ・トークンを失効させるというものです。興味深いイベントは、パスワードの変更です。

このようなユースケースではJWTは役に立たないと考えているので、ランダムに生成した文字列を使い、それを我々の側で保存しています。