web-dev-qa-db-ja.com

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

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

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

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

Google OAuth2ワークフローの詳細については、 OAuth 2.0を使用してGoogle APIにアクセスする を参照してください。

202
levi

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

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

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

Webアプリのシナリオ

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

  1. 独自のセッション管理がある場合は、セッション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)とアプリサーバーの間の通信路上でのみ移動します。これは安全なチャネルで行われます。ハッカーはセッションをハイジャックする可能性がありますが、ハッカーはWebアプリとしか対話できません。 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もrefreshトークンも危険にさらされています。ここで、access_tokenの有効期限の長さは、ハッカーがユーザーのリソースにアクセスできた場合に、ハッカーがユーザーのリソースにアクセスできる時間を決定します。

有効期限

ここでは、access_tokenの有効期限の長さに関して、認証システムで保護しているものに依存します。ユーザーにとって特に価値のあるものであれば、短くする必要があります。価値の低いもの、もっと長くすることができます。

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

むしろ長い投稿が役立つことを願っています。

30
Ed Sykes

他の応答に加えて:

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

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

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

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

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

一方、リフレッシュトークンは通常、2回ワイヤを介して、およびalwaysクライアントと認証サーバー間でのみ送信されます。更新中にクライアントが使用した場合(以前の更新トークンを効果的に「期限切れにする」)。これは、劇的に傍受とリプレイの限られた機会です。

最後に考えたのは、Refresh Tokensは、侵害されたクライアントに対する保護があったとしてもごくわずかです。

9
Guillaume

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

更新トークンも有効期限が切れますが、アクセストークンよりもはるかに長く存続することになっています。

9