リダイレクト URI とは何ですか?
リダイレクト URI は、コールバック URL またはリダイレクト URL とも呼ばれ、 認可要求 (Authorization request) が完了した後に 認可サーバー (Authorization Server) がユーザーエージェントをリダイレクトする場所を示すための URI です。
ユニバーサルリソース識別子 (URI) は、URL (Uniform Resource Locator) と混同されることがよくあります。詳細については、 Unveiling URI, URL, and URN をご覧ください。
リダイレクト URI を含む認可要求 (authorization request) の例を見てみましょう:
GET /authorize?response_type=code
&client_id=YOUR_CLIENT_ID
&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback
&scope=openid%20profile%20email
&state=abc123
&nonce=123456 HTTP/1.1
この例では、redirect_uri
パラメーターの生の値は https%3A%2F%2Fclient.example.com%2Fcallback
であり、これは URL エンコードされています。実際の値は https://client.example.com/callback
です。
リダイレクト URI はどのように機能しますか?
OpenID Connect (OIDC) のコンテキストでは、OAuth 2.0 の 認可要求 (Authorization request) および 認可サーバー (Authorization Server) のワークフローが同様に適用されます。リダイレクト URI は、 認証要求 (Authentication request) および OpenID Provider (OP) においても OAuth 2.0 と同様の方法で機能します。
クライアント (Client) が URL https://client.example.com
から認可要求 (authorization request) を開始したとしましょう。ユーザーが認可プロセスを完了すると、認可サーバー (authorization server) はユーザーエージェント(ブラウザ)を https://client.example.com/callback
にリダイレクトします。
リダイレクト URI が、認可プロセスが完了するときにユーザーエージェントをリダイレクトするために認可サーバーが必要であることは明らかです。加えて、リダイレクト URI は、フローによっては認可コードまたはトークンを受け取るために使用されます。
認可コードフロー (Authorization code flow) における実際のリダイレクトの非規範的な例は以下の通りです:
HTTP/1.1 302 Found
Location: https://client.example.com/callback?code=AUTHORIZATION_CODE&state=abc123
認可サーバーによって追加される URL パラメーター code
および state
は、リダイレクト URI に含まれることに注意してください。クライアントは、認可プロセスを続行するために URL から code
および state
パラメーターを抽出する必要があります。
なぜリダイレクト URI が必要なのか?
前述の例からわかるように、認可サーバー (authorization server) は認可要求 (authorization request) が成功した後にどこにリダイレクトするかを知る必要があります。複数のクライアント(例: シングルサインオン (Single sign-on, SSO) )があり、各クライアントに異なるリダイレクト URI がある場合に特に役立ちます。
認可コードフロー (Authorization code flow) では、リダイレクト URI は、フロントチャンネル(ブラウザ)を使用してトークンを攻撃にさらさないようにし、認可コードをクライアントに返すためにも使用されます。
Resource Owner Password Credentials (ROPC) grant を使用して、リダイレクト URI なしでユーザーのトークンを取得することも可能でしたが、 OAuth 2.1 ではセキュリティ上の懸念から廃止されました。
セキュリティ上の考慮事項
リダイレクト URI は重要なパラメーターであり、攻撃者の一般的なターゲットとなります。以下は考慮すべきセキュリティのポイントです:
- ホワイトリストリダイレクト URI:クライアントは、認可サーバーに登録されたリダイレクト URI のみを受け入れるべきです。これは、攻撃者がユーザーを悪意のあるサイトにリダイレクトするのを防ぎます。
- HTTPS を使用する:クライアントと認可サーバー間の通信を保護するために、常にリダイレクト URI に HTTPS を使用してください。
- 完全一致:リダイレクト URI は登録済みの URI と正確に一致するべきです。認可サーバーは、広範な一致パターンを許可しない厳格な一致ルールを強制する場合があります。
- 状態パラメーター: クロスサイトリクエストフォージェリ (Cross-site request forgery, CSRF) の攻撃を防ぐために
state
パラメーターを使用してください。クライアントは認可要求で送信した値と一致することを確認するためにstate
パラメーターを検証するべきです。