アクセストークンの有効期限が切れるのはなぜですか?


209

Google APIとOAuth2を使い始めたばかりです。クライアントが私のアプリを承認すると、「更新トークン」と有効期間の短い「アクセストークン」が与えられます。これで、アクセストークンの有効期限が切れるたびに、更新トークンをGoogleにPOSTして、新しいアクセストークンを取得することができます。

私の質問は、アクセストークンの有効期限が切れる目的は何ですか?更新トークンの代わりに、長持ちするアクセストークンが存在しないのはなぜですか?

また、更新トークンには有効期限がありますか?

参照アクセスGoogleのAPIへのOAuth 2.0を使用して GoogleののOAuth2のワークフロー詳細は。

回答:


226

これは実装に固有のものですが、一般的な考え方は、プロバイダーが短期のアクセストークンと長期のリフレッシュトークンを発行できるようにすることです。どうして?

  • 多くのプロバイダーは、セキュリティ面で非常に弱いベアラートークンをサポートしています。有効期間を短くして更新を要求することで、攻撃者が盗んだトークンを悪用できる時間を制限します。
  • 大規模な展開では、すべてのAPI呼び出しでデータベースルックアップを実行したくないため、代わりに、暗号化によって検証できる自己エンコードされたアクセストークンを発行します。ただし、これは、これらのトークンを取り消す方法がないため、短時間発行され、更新する必要があることも意味します。
  • 更新トークンには、より強力なクライアント認証が必要です。上記のアクセストークンとは異なり、通常はデータベースルックアップで実装されます。

4
2つの質問:1)モバイルアプリの場合、クライアント認証の要件により、アプリはより強力になりますか?client_secretはアプリケーションのソースコードの一部であるため、まったく秘密ではありません。アクセストークンもTLSを介してのみ共有される(そして、最初の箇条書きは適用されない)と仮定すると、追加のセキュリティはありますか?2)このすべてが私たちのシナリオに当てはまると仮定すると(TLSのみ、自己エンコードされた取り消し不可能なトークンはありません)、有効期限のないアクセストークンを発行しても問題ありませんか?
Thilo

4
ベアラートークンとは何ですか?更新トークンとアクセストークンとは何ですか?
allyourcode

7
@Thilo考えは、アクセストークンは取り消し可能である必要はないということです。Eranが指摘しているように、これにより、要求されたサービスは、データベースでアクセストークンを検索する必要なく<em> </ em>要求を処理するかどうかを決定できます。AFAICT、これは、更新トークンとアクセストークンを分離することの本当の利点です。
allyourcode

5
アクセス(無記名)トークンの有効期間はどのくらいですか?期限切れのベアラートークンを使用してリクエストを行うと、更新トークンは新しいベアラートークンを返します。同様に、誰かのトークンをCookieから盗んで、自分のCookieをそのトークンで偽装すると、それがサーバーに送信され、更新されて新しいものが送信されます。何を止めるの?IPアドレスやMACを言うのは無理です。
Suamere 2015

3
@Suamere、それはすでに説明されました。ベアラートークンは、認証データベースに影響を与えない暗号化プロセスによって検証されるため、リソースへの頻繁なアクセスに対してはるかに効率的です。更新トークンは、データベースがまだ有効であることを確認するためのデータベースのチェックを含むプロセスで検証されます。次に、Gmailの仕組みについて考えます。誰かが予期しない地理的な場所からアカウントにログインすると、アラートを受け取ることができます。現在有効な更新トークンがある可能性のあるすべての場所を確認できます。すべての場所からログアウトして、他のすべての更新トークンを無効にすることができます。
Bon

33

いくつかのシナリオは、oauth2(またはその他の認証)システムを設計する際のアクセストークンと更新トークンの目的、およびエンジニアリングのトレードオフを説明するのに役立ちます。

Webアプリのシナリオ

Webアプリのシナリオでは、いくつかのオプションがあります。

  1. 独自のセッション管理がある場合は、セッションIDサービスに対して、セッションIDに対してaccess_tokenとrefresh_tokenの両方を保存します。リソースへのアクセスが必要なユーザーからページがリクエストされた場合は、access_tokenを使用します。access_tokenの有効期限が切れている場合は、refresh_tokenを使用して新しいページを取得します。

誰かがなんとかセッションを乗っ取ったとしましょう。可能なことはページをリクエストすることだけです。

  1. セッション管理がない場合は、access_tokenをCookieに入れ、それをセッションとして使用します。次に、ユーザーがWebサーバーにページを要求するたびに、access_tokenを送信します。アプリサーバーは、必要に応じてaccess_tokenを更新できます。

1と2の比較:

1では、access_tokenとrefresh_tokenは、認証サーバー(この場合はgoogle)とアプリサーバーの間のネットワーク経由でのみ移動します。これは安全なチャネルで行われます。ハッカーはセッションを乗っ取ることができますが、彼らはあなたのウェブアプリと対話することしかできません。2では、ハッカーはaccess_tokenを奪い、ユーザーがアクセスを許可したリソースへの独自のリクエストを作成できます。ハッカーがaccess_tokenを手に入れても、リソースにアクセスできる短いウィンドウしかありません。

どちらの方法でも、refresh_tokenとclientid / secretはサーバーにしか認識されないため、Webブラウザーから長期間のアクセスを取得することはできません。

oauth2を実装していて、アクセストークンに長いタイムアウトを設定しているとしましょう。

1)では、アプリサーバーで非表示になっているため、短いアクセストークンと長いアクセストークンの間に大きな違いはありません。2)では、誰かがブラウザでaccess_tokenを取得し、それを使用して長期間にわたってユーザーのリソースに直接アクセスできます。

モバイルシナリオ

モバイルでは、私が知っているいくつかのシナリオがあります。

  1. clientid / secretをデバイスに保存し、デバイスのオーケストレーションがユーザーのリソースへのアクセス権を取得するようにします。

  2. バックエンドアプリサーバーを使用してclientid / secretを保持し、オーケストレーションを実行します。一種のセッションキーとしてaccess_tokenを使用し、クライアントとアプリサーバーの間で渡します。

1と2の比較

1)デバイスにclientid / secretを設定すると、それらはもう秘密ではありません。もちろん、ユーザーの許可を得れば、誰でも逆コンパイルして、まるで自分のように振る舞うことができます。access_tokenとrefresh_tokenもメモリ内にあり、侵害されたデバイスからアクセスされる可能性があります。つまり、ユーザーが認証情報を提供しなくても、誰かがアプリとして動作する可能性があります。このシナリオでは、refresh_tokenはaccess_tokenと同じ場所にあるため、access_tokenの長さはハッカビリティに影響しません。2)では、clientid / secretも更新トークンも危険にさらされています。ここで、access_tokenの有効期限の長さは、ハッカーがユーザーのリソースを入手した場合に、ユーザーのリソースにアクセスできる時間を決定します。

有効期限

ここでは、access_tokenの有効期限を、認証システムで保護している期間によって異なります。それがユーザーにとって特に価値のあるものである場合は、短くする必要があります。価値の低い何か、それは長くなることができます。

グーグルのような一部の人々は、refresh_tokenを期限切れにしません。Stackflowのようなものはそうします。有効期限の決定は、ユーザーの使いやすさとセキュリティの間のトレードオフです。更新トークンの長さは、ユーザーが返す長さに関連しています。つまり、更新をユーザーがアプリに戻る頻度に設定します。更新トークンが期限切れにならない場合、それらが取り消される唯一の方法は、明示的な取り消しによるものです。通常、ログオンは取り消されません。

長めのポストが役立つことを願っています。


モバイルシナリオについては、サーバーにクライアントIDを保存する場合は重要ではありません。したがって、他の誰でもアプリがサーバーにリクエストを送信でき、サーバーを介してユーザーのリソースにアクセスできるので、同じです
Amir Bar

trueですが、基盤となるトークンへのフルアクセスではなく、ユーザーが提供する機能へのアクセスしかできません。つまり、アプリになりすますことができます。多くの場合、トークンには幅広い権限を設定できますが、必要なのはサブセットのみです。バックエンドでトークンを保持すると、必要に応じてさらに制限がかかります。
Ed Sykes、2015

11

他の応答に加えて:

取得すると、アクセストークンは通常、クライアントから保護されたリソースサーバーへのすべての要求と共に送信されます。これにより、アクセストークンの盗用と再生のリスクが生じます(もちろん、アクセストークンのタイプが「ベアラー」であると想定します(最初のRFC6750で定義されています)。

実際の生活におけるそれらのリスクの例:

  • リソースサーバーは通常、分散アプリケーションサーバーであり、通常、承認サーバーと比較してセキュリティレベルが低くなっています(SSL / TLS構成が低い、強化が少ないなど)。一方、承認サーバーは通常、重要なセキュリティインフラストラクチャと見なされ、より厳格なセキュリティ強化の対象となります。

  • アクセストークンは、リソースサーバーまたはクライアントで診断目的で合法的に収集されたHTTPトレース、ログなどに表示される場合があります。これらのトレースは、パブリックまたはセミパブリックの場所(バグトレーサー、サービスデスクなど)で交換できます。

  • バックエンドRSアプリケーションは、多かれ少なかれ信頼できるサードパーティにアウトソーシングできます。

一方、リフレッシュトークンは通常、ワイヤ経由で2回だけ送信され、常にクライアントと認証サーバーの間で送信されます。トークン)。これは、傍受とリプレイの大幅に制限された機会です。

最後に、リフレッシュトークンは、侵害されたクライアントに対する保護があっても、ほとんど提供しません。


あなたはこれに多少触れましたが、トークンを取得する(または逆に意図せずに漏らす)ためのより大きな攻撃対象は、アプリケーションログまたは不当に追加されたリソースサービス(今日のMITM攻撃ではない)にあることを強調します。共通のAPIバックエンドのほぼすべての場所が、使用されるアクセストークンにアクセスできます(HttpRequestなどのオブジェクトにアクセスできる場合)。システム内の2つのコードパスのみが更新トークンにアクセスできます。これは、最初に更新トークンを生成し、それを新しいアクセストークンと交換するものです。これは、攻撃面での大きな違いです。
トム・ディブル

9

これは本質的にセキュリティ対策です。アプリが侵害された場合、攻撃者は短期間のアクセストークンにのみアクセスでき、新しいトークンを生成する方法はありません。

更新トークンも有効期限が切れますが、アクセストークンよりもはるかに長く存続するはずです。


45
しかし、攻撃者は更新トークンにもアクセスできないのですか?それを使用して新しいアクセストークンを作成できますか?
levi

10
@levi、ハッカーはリフレッシュトークンを使用して新しいアクセストークンを作成できません。新しいアクセストークンを生成するには、リフレッシュトークンとともにクライアントIDとクライアントシークレットが必要だからです。
2012

9
@Spike True、アプリにはクライアントIDとシークレットも埋め込まれていませんか?
アンディ

9
したがって、インターセプトが通常のデータ要求のみをキャッチする限り、チャックはパケットスニッフィングからある程度の保護を提供します(チャックはアクセストークンのみを取得します)?それは少し弱いようです。ブラックハットは、ユーザーが新しいアクセストークンを要求するまで少し待たなければならないだけで、クライアントID、シークレット、リフレッシュトークンを取得します。

3
これは私がここで遅らせているだけかもしれませんが、これがSSL経由で送信される場合、それはセキュリティの別の可能な層に追加されません。誰もがSSLとは何かを知っていると思います。
デイモンドレイク2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.