ここで受け入れられた答え OAuth2アクセストークンが期限切れになる理由 :
アクセストークンの暗号化されていない送信をサポートしていないと仮定すると、最初の箇条書きが処理されます。
取り消し可能なデータベースルックアップを実行しても問題がないと仮定すると、完全にランダムなアクセストークンが2番目のトークンを処理します。
モバイルアプリの場合、「登録時に取得したclient_idとclient_secretはアプリケーションのソースコードに埋め込まれているため、クライアント認証を強化することはできません。このコンテキストでは、client_secretは明らかにシークレットとして扱われません」。 ( Google )。それは3番目の懸念を取り除きます。
では、このシナリオで有効期間の短いアクセストークンと有効期間の長い更新トークンを分離することの利点は何ですか?有効期限が切れていないアクセストークンを発行し、更新トークンの部分全体を無視することは「大丈夫」ですか?
セキュリティ上の点で、更新トークンと有効期限が切れていないアクセストークンの違いは、承認サーバーへの追加の呼び出しが1つあることです。
攻撃者があなたの有効期限の切れていないアクセストークンにアクセスした場合、攻撃者はあなたのリソースサーバーを直接呼び出し、応答として機密データを取得できます。
彼があなたのリフレッシュトークンを盗んだ場合、彼は最初に認証サーバーを呼び出し、それに応じてアクセストークンを受け取る必要があります。次に、リソースサーバーに機密データを照会できます。
更新トークンを使用して認証サーバーからアクセストークンが要求されるたびに、OAuth 2仕様(少なくとも現時点では最新のドラフト)では、サーバーに クライアントIDを確認する)が必要です。トークンにバインドされている場合 、可能であれば。
クライアントシークレットを使用した通常のアプローチでは、オープンプラットフォームにインストールされているアプリケーションを明確に識別することはできないため、アプリケーションを実行しているプラットフォームは、これを行うためのメソッドを提供する必要があります。 Google例: Androidアプリケーションは開発者によって署名される必要があります。 GoogleAPIコンソール を使用してAndroidアプリケーションの認証情報を要求する場合、したがって、 アプリケーションの署名に使用した証明書の指紋 を指定する必要があり、クライアントIDのみを取得しますが、応答にはシークレットはありません。トークンを発行すると、Googleはアプリケーションが開発者によって承認されたかどうかを判断できます。彼の名前でトークンを要求します。
クライアントIDを確実に確認できない場合は、少なくとも場合によっては、更新トークンが盗まれたことを認識することができます。仕様には この例 :
クライアント認証が不可能な場合、承認サーバーは、更新トークンの不正使用を検出するために他の手段を展開する必要があります。
たとえば、認証サーバーは、アクセストークンの更新応答ごとに新しい更新トークンが発行される更新トークンローテーションを採用できます。以前の更新トークンは無効になりますが、許可サーバーによって保持されます。更新トークンが侵害され、その後攻撃者と正当なクライアントの両方によって使用された場合、そのうちの1つが無効な更新トークンを提示し、認証サーバーに違反を通知します。
有効期限が切れていないアクセストークンの最大の問題は、盗まれたトークンを置き換えるメカニズムがないことです。有効期限が切れていないアクセストークンにアクセスできる場合、私は事実上そのシステムのあなたです。トークンの有効期間が短く、有効期限が切れている場合は、盗まれたトークンを置き換えるメカニズムと、トークンを解読する必要があるウィンドウの制限があります。
パケットをクラックしてトークンを取得するのに3時間かかるとしましょう。しかし、アクセストークンは2時間しか有効ではありません。その後、アカウントに侵入できなくなるまでに、トークンが変更されたため、最初からやり直す必要があります。トークンの有効期限が切れていない場合、私はあなたのアカウントに完全にアクセスでき、トークンを削除して再認証を強制する以外に、トークンを置き換える方法はありません。