Google APIとOAuth2を使い始めたばかりです。クライアントがアプリを承認すると、「更新トークン」と短命の「アクセストークン」が与えられます。これで、アクセストークンの有効期限が切れるたびに、更新トークンをGoogleにPOSTできます。新しいアクセストークンが提供されます。
私の質問は、アクセストークンの期限が切れる目的は何ですか?更新トークンの代わりに長持ちするアクセストークンだけが存在できないのはなぜですか?
また、更新トークンの有効期限はありますか?
Google OAuth2ワークフローの詳細については、 OAuth 2.0を使用してGoogle APIにアクセスする を参照してください。
これは実装固有のものですが、一般的な考え方は、プロバイダーが短期間の更新トークンを使用して短期間のアクセストークンを発行できるようにすることです。どうして?
いくつかのシナリオは、アクセストークンとリフレッシュトークンの目的、およびoauth2(またはその他の認証)システムを設計する際の技術的なトレードオフを説明するのに役立ちます。
Webアプリのシナリオでは、いくつかのオプションがあります。
誰かがあなたのセッションをハイジャックすることをなんとか想像してみましょう。可能な唯一のことは、ページをリクエストすることです。
1と2の比較:
1では、access_tokenとrefresh_tokenは、承認サーバー(この場合はgoogle)とアプリサーバーの間の通信路上でのみ移動します。これは安全なチャネルで行われます。ハッカーはセッションをハイジャックする可能性がありますが、ハッカーはWebアプリとしか対話できません。 2では、ハッカーはaccess_tokenを取り去り、ユーザーがアクセスを許可したリソースへの独自のリクエストを作成できます。ハッカーがaccess_tokenを取得したとしても、リソースにアクセスできる短いウィンドウしかありません。
いずれにせよ、refresh_tokenとclientid/secretはサーバーにのみ認識されており、Webブラウザーから長期間アクセスすることはできません。
Oauth2を実装し、アクセストークンに長いタイムアウトを設定すると想像してください。
1)短いアクセストークンと長いアクセストークンは、アプリサーバーに隠されているため、ここではそれほど違いはありません。 2)では、誰かがブラウザでaccess_tokenを取得し、それを使用して長時間ユーザーのリソースに直接アクセスできます。
モバイルでは、私が知っているいくつかのシナリオがあります。
Clientid/secretをデバイスに保存し、デバイスがユーザーのリソースへのアクセスを取得するよう調整します。
バックエンドアプリサーバーを使用して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を期限切れにしません。スタックフローのようなものがあります。有効期限の決定は、ユーザーの使いやすさとセキュリティのトレードオフです。リフレッシュトークンの長さは、ユーザーが返す長さに関係しています。つまり、ユーザーがアプリに戻る頻度にリフレッシュを設定します。リフレッシュトークンの有効期限が切れない場合、失効させる唯一の方法は明示的な失効です。通常、ログオンは取り消されません。
むしろ長い投稿が役立つことを願っています。
他の応答に加えて:
通常、取得されたアクセストークンは、クライアントから保護されたリソースサーバーへのすべての要求とともに送信されます。これは、アクセストークンの盗み取りとリプレイのリスクを引き起こします(もちろん、アクセストークンのタイプが「ベアラー」(最初のRFC6750で定義されている)であると仮定します)。
実生活におけるこれらのリスクの例:
通常、リソースサーバーは分散アプリケーションサーバーであり、通常、承認サーバーと比較してセキュリティレベルが低くなります(SSL/TLS構成が低くなり、セキュリティが強化されるなど)。一方、承認サーバーは通常、重要なセキュリティインフラストラクチャと見なされ、より厳しいセキュリティ強化の対象となります。
アクセストークンは、リソースサーバーまたはクライアントで診断目的で合法的に収集されるHTTPトレース、ログなどに表示される場合があります。これらのトレースは、パブリックまたはセミパブリックの場所(バグトレーサー、サービスデスクなど)で交換できます。
バックエンドRSアプリケーションは、多かれ少なかれ信頼できるサードパーティに外部委託できます。
一方、リフレッシュトークンは通常、2回ワイヤを介して、およびalwaysクライアントと認証サーバー間でのみ送信されます。更新中にクライアントが使用した場合(以前の更新トークンを効果的に「期限切れにする」)。これは、劇的に傍受とリプレイの限られた機会です。
最後に考えたのは、Refresh Tokensは、侵害されたクライアントに対する保護があったとしてもごくわずかです。
これは本質的にセキュリティ対策です。アプリが侵害された場合、攻撃者は短命のアクセストークンにのみアクセスでき、新しいトークンを生成する方法はありません。
更新トークンも有効期限が切れますが、アクセストークンよりもはるかに長く存続することになっています。