StackOverflowの質問のコメント OAuth2なぜアクセストークンの有効期限が切れるのですか? は、更新トークンの安全性に疑問を持っています。
このコメントは私の気持ちです:
したがって、インターセプトが通常のデータ要求のみをキャッチする限り、チャックはパケットスニッフィングからある程度の保護を提供します(チャックはアクセストークンのみを取得します)?それは少し弱いようです。ブラックハットは、ユーザーが新しいアクセストークンを要求するまで少し待つだけで、クライアントID、シークレット、およびリフレッシュトークンを取得します。
私たちは皆、何かを逃しているのか、それとも恐怖を誤った理解に基づいているのでしょうか?
または、有効期間が短いアクセストークンと更新トークンのセキュリティが、更新が「発生する可能性が低い」ときに発生するスニファの実行確率の想定に基づいていることは正しいですか。
アクセストークンが、プレーンなHTTP接続を介してアプリケーションの周囲で使用される可能性があります。したがって、攻撃者がそれを盗聴した場合、彼らは短期間のアクセスしかできません。これは、Webで標準的に行われていたことです。運がよければ、ログインはHTTPSで行われ、残りのセッションはプレーンHTTPで行われ、セッションIDはクリアテキストで送信されました。
更新トークンは認証サーバーにのみ送信されるため、HTTPSのみを適用する方が簡単です。つまり、攻撃者はこの接続を傍受できませんでした。
セキュリティ上の理由があります。refresh_tokenは承認サーバーとのみ交換されますが、access_tokenはリソースサーバーと交換されます。これにより、存続期間の長いaccess_tokenリークのリスクが軽減されます(安全でないリソースサーバーのログファイルのクエリパラメーター、ベータ版またはコードが不十分なリソースサーバーアプリ、https以外のサイトのJS SDKクライアントがcookieにaccess_tokenを置くなど)。 「1時間有効なアクセストークンと、1年間有効な更新トークンまたは完全に取り消されたアクセストークン」と「更新トークンなしで完全に取り消されたアクセストークン」では、
トークンを検証してクライアントに発行するサーバーがあるとします。
クライアント(ユーザー名とパスワードを送信)->サーバー
サーバー(資格情報を検証し、アクセストークンと更新トークンを返します)-> クライアント
クライアントはトークンを安全に保存し、サーバーへの以降のAPI呼び出しにアクセストークンを使用します(アクセストークンの有効期限が切れるまで)。アクセストークンの有効期限が切れると、クライアントはサーバーから401(無許可)HTTPコードを受信し、アクセストークンが無効であることを認識します。
次に、クライアントはそのリフレッシュトークンを使用して、サーバーから新しいアクセストークンとリフレッシュトークンを取得します。
侵害された場合の影響アクセストークン-攻撃者は、アクセストークンの有効期限が切れるまでデータにアクセスできます。
侵害された場合の影響リフレッシュトークン-攻撃者は新しいアクセスとリフレッシュトークンを取得して、被害者のアクセスを無効にする可能性があります。被害者がリフレッシュトークンを使用して新しいアクセストークンを取得しようとすると、リフレッシュトークンがすでに使用されているため失敗します。被害者は資格情報を使用して再度ログインする必要があり、トークンを再発行して、攻撃者の盗んだトークンを無効にします。
私はこの質問と重複しているとマークされた同様の質問に答えました。ただし、私は その質問に対する私の答え が、リフレッシュトークンが追加のセキュリティを提供する方法について、より強力な議論を提供していると感じています。つまり、更新トークンが危険にさらされている場合、それを検出して適切なアクション(認証トークンと更新トークンを無効にすること、ユーザーに資格情報を使用して再度ログインさせることなど)を実行する方がはるかに簡単です。言い換えると、更新トークンが使用されている場合、危険にさらされた資格情報をより速くシャットダウンできます。
認証プロバイダーの承認済みの回答がリソースプロバイダーとは異なるサーバーであることが多いため(リソースプロバイダーよりもHTTPSが必要である場合があります)、両方がHTTPSを備えた同じサーバーである場合でも、存続期間の短いアクセストークンと存続期間の長いリフレッシュトークンがあります。
考えてみてください。更新トークンを処理する場所はいくつありますか?クライアントまたはブラウザでは、現在のアクセストークンを検索する中央の場所にある必要があり、期限切れまたはリクエストが失敗した場合は、代わりに更新トークンを使用します(通常、サービスがSDKを提供する場合、これは潜在的なセキュリティの脆弱性を徹底的に確認できるSDK。認証プロバイダーでは、refresh_token付与タイプを処理するコードパスでのみ処理されます。更新トークンがログファイルに送信されたり、外部リポジトリに送信されたりしないことを証明したい場合、これは確認のために確認する必要のある非常に小さく管理しやすいコードのコレクションです。
逆に、アクセストークンは、クライアントの1か所(もう一度)でのみ使用され、リソースプロバイダーのeverywhereで使用されます。アプリに送信されるすべてのHTTPリクエストには、Authorizationヘッダーにヘッダーがあります。アクセストークンがログファイルに記録されないこと、および悪意のあるコードを使用してアクセストークンを https://myaccesstokenfarm.example.com にエクスポートしていないことを証明したい場合は、これは非常に大きな(一部のコードベースでは不可能に近い)タスクです。
ここでの一般的なセキュリティ原則は、攻撃面の減少です。更新トークンは、アクセストークンと同じように中間者攻撃から引き出される可能性がありますが、攻撃対象を1つのサーバー上の1つのURLと1つの実行コードパスのみに制限することで、はるかに簡単になります。その特定のリソースを保護するためのあなたの力のすべて。
任意の例として、HTTPS圧縮を有効にしている場合、API全体でBREACH攻撃に対して脆弱になる可能性があります。しかし、効率を上げるために圧縮をオンにしたいので、その可能性を備えています。ただし、承認エンドポイントでは、圧縮をオフにし、追加の手順を実行して、既知の攻撃に対する多層防御を確保します。