OIDC のログアウトとセッション管理の実装:完全ガイド
OIDC 認証とセッション管理を深く探ります。安全なセッション処理のために OIDC の RP によるログアウト、IdP によるログアウト、バックチャネルログアウトの実装方法を学びましょう。
OIDC セッション管理とは何か
OpenID Connect (OIDC) は OAuth 2.0 プロトコルの上に構築されたシンプルなアイデンティティ層です。これによりクライアントは、認可サーバーによって行われた認証を基にエンドユーザーのアイデンティティを確認し、エンドユーザーの基本的なプロファイル情報を相互運用可能かつ REST に似た方法で取得できます。
OIDC は使いやすく実装しやすいように設計されており、シンプルさと柔軟性に重点を置いています。ウェブアプリケーション、モバイルアプリ、API でのシングルサインオン (SSO) とアイデンティティ認証に広く使用されています。
OIDC における認証状態とセッション管理を理解することが重要です。この記事では、Identity Provider (IdP) とリライングパーティー (RP) またはサービスプロバイダー (SP) 間のインタラクションにおける OIDC セッションとユーザー認証状態の管理方法を説明します。
この記事ではいくつかの重要な用語を含んでいます。
- Identity Provider (IdP): ユーザーのアイデンティティを保存し認証するサービス。
- Service Provider (SP) またはリライングパーティー (RP): ユーザーにサービスを提供し、IdP にユーザー認証を依存しているウェブアプリケーションやサービス。
- サインインセッション または 認証セッション: ユーザーが IdP にログインした際に確立されるセッション。
- グラント: IdP によって生成され管理される、中央集権的なユーザー認証および認可情報。
- シングルサインオン (SSO): 複数のアプリケーションにアクセスするために 1 セットのログイン資格(例えば、名前とパスワード)を使用可能にするセッションおよびユーザー認証サービス。
OIDC 認証フローはどのように機能するか
OIDC セッションとユーザー認証状態管理をよりよく理解するために、ウェブアプリケーション向けの OIDC 認証フローを簡単に見てみましょう。:
- ユーザーがウェブアプリケーション (RP) にアクセスします。
- RP はユーザーを認証のために OIDC プロバイダー (IdP) にリダイレクトします。
- OIDC プロバイダーはユーザーのサインインセッション状態を確認します。セッションが存在しない場合や期限切れの場合、ユーザーはサインインを促されます。
- ユーザーはサインインページとやり取りし、認証を受けます。
- サインインページはインタラクションの結果を OIDC プロバイダーに送信します。
- OIDC プロバイダーは新しいサインインセッションとユーザーの認証グラントを作成します。
- OIDC プロバイダーは認証コードと共にユーザーを RP にリダイレクトします(認可コードフロー)。
- RP は認証コードを受け取り、ユーザー情報にアクセスするためのトークンと交換します。
RP サインインセッション管理とは何か
ユーザーが IdP にログインするとサインインセッションが確立されます。このセッションは IdP でのユーザーの認証状態を追跡するために使用されます。このセッションには通常、ユーザーのアイデンティティ、認証時間、およびセッションの有効期限などの情報が含まれます。ユーザーが最初にログインした際に作成され、ユーザーがログアウトするか、セッションが期限切れになるまで維持されます。
セッション状態を維持するために、ユーザーのブラウザにセッションクッキーが安全に設定されます。ユーザーのセッションを識別し、以降の認証リクエストでユーザーを認証するために、セッションクッキーが使用されます。このクッキーは通常、クライアント側からのアクセスを防ぎ、安全な通信を確保するために HttpOnly
と Secure
フラグを設定されます。
単一 RP のための 1 セッション
ユーザーが異なるデバイスやブラウザからアクセスするそれぞれの RP に対して、別々のユーザーのサインインセッションが確立されます。これは、ユーザーの認証状態が各 RP ごとに個別に維持されることを意味します。ユーザーがある RP からログアウトしても、他の RP ではユーザーは認証されたままになります。この状態はセッションが期限切れになるか、ユーザーがすべての RP からログアウトするまで続きます。
複数 RP のための中央集権的なセッション
この中央集権的なセッション管理により、IdP はユーザーのセッションがアクティブで同じユーザーエージェント(デバイス/ブラウザ)からの認証リクエストがある限り、複数の RP にわたって一貫した認証状態を維持できます。この仕組みは SSO 機能を可能にし、ユーザーが再ログインする必要なく複数の RP にアクセスできます。
クライアント側の認証状態
OIDC では、クライアントアプリケーション (RP) は IdP が発行するトークンに依存してユーザーのアイデンティティと認証または認可の状態を確認します。クライアント側の "サインインセッション" は IdP によって発行されるトークンによって維持されます。
- ID トークン: ユーザー情報を含む短命のトークンで、認証されたユーザーのアイデンティティを確認するために使用されます。
- アクセストークン: ユーザーに代わって保護されたリソースにアクセスする権限を付与するトークンです。アクセストークンの有効期限は、設定によって短命または長命になることがあります。クライアントアプリケーションは、アクセストークンの有効性に依存して、ユーザーの認証状態を判断することがあります。アクセストークンが期限切れまたはクリアされた場合、ユーザーは "サインアウト" または "未認証" と見なされ、再認証が必要です。
- リフレッシュトークン:
offline_access
スコープが要求され承認されると、クライアントアプリケーションはリフレッシュトークンを受け取ることがあります。これはユーザーに再認証を要求することなくユーザーの認証状態を延長する手段を提供します。クライアントアプリケーションは現在のアクセストークンが期限切れたときに新しいアクセストークンを取得するためにリフレッシュトークンを使用できます。リフレッシュトークンが有効である限り、ユーザーの認証状態をユーザーの操作なしに維持できます。
これらのトークンの組み合わせにより、クライアントアプリケーションはユーザーの認証状態を維持し、ユーザーに代わって保護されたリソースにアクセスできます。クライアントアプリケーションはこれらのトークンを安全に保存し、そのライフサイクルを管理する必要があります。(例: SPA アプリケーションの場合、トークンはブラウザのローカルストレージまたはセッションストレージに保存できます。ウェブアプリケーションの場合、トークンはサーバー側のセッションデータまたはクッキーに保存できます。)
OIDC のサインアウトメカニズム
OIDC ではサインアウトプロセスが複数の側面を持っており、中央集権的に IdP が管理するサインインセッションと分散したクライアント側のトークンの 2 つが関与しているためです。