セッション管理
セッション管理は、ユーザーのログイン状態を維持し、シングルサインオン(SSO)やログアウト連携を実現するための仕組みです。
セッションとは
セッション(Session) とは、ユーザーの認証状態を一定期間保持する仕組みです。
セッションの役割
- 認証状態の保持: ログイン後、毎回パスワード入力せずにサービス利用可能
- シングルサインオン(SSO): 一度のログインで複数のアプリケーションにアクセス
- ログアウト連携: 一箇所でログアウトすると 関連するすべてのアプリからログアウト
セッションとトークンの違い
| 項目 | セッション | トークン |
|---|---|---|
| 用途 | ブラウザとIdP間の状態管理 | クライアントとリソースサーバー間の認可 |
| 保存場所 | Cookie(ブラウザ側)+ Redis/DB(サーバー側) | クライアントアプリケーション |
| 有効期限 | セッションタイムアウト(通常30分〜数時間) | トークン有効期限(アクセストークン: 分〜時間) |
| 識別対象 | ユーザーのブラウザ | クライアントアプリケーションのリクエスト |
idp-serverのセッション管理
なぜSpring Sessionを使わないか
idp-serverは、OIDC Session Managementの要件を満たすため、独自のセッション管理を実装しています。
| Spring Session | OIDC Session Management |
|---|---|
| 1ブラウザ = 1セッション | 1 OPセッション : N クライアントセッション |
| HttpSessionの分散化が目的 | sid, sub での複合検索が必要 |
| RP(クライアント)側での利用を想定 | OP(IdP)側でのセッション管理 |
この要件の違いから、Keycloakなどと同様に独自実装を採用しています。
セッションの階層構造
idp-serverでは、2層のセッション構造を採用しています。
┌─────────────────────────────────────────────────────────────────┐
│ Browser Session │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ OPSession │ │
│ │ - ブラウザとOP間のセッション(SSO用) │ │
│ │ - sub, authTime, acr, amr を保持 │ │
│ │ - 複数のClientSessionを持つ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ ClientSession │ │ ClientSession │ │ ClientSession │ │
│ │ アプリA │ │ アプリB │ │ アプリC │ │
│ │ sid: xxx │ │ sid: yyy │ │ sid: zzz │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
OPSession(OPセッション)
ブラウザとIdP(OP)間のセッションです。ユーザーがログインすると作成されます。
| 属性 | 説明 |
|---|---|
| id | セッションID(UUID) |
| sub | ユーザー識別子 |
| authTime | 認証時刻 |
| acr | 認証コンテキストクラス(認証強度) |
| amr | 認証方式(password, otp, fido等) |
| expiresAt | 有効期限 |
ClientSession(クライアントセッション)
OPSessionと特定のアプリケーション(RP)間のセッションです。認可が完了すると作成されます。
| 属性 | 説明 |
|---|---|
| sid | セッションID(ID Tokenのsidクレームに含まれる) |
| opSessionId | 親となるOPSessionのID |
| clientId | アプリケーションのClient ID |
| scopes | 認可されたスコープ |
| nonce | 認可リクエストのnonce |
Cookieの役割
idp-serverは、セッション管理に複数のCookieを使用します。
セッション識別Cookie
| Cookie名 | 内容 | HttpOnly | 目的 |
|---|---|---|---|
IDP_IDENTITY | OPSessionのID | Yes | SSO識別用(サーバー側で使用) |
IDP_SESSION | SHA256(opSessionId) | No | Session Management iframe用 |
- IDP_IDENTITY: サーバー側でセッションを識別するためのCookie(HttpOnlyでセキュア)
- IDP_SESSION: OIDC Session Managementのiframeでセッション状態を確認するためのCookie