JWT更新トークンフロー


129

私はモバイルアプリを作成していて、認証にJWTを使用しています。

これを行う最善の方法は、JWTアクセストークンと更新トークンをペアにして、アクセストークンを必要なだけ頻繁に期限切れにできるようにすることです。

  1. 更新トークンはどのようなものですか?ランダムな文字列ですか?その文字列は暗号化されていますか?別のJWTですか?
  2. 更新トークンは、アクセスのためにユーザーモデルのデータベースに格納されますよね?この場合は暗号化する必要があるようです
  3. ユーザーのログイン後に更新トークンを送り返し、クライアントに別のルートにアクセスさせてアクセストークンを取得させますか?

3
更新トークンを使用している場合は、ユーザーがUIでそれらを無効にする機能を提供する必要があります。また、たとえば1か月間使用されない場合は、それらを自動的に期限切れにすることをお勧めします。
Vilmantas Baranauskas、2015年

1
@jtmarmon:クライアント側で更新トークンをどのように保存しますか?安全性のあるAndroidデバイスですか?
j10 2017年

回答:


39

JWTと更新トークンに関するものであるため、これはOAuth 2.0に関するものであると仮定します...:

  1. アクセストークンと同じように、原則として、リフレッシュトークンは、説明するすべてのオプションを含めて何でもかまいません。JWTは、承認サーバーがステートレスになりたい場合、またはそれを提示するクライアントに何らかの「所有証明」セマンティクスを適用したい場合に使用できます。更新トークンはアクセストークンとは異なり、リソースサーバーには提示されず、最初にそれを発行した承認サーバーにのみ提示されるため、JWTs-as-access-tokensの自己完結型検証の最適化では、更新トークンを保持しない

  2. データベースのセキュリティ/アクセスに依存します。他の関係者/サーバー/アプリケーション/ユーザーがデータベースにアクセスできる場合は、そうです(ただし、暗号化キーをどこにどのように保存するかによって、距離は異なります...)

  3. 承認サーバーは、クライアントがアクセストークンを取得するために使用する許可に応じて、アクセストークンと更新トークンの両方を同時に発行できます。仕様には、標準化された各助成金の詳細とオプションが含まれています


31
2.更新トークンのハッシュをデータベースに保存してから、ユーザーの更新トークンのハッシュと保存したハッシュを比較する必要があります。「プレーンテキストのパスワードをデータベースに保存しない」というルールはここにあります。ユーザーのために作成したランダムなパスワードのようなトークンを検討してください。
ローマー2017

2
また、セキュリティを強化したい場合は、更新トークンのローテーションも実行します。これの重要性は、すでにITEF RFC 6749で言及されています。正しく実装されている場合、これはトークンの盗難のシナリオを特定するのにも役立ちます。つまり、リフレッシュトークンが攻撃者に盗まれました。より詳しい説明をお探しの場合は、このリンクにアクセス
Bhumil Sarvaiya

81

JWTアクセストークンを取り消す手順は次のとおりです。

  1. ログインしたら、クライアントに応答して2つのトークン(アクセストークン、更新トークン)を送信します。
  2. アクセストークンの有効期限は短くなり、更新の有効期限は長くなります。
  3. クライアント(フロントエンド)は、更新トークンをローカルストレージに保存し、アクセストークンをCookieに保存します。
  4. クライアントは、APIを呼び出すためにアクセストークンを使用します。ただし、有効期限が切れたら、ローカルストレージから更新トークンを選択し、認証サーバーAPIを呼び出して新しいトークンを取得します。
  5. 認証サーバーには、更新トークンを受け入れてその有効性をチェックし、新しいアクセストークンを返すAPIが公開されます。
  6. 更新トークンの有効期限が切れると、ユーザーはログアウトされます。

詳細が必要な場合はお知らせください。コード(Java + Springブート)も共有できます。

あなたの質問のために:

Q1:有効期限が長く、クレームが少ない別のJWTです。

Q2:データベースにはありません。バックエンドはどこにも保存しません。彼らは、秘密/公開鍵でトークンを復号化し、有効期限でそれを検証します。

Q3:はい、正しい


28
JWTはに格納しlocalStoragerefreshTokenはに格納する必要があると思いますhttpOnly。をrefreshToekn使用して新しいJWTを取得できるため、特に注意して処理する必要があります。
Tnc Andrei

2
httpOnlyに保存するとはどういう意味ですか?両方をlocalStorageに保存しないのはなぜですか?
ジェイ

8
リフレッシュトークンを使用する利点がありません。アクセストークンの有効性を拡張するのと同じではありませんか?
user2010955

3
@Jay Microsoft Developer Networkによると、HttpOnlyはSet-Cookie HTTP応答ヘッダーに含まれる追加のフラグです。Cookieの生成時にHttpOnlyフラグを使用すると、クライアント側のスクリプトが保護されたCookieにアクセスするリスクを軽減できます(ブラウザーがそれをサポートしている場合)。
shadow0359

23
#2は非常に不正確です。更新トークンはサーバー側に保存する必要があります。JWTの「自己完結型」プロパティを更新トークンに利用しないでください。これを行うと、秘密鍵を変更する以外に更新トークンを取り消す方法がなくなります。
Jai Sharma

26

JWTのNode.jsとリフレッシュトークンを使用したこの実装に基づいています

1)この場合、彼らはuidを使用し、それはJWTではありません。トークンを更新すると、更新トークンとユーザーが送信されます。JWTとして実装する場合は、JWTの内部にあるため、ユーザーを送信する必要はありません。

2)別のドキュメント(表)でこれを実装します。ユーザーはさまざまなクライアントアプリケーションにログインでき、アプリごとに更新トークンを取得できるため、これは私にとって意味があります。ユーザーが1つのアプリがインストールされているデバイスを紛失した場合、そのデバイスの更新トークンは、ログインしている他のデバイスに影響を与えることなく無効化できます。

3)この実装では、アクセストークンと更新トークンの両方を使用してログインメソッドに応答します。それは私に正しい縫い目です。


「1)この場合、彼らはuidを使用します...」と言いましたが、UUIDを意味していましたか?
ozanmuyes

この単純な実装についてはどうですかiat
-JWT

@adoneseを送信JWTすることによって、refresh_token内部にあるという意味だけですか?その場合、OAuth RFC 6749 refresh_tokenはリソースサーバーに送信しないことを明示的に示しています(これはリソースサーバーに送信されJWTます):tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.