質問

ドラフトOAuth 2.0プロトコルのセクション4.2は、認証サーバーが両方を返すことができることを示しています access_token (リソースで自分自身を認証するために使用されます)と refresh_token, 、純粋に新しいものを作成するために使用されます access_token:

https://tools.ietf.org/html/rfc6749#section-4.2

なぜ両方を持っているのですか?なぜ作ってみませんか access_token 最後に最後に refresh_token 持っていない refresh_token?

役に立ちましたか?

解決

リフレッシュトークンのアイデアは、アクセストークンが侵害された場合、それが短命であるため、攻撃者はそれを悪用するための限られたウィンドウを持っているということです。

攻撃者はアクセストークンを獲得するためにリフレッシュトークンに加えてクライアントIDと秘密を必要とするため、侵害された場合、トークンを更新することは役に立たない。

そうは言っても, 、Authorization Serverとリソースサーバーの両方へのすべての呼び出しがSSLを介して行われているため - アクセス/更新トークンを要求する際の元のクライアントIDと秘密を含む - アクセストークンがどのように「妥協できる」かについてはわかりません長寿命のリフレッシュトークンとクライアント/シークレットの組み合わせ。

もちろん、これは、承認サーバーとリソースサーバーの両方を制御しない実装とは異なります。

これは、リフレッシュトークンの使用について話している良いスレッドです: OAuthアーカイブ.

上記からの引用、更新トークンのセキュリティ目的について話している:

リフレッシュトークン...長寿命のアクセス_token漏れのリスクを軽減します(不安定なリソースサーバー、ベータまたはコード化されたリソースサーバーアプリのログファイルのクエリパラメーション、JS SDKクライアントがAccess_Tokenを入れる非HTTPSサイトのJS SDKクライアントはクッキーなど)

他のヒント

Catchdaveが提供するディスカッションへのリンクには別のものがあります 有効なポイント (オリジナル、デッドリンク) Dick Hardtによって作られました。上記のものに加えて、ここで言及する価値があると思います。

更新トークンの私の回想は、セキュリティと取り消しのためでした。 <...>

取り消し: アクセストークンが自己閉じ込められている場合、新しいアクセストークンを発行しないことで承認を取り消すことができます。リソースは、アクセストークンが有効かどうかを確認するために承認サーバーを照会する必要はありません。これにより、アクセストークンの検証が簡素化され、複数の承認サーバーが簡単に拡張およびサポートできるようになります。アクセストークンが有効であるが、承認が取り消される時間の窓があります。

実際、Resource ServerとAuthorization Serverが同じエンティティであり、ユーザーとそれらのいずれかとの間の接続が(通常)等しく安全な状況では、アクセストークンとは別にリフレッシュトークンを維持する意味はありません。

引用符で述べたように、更新トークンの別の役割は、システムを同時にスケーラブルに保ちながら、ユーザーが(たとえばプロファイルのWebインターフェイスを介して)いつでもアクセストークンを取り消すことができることです。 。

一般に、トークンは、サーバーのデータベース内の特定のレコードを指すランダム識別子であるか、それ自体にすべての情報を含めることができます(確かに、この情報に署名する必要があり、 マック, 、 例えば)。

長寿命のアクセストークンを備えたシステムがどのように機能するか

サーバーを使用すると、クライアントはトークンを発行することにより、事前に定義されたスコープセット内のユーザーのデータにアクセスできます。トークンを取り消し可能に保ちたいので、「取り消された」というフラグが設定または設定されているフラグとともに、データベースにトークンを保存する必要があります(そうでなければ、自己完結型トークンでそれをどうしますか?)データベースは len(users) x len(registered clients) x len(scopes combination) 記録。すべてのAPI要求は、データベースを押す必要があります。 O(1)を実行するそのようなデータベースにクエリを作成することは非常に些細なことですが、単一の障害自体がシステムのスケーラビリティとパフォーマンスにマイナスの影響を与える可能性があります。

長寿命の更新トークンと短命のアクセストークンを備えたシステムがどのように機能するか

ここでは、2つのキーを発行します。データベースに対応するレコードを使用したランダムリフレッシュトークンと、とりわけ有効期限のあるタイムスタンプフィールドを含む自己完結型アクセストークンに署名しました。

アクセストークンは自己完結型であるため、その有効性を確認するためにデータベースをまったく押す必要はありません。私たちがしなければならないのは、トークンをデコードし、署名とタイムスタンプを検証することです。

それにもかかわらず、私たちはまだ更新トークンのデータベースを保持する必要がありますが、このデータベースへのリクエストの数は一般にアクセストークンの寿命によって定義されます(寿命が長いほど、アクセス率が低くなります)。

特定のユーザーからのクライアントのアクセスを取り消すには、対応する更新トークンを「撤回」(または完全に削除する)とマークし、新しいアクセストークンの発行を停止する必要があります。ただし、更新トークンが取り消されたウィンドウがあることは明らかですが、そのアクセストークンはまだ有効かもしれません。

トレードオフ

更新トークンは、アクセストークンデータベースのSPOF(単一の障害点)を部分的に排除しますが、明らかな欠点があります。

  1. 窓"。イベント「ユーザーがアクセスを取り消す」と「アクセスが取り消されることが保証されている」の間の時間枠。

  2. クライアントロジックの合併症。

    それなし トークンを更新します

    • アクセストークンでAPIリクエストを送信します
    • アクセストークンが無効である場合、失敗し、ユーザーに再認証を依頼します

    トークンを更新します

    • アクセストークンでAPIリクエストを送信します
    • アクセストークンが無効な場合は、更新トークンを使用して更新してみてください
    • 更新リクエストが合格した場合、アクセストークンを更新し、最初のAPIリクエストを再送信します
    • 更新要求が失敗した場合は、ユーザーに再認識を求めてください

この答えが理にかなっており、誰かがより思慮深い決定を下すのに役立つことを願っています。また、GitHubやFoursquareを含むいくつかの有名なOAUTH2プロバイダーが、トークンを更新せずにプロトコルを採用していることにも注意したいと思います。

上記のすべての素晴らしい回答にもかかわらず、私はバイヤーの保護と詐欺を調べたときに以前にeBayで働いていたセキュリティマスターの学生およびプログラマーとして、アクセストークンとリフレッシュトークンがあると言うことができます。 最高のバランス の嫌がらせのユーザーの間 頻繁 ユーザー名/パスワード入力と権限を手に保ち、潜在能力へのアクセスを取り消す 乱用 あなたのサービスの。

このようなシナリオを考えてください。 3600秒のアクセストークンのユーザーを発行し、1日ほど長くトークンを更新します。

  1. ユーザーはaです 良い ユーザー、彼は家にいて、あなたのウェブサイトの買い物や彼のiPhoneで検索することをやり取り/オフにします。彼のIPアドレスは変更されず、サーバーの負荷が非常に低くなります。 3-5ページのように毎分リクエストします。アクセストークンの3600秒が終了したとき、彼は更新トークンを備えた新しいものを必要とします。私たちは、サーバー側で、彼のアクティビティの履歴とIPアドレスを確認し、彼が人間であり、自分で振る舞うと思います。私たちは彼に新しいアクセストークンを許可し、サービスを使い続けます。ユーザーは、1日の寿命のリフレッシュトークン自体に到達するまで、ユーザー名/パスワードを再度入力する必要はありません。

  2. ユーザーはaです 不注意 ユーザー。彼は住んでいます 米国ニューヨーク 彼のウイルスプログラムをシャットダウンし、ハッカーによってハッキングされました ポーランド. 。ハッカーがアクセストークンを手に入れてトークンを更新すると、彼はユーザーになりすましてサービスを使用しようとします。しかし、短命のアクセストークンの有効期限が切れた後、ハッカーがアクセストークンを更新しようとすると、サーバー上の私たちはユーザーの動作履歴の劇的なIPの変化に気付きました(この男はアメリカでログインし、ポーランドでアクセスを更新することに気付きました。わずか3600年代後???)。更新プロセスを終了し、更新トークン自体を無効にし、ユーザー名/パスワードを再度入力するように求めます。

  3. ユーザーはaです 悪意のある ユーザー。彼は、ロボットを使用して毎分1000回APIを呼び出すことで、サービスを悪用することを目的としています。彼は3600秒後にアクセストークンをリフレッシュしようとするとき、私たちは彼の行動に気づき、彼が人間ではないかもしれないと思うまで、そうすることができます。更新プロセスを拒否して終了し、ユーザー名/パスワードを再度入力するように依頼します。これは、彼のロボットの自動フローを壊す可能性があります。少なくとも彼は不快になります。

トークンは、盗まれたトークンの仕事、ユーザーエクスペリエンス、潜在的なリスクのバランスを取ろうとすると、完全に動作していることがわかります。サーバー側の時計犬は、IPの変更、API呼び出しの頻度以上のものをチェックして、ユーザーが優れたユーザーであるかどうかを判断できます。

別の言葉は、基本的なIPウォッチドッグまたはその他の測定値を呼び出す各APIに実装することにより、盗まれたトークン/サービスの乱用の損傷制御を制限することもできることです。ただし、ユーザーに関する記録を読み書きする必要があり、サーバーの応答が遅くなるため、これは高価です。

これらの回答のどちらも、リフレッシュトークンが存在するコアの理由に到達しません。明らかに、クライアントの資格情報をAuthサーバーに送信することで、いつでも新しいアクセストークン/リフレッシュトークンペアを取得できます。

したがって、更新トークンの唯一の目的は、ワイヤーを介して送信されるクライアント資格情報の使用をAUTHサービスに制限することです。アクセストークンのTTLが短いほど、クライアントの資格情報を使用して新しいアクセストークンを取得するために使用する必要があるため、攻撃者がクライアントの資格情報を妥協する機会が増えます(ただし、とにかく非常に難しい場合があります。非対称暗号化がそれらを送信するために使用されています)。したがって、1つの使用されたリフレッシュトークンがある場合は、クライアントの資格情報を損なうことなく、アクセストケンのTTLを任意に小さくすることができます。

混乱を解消するには、 クライアントの秘密 そしてその 利用者パスワード, 、非常に異なっています。

クライアント アプリ/ウェブサイト/プログラム/...、サーバーに裏付けられている、 認証する a ユーザー サードパーティ認証サービスを使用します。クライアントの秘密は、このクライアントと認証サーバーの両方に知られている(ランダム)文字列です。この秘密を使用して、クライアントは認証サーバーで自分自身を識別し、受信できます 許可 アクセストークンをリクエストします。

最初のアクセストークンを取得してトークンを更新するには、必要なのは次のとおりです。

  • ユーザーID
  • ユーザーパスワード
  • クライアントID
  • クライアントの秘密

しかし、更新されたアクセストークンを取得するには クライアント 次の情報を使用します。

  • クライアントID
  • クライアントの秘密
  • 更新トークン

これは違いを明確に示しています。リフレッシュすると、クライアントはクライアントの秘密を使用してアクセストークンを更新する許可を受け取るため、更新トークンを使用してユーザーを再認証できます。 代わりは ユーザーID +パスワードの。これにより、ユーザーがパスワードを再入力する必要があることを効果的に妨げます。

これはまた、クライアントIDと秘密が知られていないため、更新トークンを失うことは問題ではないことを示しています。また、クライアントIDとクライアントの秘密の秘密を維持することも示しています 重要.

この答えは、OAUTH 2標準ボディメーリングリストを介してJustin Richerからのものです。これは彼の許可を得て投稿されています。


更新トークンの寿命は、(AS)認証サーバーにまで及びます。それらは期限切れになり、取り消される可能性があります。リフレッシュトークンとアクセストークンの違いはオーディエンスです。リフレッシュトークンは認証サーバーに戻るだけです。アクセストークンは(RS)リソースサーバーに移動します。

また、アクセストークンを取得するだけでは、ユーザーがログインしているというわけではありません。実際、ユーザーはもうそこにいないかもしれません。これは、実際には更新トークンの意図したユースケースです。アクセストークンを更新すると、ユーザーに代わってAPIにアクセスできます。ユーザーがそこにいるかどうかはわかりません。

OpenID Connectは、アクセストークンからユーザー情報を提供するだけでなく、IDトークンも提供します。これは、ASまたはRSではなく、クライアント自体に向けられた別のデータです。 OIDCでは、新鮮なIDトークンを取得できる場合にのみ、プロトコルによって実際に「ログイン」した人を考慮する必要があります。リフレッシュしても十分ではありません。

詳細については、お読みください http://oauth.net/articles/authentication/

クライアントは多くの点で妥協することができます。たとえば、携帯電話をクローンすることができます。アクセストークンの有効期限が切れるということは、クライアントが承認サーバーに再認証することを余儀なくされることを意味します。再認証中、Authorization Serverは他の特性を確認できます(IOWはAdaptive Access Managementを実行します)。

リフレッシュトークンは、クライアントの再認証のみを可能にします。これにより、再認可されると、多くの人がむしろそうでないことを示しているユーザーとのダイアログを強制します。

リフレッシュトークンは、通常のWebサイトが1時間ほど後にユーザーを定期的に再認証することを選択するのと同じ場所に本質的に適合します(銀行サイトなど)。ほとんどのソーシャルWebサイトはWebユーザーを再認証しないため、現在高度に使用されていません。なぜ彼らはクライアントを再認証するのでしょうか?

BTの回答をさらに簡素化するには:通常、ユーザーに資格情報を再度入力する必要がない場合に、トークンを更新するが、パワーが許可を取り消すことができるようにしたい場合(更新トークンを取り消すことで)

アクセストークンを取り消すことはできません。更新トークンだけです。

refresh_tokenがrefresh_tokenを持っていない限り、アクセス_tokenを長続きさせないのはなぜですか?

優れた答えに加えて、他の人が提供していることを提供しています。リフレッシュトークンを使用する別の理由があります。

各トークンには、ユーザー名、その役割、またはクレームを作成したプロバイダーからのものを含めることができるクレームが含まれています。トークンが更新されると、これらの主張は更新されます。

トークンをより頻繁に更新すると、明らかにアイデンティティサービスにより多くの負担をかけていますが、より正確で最新のクレームが得られています。

あなたが作ると仮定します access_token 最後に長く、持っていません refresh_token, 、だから一日で、ハッカーはこれを手に入れます access_token そして、彼はすべての保護されたリソースにアクセスできます!

しかし、あなたが持っているなら refresh_token, 、 access_tokenのライブタイムは短いので、ハッカーはあなたをハッキングするのが難しいです access_token 短期間後に無効になるからです。Access_token 使用するだけでなく、再取得することができます refresh_token によっても client_idclient_secret, 、ハッカーにはありません。

更新トークンは承認サーバーによって保持されます。アクセストークンは自己完結型であるため、リソースサーバーは、検証の場合に検索の努力を節約することなく、保存せずに検証できます。議論に欠けているもう1つのポイントは、RFC6749#ページ55からです

「たとえば、承認サーバーは、新しいリフレッシュトークンがすべてのアクセストークン更新応答で発行される更新トークンローテーションを使用できます。以前の更新トークンは無効ですが、認証サーバーによって保持されます。攻撃者と合法的なクライアントの両方が、そのうちの1人が無効な更新トークンを提示し、承認サーバーに違反を通知します。」

リフレッシュトークンを使用することの全体的なポイントは、攻撃者が何らかの形で更新トークン、クライアントID、秘密の組み合わせを取得したとしてもだったと思います。攻撃者から新しいアクセストークンを取得するためのその後の呼び出しを使用すると、更新のリクエストがすべて新しいアクセストークンと更新トークンになった場合に備えて追跡できます。

この答えは、2つの上級開発者(John BraytonとDavid Jennes)の助けによってまとめられています。

更新トークンを使用する主な理由は、攻撃面を減らすことです。

更新キーがないとし、この例を見てみましょう。

建物には80のドアがあります。すべてのドアは同じキーで開かれます。キーは30分ごとに変更されます。

私がハッカーであり、あなたの鍵を手に入れたら、30分の終わりに、キーメーカーにそれを宅配して、新しいキーを手に入れます。キーの変化に関係なく、すべてのドアを継続的に開くことができます。

質問:30分間、キーに対していくつのハッキングの機会がありましたか?キーを使用するたびに80のハッキングの機会がありました(これをネットワークリクエストを行い、アクセストークンを渡して自分自身を識別すると考えてください)。これが80倍の攻撃面です。

それでは、同じ例を見てみましょうが、今回は更新キーがあると仮定しましょう。

建物には80のドアがあります。すべてのドアは同じキーで開かれます。キーは30分ごとに変更されます。私がハッカーであり、あなたのキーを手に入れた場合、30分間使用できますが、30分の終わりにキーメーカーに送信することは価値がありません。もしそうなら、キーメーカーはこのキーが期限切れになっていると言うでしょう。私のハックを拡張できるようにするには、宅配便業者をキーメーカーにハッキングする必要があります。宅配便には明確なキーがあります(これは更新トークンと考えてください)。

質問:30分間、宅配便の機会はいくつありましたか? 80?いいえ。ハッキングの機会しかありませんでした。宅配便業者はキーメーカーと通信します。これが1倍の攻撃面です。キーに対して80のハッキングの機会がありましたが、30分後には良くありません。


サーバーは、資格情報と(通常)JWTの署名に基づいてアクセストークンを確認します。

アクセストークンの漏れは悪いですが、失効すると攻撃者には役に立たなくなります。リフレッシュトークンの漏れははるかに悪いですが、おそらくそれは少ないでしょう。 (リフレッシュトークンの漏れの可能性がアクセストークンの漏れの可能性よりもはるかに低いかどうかを疑問視する余地があると思いますが、それはアイデアです。)

ポイントは、アクセストークンがすべてのリクエストに追加されるのに対し、更新トークンは更新フロー中にのみ使用されるため、MITMがトークンを見る可能性は低いことです

頻度は攻撃者に役立ちます。 ハートベッド- SSLの潜在的なセキュリティの欠陥、クライアントの潜在的なセキュリティ欠陥、およびサーバーの潜在的なセキュリティ欠陥がすべて漏れを可能にします。

さらに、承認サーバーが他のクライアント要求を処理するアプリケーションサーバーとは別の場合、そのアプリケーションサーバーは更新トークンを表示することはありません。それはそれほど長く生きていないアクセストークンのみが表示されます。

コンパートメント化はセキュリティに適しています。


リフレッシュトークンは何ではありませんか?

リフレッシュトークンを介してアクセスレベルを更新/取り消す機能は、更新トークンを使用することを選択する副産物です。そうしないと、スタンドアロンアクセストークンを取り消すか、有効期限が切れたときにアクセスレベルを変更し、ユーザーが新しいトークンを取得することができます。

各ユーザーが1つ以上のロールにリンクされ、各役割が1つ以上のアクセス権限にリンクされているシステムを考えてみましょう。この情報は、APIパフォーマンスを向上させるためにキャッシュできます。しかし、その後、ユーザーと役割の構成に変更がある可能性があります(たとえば、新しいアクセスが許可されたり、現在のアクセスが取り消される場合があります)。これらはキャッシュに反映される必要があります。

そのような目的のために、アクセスと更新トークンを使用できます。 APIがアクセストークンで呼び出されると、リソースサーバーはアクセス権のキャッシュをチェックします。新しいアクセス助成金がある場合、すぐに反映されません。アクセストークンの有効期限が切れ(たとえば30分で)、クライアントが更新トークンを使用して新しいアクセストークンを生成すると、DBからの更新されたユーザーアクセス正しい情報でキャッシュを更新できます。

つまり、アクセストークンを使用してすべてのAPI呼び出しから、更新トークンを使用してアクセストークン生成のイベントに高価な操作を移動できます。

まず、クライアントは認証助成金を提供することにより、認証サーバーで認証されます。

次に、クライアントは、アクセストークンを提供することにより、保護されたリソースのリソースサーバーを要求します。

リソースサーバーはアクセストークンを検証し、保護されたリソースを提供します。

クライアントは、アクセストークンを付与することにより、リソースサーバーに保護されたリソースリクエストを行います。リソースサーバーは、有効な場合はリソースサーバーが検証し、リクエストを提供します。このステップは、アクセストークンが期限切れになるまで繰り返し続けます。

アクセストークンの有効期限が切れる場合、クライアントは認証サーバーで認証され、更新トークンを提供することにより新しいアクセストークンを要求します。アクセストークンが無効である場合、リソースサーバーはクライアントに無効なトークンエラー応答を送り返します。

クライアントは、更新トークンを付与することにより、認証サーバーで認証されます。

承認サーバーは、クライアントを認証することにより更新トークンを検証し、有効な場合は新しいアクセストークンを発行します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top