OIDC セッション管理
この記事では、IdP と SP の間の相互作用における OIDC セッションとユーザー認証ステータスの管理方法を説明します。
OIDC セッション管理とは
OpenID Connect (OIDC)は、OAuth 2.0 プロトコルの上に構築されたシンプルなアイデンティティ層です。これにより、クライアントは認可サーバーが行った認証に基づいてエンドユーザーのアイデンティティを確認し、相互運用可能で REST ライクな方法でエンドユーザーの基本的なプロファイル情報を取得できます。
OIDC は、シンプルさと柔軟性を重視して設計されており、シングルサインオン (SSO) や、Web アプリケーション、モバイルアプリ、および API におけるアイデンティティの検証に広く使用されています。
OIDC において認証ステータスとセッション管理を理解することは重要です。この記事では、Identity Provider (IdP) と、Relying Party (RP) またはService Provider (SP) との相互作用における OIDC セッションとユーザー認証ステータスの管理方法について説明します。
この記事にはいくつかの重要な用語が含まれます。
- Identity Provider (IdP): ユーザーのアイデンティティを保存し、認証するサービス。
- Service Provider (SP) または Relaying Party (RP): ユーザーにサービスを提供し、ユーザー認証のために IdP に依存する Web アプリケーションまたはサービス。
- サインインセッション または 認証セッション: ユーザーが IdP にログインしたときに確立されるセッション。
- グラント: IdP により生成および管理される、集中化されたユーザー認証および承認情報。
- シングルサインオン (SSO): 一組のログイン認証情報 (例: 名前とパスワード) を使用して複数のアプリケーションにアクセスできるようにするセッションおよびユーザー認証サービスです。
OIDC 認証フローの仕組み
OIDC セッションとユーザー認証ステータスの管理についてより良く理解するために、Web アプリケーションにおける OIDC 認証フローを簡単に見てみましょう:
- ユーザーが Web アプリケーション (RP) にアクセスします。
- RP はユーザーを OIDC プロバイダ (IdP) に認証するためにリダイレクトします。
- OIDC プロバイダはユーザーのサインインセッションステータスを確認します。セッションが存在しないか、セッションが期限切れの場合、ユーザーにサインインを促します。
- ユーザーがサインインページと対話して認証されます。
- サインインページは相互作用の結果を OIDC プロバイダに提出します。
- OIDC プロバイダはユーザーのために新しいサインインセッションと認証グラントを作成します。
- OIDC プロバイダは認証コード (Authorization Code フロー) を持ってユーザーを RP に戻ります。
- RP は認証コードを受け取り、ユーザー情報へのアクセスにトークンに交換します。
RP サインインセッション管理とは
ユーザーが IdP にログインするとサインインセッションが確立されます。このセッションは、IdP でユーザーの認証ステータスを追跡するために使用されます。通常、セッションにはユーザーのアイデンティティ、認証時間、セッションの有効期限などの情報が含まれます。ユーザーがログインすると作成され、ユーザーがログアウトするか、セッションが期限切れになるまで維持されます。
セッションステートを維持するため、ユーザーのブラウザにセッション Cookie が安全に設定されます。セッション Cookie は、ユーザーのセッションを識 別し、後続の認証リクエストでユーザーを認証するために使用されます。この Cookie は通常、HttpOnly
と Secure
フラグとともに設定され、クライアント側のアクセスを防ぎ、安全な通信を確保します。
単一 RP のための 1 つのセッション
ユーザーがさまざまなデバイスまたはブラウザからアクセスする各 RP に対して、個別のユーザーサインインセッションが確立されます。これは、ユーザーの認証ステータスが各 RP に対して個別に維持されることを意味します。ユーザーが 1 つの RP からログアウトしても、セッションが期限切れになるか、ユーザーがすべての RP からログアウトするまでは、他の RP でもユーザーはまだ認証されたままです。
複数 RP のための集中化セッション
この集中化されたセッション管理によっても、ユーザーのセッションがアクティブであり、同じユーザー エージェント (デバイス/ブラウザ) から認証リクエストが来る限り、IdP は複数の RP にわたって一貫した認証ステートを維持します。このメカニズムにより、ユーザーが再度ログインすることなく複数の RP にアクセスできる SSO 機能が有効になります。
クライアント側の認証ステータス
OIDC では、クライアントアプリケーション (RP) は IdP 発行のトークンに依頼し、ユーザーのアイデンティティと認証または承認ステータスを確認します。「サインイン セッション」は、IdP によって発行されたトークンによってクライアント側で維持されます。
- ID トークン: ユーザー情報を含む短命なトークンで、認証されたユーザーのアイデンティティを確認するために使用されます。
- アクセス トークン: ユーザーの代わりに保護されたリソースにアクセスするためのトークンです。アクセス トークンの有効期間は設定次第で短命または長命にすることができます。クライアントアプリケーションはアクセス トークンの有効性に依存してユーザーの認証ステータスを判断する場合があります。アクセス トークンが期限切れまたはクリアされた場合、ユーザーは「サインアウト済み」または「未認証」と見なされ、再認証が必要です。
- リフレッシュ トークン:
offline_access
スコープがリクエストされ、許可された場合、クライアントアプリケーションはリフレッシュ トークンを受け取ることがあります。これは、ユーザーを再認証することなく、ユーザーの認証ステータスを延長する手段を提供します。クライアントアプリケーションは、現在のアクセス トークンが期限切れたときにリフレッシュ トークンを使用して新しいアクセス トークンを取得できます。リフレッシュ トークンが有効である限り、ユーザーの認証ステータスはユーザーの操作なしに維持されます。
これらのトークンの組み合わせにより、クライアントアプリケーションはユーザーの認証ステータスを維持し、ユーザーの代わりに保護されたリソースにアクセスすることができます。クライアントアプリケーションは、これらのトークンを安全に保存し、ライフサイクルを管理する必要があります。(例: SPA アプリケーションの場合、トークンはブラウザのローカル ストレージまたはセッション ストレージに保存できます。Web アプリケーションの場合、トークンはサーバー側のセッション データまたは Cookie に保存できます。)
OIDC サインアウトメカニズム
OIDC におけるサインアウト プロセスは、集中管理された IdP によるサインインセッションと分散されたクライアント側のトークンの両方を含むため、多面的なコンセプトです。
クライアント側でのトークンとローカルセッションのクリア
クライアント側でユーザーの認証ステータスをサインアウトまたは取り消すのは比較的簡単です。クライアントアプリケーションは、ユーザーのブラウザまたはメモリから保存されたトークン (ID トークン、アクセス トークン、およびリフレッシュ トークン) を削除できます。この操作により、クライアント側でユーザーの認証ステータスが無効になります。
独自のユーザーサインインセッションを管理する Web アプリケーションには、追加の手順が必要な場合があります。これには、セッション Cookie や Identity Provider (IdP) によって発行されたトークンなどのセッションデータをクリアして、ユーザーが完全にサインアウトされることを確認することが含まれます。
IdP での集中化されたサインインセッションのクリア
IdP は各ユーザーのために集中化されたサインインセッションを維持します。このセッションがアクティブである限り、クライアント側のトークンがクリアされても、ユーザーは自動的に再認証される可能性があり、IdP とのさらなるやり取りなしにクライアントアプリケーションに新しいトークンを発行することができます。
IdP からユーザーを完全にサインアウトさせるには、クライアントアプリケーション (RP) が IdP にサインアウトリクエストを開始できます。アプリケーション (RP) は、サインインセッションの終了とセッション Cookie のクリアを可能にするため、ユーザーを IdP の end-session endpoint にリダイレクトする必要があります。これにより、同じ集中化セッションを共有するすべてのアプリケーション (RP) において完全なサインアウトを確保します。サインインセッションが終了すると、IdP は同じセッションを共有するリンクされた RP からトーク ンリクエストを受け取るたびに、ユーザーの再認証を促します。
OIDC バックチャネル ログアウト
場合によっては、あるアプリケーション (RP) からサインアウトすると、ユーザーは他のすべてのアプリケーション (RP) からも追加のユーザー操作なしに自動的にサインアウトしたい場合があります。これは バックチャネル ログアウト メカニズムを使用して達成できます。
IdP が RP からサインアウトリクエストを受信すると、サインインセッションをクリアするだけでなく、登録済みのバックチャネル ログアウトエンドポイントを持つ同じセッションを使用するすべての RP にバックチャネル ログアウト通知を送信します。
RP がバックチャネル ログアウト通知を受信すると、ユーザーのセッションとトークンをクリアするために必要な操作を実行し、すべてのアプリケーションからユーザーが完全にサインアウトされることを確保します。