セッション管理セキュリティ分析
このドキュメントでは、idp-serverのセッション管理におけるセキュリティ対策の現状を記載します。
セッションライフサイクル概要
初回認証フロー
認可リクエスト ────→ 認証完了 ────→ 認可完了 ────→ SSO可能
│ │ │ │
▼ ▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐
│AuthSession│ │ OPSession │ │ClientSession│ │ 再利用 │
│ Cookie │ │ Cookie │ │ 作成 │ │ 可能 │
└───────────┘ └───────────┘ └───────────┘ └───────────┘
セッション種類と役割
| セッション | Cookie | 役割 | ライフサイクル |
|---|---|---|---|
| AuthenticationTransaction | AUTH_SESSION | 認可フローの保護 | 認可リクエスト〜認可完了 |
| OPSession | IDP_IDENTITY | SSO | 認証完了〜ログアウト/期限切れ |
| ClientSession | - | クライアント別セッション管理 | 認可完了〜ログアウト/期限切れ |
SSO時の検証
SSO認可リクエスト ────→ セッション検証 ────→ ポリシー検証 ────→ 認可
│ │ │
▼ ▼ ▼
AUTH_SESSION OPSession有効? 認証ポリシー
+ OPSession acr一致? 条件を満たす?
セッションライフサイクル詳細
初回認証フロー詳細
┌──────────────────── ─────────────────────────────────────────────────────────┐
│ セッションライフサイクル │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【フェーズ1: 認可リクエスト開始】 │
│ ┌──────────────────┐ │
│ │ GET /authorizations │ │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ AuthSession │ │ Authentication │ │
│ │ Cookie生成 │ │ Transaction作成 │ │
│ │ (CSRF対策) │ │ (認可リクエスト │ │
│ └──────────────────┘ │ に紐付く) │ │
│ └──────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【フェーズ2: 認証完了】 │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ POST /password-authentication (+ TOTP等) │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ validateAuthSession() │ ← AUTH_SESSION Cookie検証 │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ Authentication │ 認証情報を更新 │
│ │ Transaction更新 │ - user, acr, amr, authTime │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ OPSession作成 │ │ IDP_IDENTITY │ │
│ │ (SSO用) │ │ IDP_SESSION │ │
│ │ acr, amr, authTime│ │ Cookie設定 │ │
│ │ interactionResults│ │ │ │
│ └──────────────────┘ └──────────────────┘ │
│ │
│ ※ 認証成功時にOPSessionを作成(セッション切替ポリシー適用) │
│ ※ 同一ユーザー再認証時は既存セッションを再利用 │
│ ※ MFA途中離脱の場合、OPSessionは作成されない │
│ │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【フェーズ3: 認可完了】 │
│ ┌──────────────────┐ │
│ │ POST /authorize │ │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ validateAuthSession() │ ← AUTH_SESSION Cookie検証 │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ ClientSession作成 │ クライアント固有のセッション │
│ │ (per-client) │ sid for ID Token │
│ │ scope, claims │ OPSessionに紐付く │
│ └──────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
SSO時のライフサイクル詳細
┌─────────────────────────────────────────────────────────────────────────────┐
│ SSO時のライフサイクル │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【前提: OPSession が既に存在する】 │
│ ┌──────────────────┐ │
│ │ IDP_IDENTITY │ 既存のOPSession ID │
│ │ Cookie あり │ │
│ └──────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【SSO方式1: prompt=none】 │
│ ┌──────────────────┐ │
│ │ GET /authorizations │ prompt=none │
│ │ │ + IDP_IDENTITY Cookie │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ OPSession検証 │ - 有効期限チェック │
│ │ │ - max_ageチェック │
│ │ │ - AuthorizationGrantedチェック │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ 302 Redirect │ 認可コード直接発行 │
│ │ + 認可コード │ (認証・認可画面スキップ) │
│ └──────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【SSO方式2: authorize-with-session】 │
│ ┌──────────────────┐ │
│ │ GET /authorizations │ prompt指定なし │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ AuthSession │ │ Authentication │ │
│ │ Cookie生成 │ │ Transaction作成 │ │
│ └──────────────────┘ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ GET /view-data │ session_enabled: true を返す │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ POST /authorize-with-session │ │
│ │ + AUTH_SESSION Cookie │ │
│ │ + IDP_IDENTITY Cookie │ │
│ └─────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌ ──────────────────┐ ┌──────────────────┐ │
│ │ validateAuthSession() │ │ OPSession検証 │ │
│ │ AUTH_SESSION検証 │ │ IDP_IDENTITY検証 │ │
│ └──────────────────┘ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ OPSessionの認証 │ 既存OPSessionのacr/amr/authTimeで認可 │
│ │ 情報で認可 │ │
│ └──────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
シーケンス図
Cookie一覧
| Cookie名 | 用途 | HttpOnly | Secure | SameSite |
|---|---|---|---|---|
| AUTH_SESSION | 認可フロー固定攻撃対策 | Yes | Yes | Lax |
| IDP_IDENTITY | OPSession識別(SSO用) | Yes | Yes | Lax |
| IDP_SESSION | OIDC Session Management iframe用 | No | Yes | Lax |