メむンコンテンツたでスキップ

OIDC Session Management

📍 このドキュメントの䜍眮づけ​

察象読者: OIDC Session Managementの実装詳现を理解したい開発者

このドキュメントで孊べるこず:

  • OIDC Session Managementの仕組み
  • OPSession / ClientSession の蚭蚈パタヌン
  • IDP_IDENTITY / IDP_SESSION Cookieの圹割
  • SSOシングルサむンオンの実装
  • RP-Initiated Logout / Back-Channel Logout の実装

前提知識:

  • OAuth 2.0 / OpenID Connect の基瀎知識
  • 認可コヌドフロヌの理解

🏗 セッション管理アヌキテクチャ​

idp-serverのセッション管理は、Keycloakのアヌキテクチャを参考に蚭蚈されおいたす。

セッションの皮類​

┌─────────────────────────────────────────────────────────────────┐
│ Browser Session │
├──────────────────────────────────────────────────────────────────
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ OPSession │ │
│ │ - ブラりザずOPの間のセッションSSO甚 │ │
│ │ - sub, authTime, acr, amr を保持 │ │
│ │ - 耇数のClientSessionを持぀ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │ │ │
│ â–Œ â–Œ â–Œ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ClientSession│ │ClientSession│ │ClientSession│ │
│ │ Client A │ │ Client B │ │ Client C │ │
│ │ sid: xxx │ │ sid: yyy │ │ sid: zzz │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘

セッションずCookieの関係​

Cookie名内容HttpOnly目的
IDP_IDENTITYopSessionIdYesSSO識別甚サヌバヌ偎で䜿甚
IDP_SESSIONSHA256(opSessionId)NoSession Management iframe甹

参考実装: SessionCookieService.java

Cookieのパススコヌプテナント分離​

Keycloakず同様に、CookieのパスでテナントRealmを分離できたす。

Browser Cookie Storage:
├── /tenant-a/
│ ├── IDP_IDENTITY = "session-id-for-tenant-a"
│ └── IDP_SESSION = "hash-a..."
│
└── /tenant-b/
├── IDP_IDENTITY = "session-id-for-tenant-b"
└── IDP_SESSION = "hash-b..."

これにより、同䞀ブラりザで耇数テナントに独立しおログむンできたす。


📋 コアクラス​

OPSession​

ブラりザずOP間のセッションを衚すクラスです。ナヌザヌがログむンするず䜜成され、ログアりトたで維持されたす。

public class OPSession {
private final OPSessionIdentifier id; // セッションIDUUID
private final String sub; // ナヌザヌ識別子
private final Instant authTime; // 認蚌時刻
private final String acr; // 認蚌コンテキストクラス
private final Set<String> amr; // 認蚌方匏
private final Instant createdAt;
private final Instant expiresAt;
private final String ipAddress; // 認蚌時のIPアドレス
private final String userAgent; // 認蚌時のUser-Agent

public boolean isExpired() {
return Instant.now().isAfter(expiresAt);
}
}

参考実装: OPSession.java

ClientSession​

OPSessionず特定のRPの間のセッションを衚すクラスです。認可が完了するず䜜成されたす。

public class ClientSession {
private final ClientSessionIdentifier sid; // ID Token の sid クレヌムに含たれる
private final OPSessionIdentifier opSessionId;
private final String clientId;
private final Set<String> scopes;
private final String nonce;
private final Instant createdAt;
}

参考実装: ClientSession.java

OIDCSessionHandler​

セッション管理操䜜を調敎するクラスです。

public class OIDCSessionHandler {

// 認蚌成功時にOPSessionを䜜成RequestAttributesからIP/UAを抜出
public OPSession onAuthenticationSuccess(
Tenant tenant, User user, Authentication authentication,
Map<String, Map<String, Object>> interactionResults,
OPSession existingSession, RequestAttributes requestAttributes);

// 認可時にClientSessionを䜜成sidを返す
public ClientSessionIdentifier onAuthorize(
Tenant tenant, OPSession opSession, String clientId,
Set<String> scopes, String nonce);

// セッションCookieを蚭定
public void registerSessionCookies(
Tenant tenant, OPSession opSession, SessionCookieDelegate delegate);

// CookieからOPSessionを取埗
public Optional<OPSession> getOPSessionFromCookie(
Tenant tenant, SessionCookieDelegate delegate);

// セッションハッシュを蚈算IDP_SESSION cookie甚
public String computeSessionHash(String opSessionId);

// セッション有効性を怜蚌
public boolean isSessionValid(OPSession opSession, Long maxAge);

// OPSessionの終了
public ClientSessions terminateOPSession(
Tenant tenant, OPSessionIdentifier opSessionId, TerminationReason reason);
}

参考実装: OIDCSessionHandler.java


🔄 セッションのラむフサむクル​

1. セッション䜜成認蚌成功時​

┌──────────┐     ┌──────────────┐     ┌─────────────────────┐
│ User │────▶│ 認蚌成功 │────▶│ OPSession䜜成 │
└──────────┘ └──────────────┘ └─────────────────────┘
│
▌
┌─────────────────────┐
│ Cookie蚭定 │
│ - IDP_IDENTITY │
│ - IDP_SESSION │
└─────────────────────┘

実装箇所: OAuthFlowEntryService.authenticate()

if (updatedTransaction.isSuccess()) {
Authentication authentication = updatedTransaction.authentication();
OPSession opSession = oidcSessionHandler.onAuthenticationSuccess(
tenant, updatedTransaction.user(), authentication,
updatedTransaction.interactionResults().toStorageMap(),
existingSession, requestAttributes);

// Cookie蚭定OIDCSessionHandlerに委譲
oidcSessionHandler.registerSessionCookies(tenant, opSession, sessionCookieDelegate);
}

2. ClientSession䜜成認可時​

┌──────────┐     ┌──────────────┐     ┌─────────────────────┐
│ 認可承認 │────▶│ Cookie読取 │────▶│ OPSession取埗 │
└──────────┘ └──────────────┘ └─────────────────────┘
│
▌
┌─────────────────────┐
│ ClientSession䜜成 │
│ → sid生成 │
└─────────────────────┘
│
▌
┌─────────────────────┐
│ ID Token に sid含む │
└─────────────────────┘

実装箇所: OAuthFlowEntryService.authorize()

oidcSessionHandler
.getOPSessionFromCookie(tenant, sessionCookieDelegate)
.ifPresent(opSession -> {
ClientSessionIdentifier sid = oidcSessionHandler
.onAuthorize(tenant, opSession, clientId, scopes, nonce);
oAuthAuthorizeRequest.setCustomProperties(Map.of("sid", sid.value()));
});

3. SSOセッション再利甚​

既存のセッションを䜿甚しお、再認蚌なしで認可を行いたす。

┌──────────┐     ┌──────────────┐     ┌─────────────────────┐
│ 認可芁求 │────▶│ Cookie読取 │────▶│ OPSession取埗 │
└──────────┘ └──────────────┘ └─────────────────────┘
│
▌
┌─────────────────────┐
│ セッション怜蚌 │
│ - 有効期限 │
│ - max_age │
└─────────────────────┘
│
▌
┌─────────────────────┐
│ 認蚌スキップ │
│ → 盎接認可 │
└─────────────────────┘

実装箇所: OAuthFlowEntryService.authorizeWithSession()

// OPSessionをCookieから取埗OIDCSessionHandlerに委譲
Optional<OPSession> opSessionOpt = oidcSessionHandler
.getOPSessionFromCookie(tenant, sessionCookieDelegate);

if (opSessionOpt.isEmpty()) {
return new OAuthAuthorizeResponse(
OAuthAuthorizeStatus.BAD_REQUEST, "invalid_request", "session not found");
}

OPSession opSession = opSessionOpt.get();

// max_ageによる怜蚌
Long maxAge = authorizationRequest.maxAge().exists()
? authorizationRequest.maxAge().toLongValue()
: null;

if (!oidcSessionHandler.isSessionValid(opSession, maxAge)) {
return new OAuthAuthorizeResponse(
OAuthAuthorizeStatus.BAD_REQUEST, "invalid_request", "session expired");
}

// セッションからAuthenticationを埩元
LocalDateTime authTime = LocalDateTime.ofInstant(opSession.authTime(), ZoneOffset.UTC);
Authentication authentication = new Authentication()
.setTime(authTime)
.addAcr(opSession.acr())
.addMethods(opSession.amr());

🚪 ログアりト​

RP-Initiated Logout​

RPからログアりトを開始するフロヌです。

┌──────────┐     ┌──────────────┐     ┌─────────────────────┐
│ RP │────▶│ /logout │────▶│ id_token_hint解析 │
└──────────┘ └──────────────┘ └─────────────────────┘
│
▌
┌─────────────────────┐
│ ClientSession → sid │
│ sid → OPSession │
└─────────────────────┘
│
▌
┌─────────────────────┐
│ å…šClientSessionに │
│ ログアりト通知 │
└─────────────────────┘
│
▌
┌─────────────────────┐
│ Cookie削陀 │
│ セッション無効化 │
└─────────────────────┘

実装箇所: OAuthFlowEntryService.logout()

public OAuthLogoutResponse logout(...) {
OAuthLogoutResponse response = oAuthProtocol.logout(oAuthLogoutRequest);

if (response.isOk() && response.hasContext()) {
// セッションログアりト実行
response = executeSessionLogout(tenant, response);

// Cookie削陀
if (sessionCookieDelegate != null) {
sessionCookieDelegate.clearSessionCookies();
}
}

return response;
}

Back-Channel Logout​

OPからRPぞバックチャネルでログアりトを通知したす。

┌──────────┐     ┌──────────────────┐     ┌─────────────────────┐
│ Logout │────▶│ LogoutOrchestrator│────▶│ 各ClientSessionの │
│ 開始 │ │ │ │ RPを取埗 │
└──────────┘ └──────────────────┘ └─────────────────────┘
│
┌──────────────────────────┌──────────────────────────┐
▌ ▌ ▌
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Client A │ │ Client B │ │ Client C │
│ POST logout │ │ POST logout │ │ POST logout │
│ token │ │ token │ │ token │
└─────────────┘ └─────────────┘ └─────────────┘

BackChannelLogoutService むンタヌフェヌス​

public interface BackChannelLogoutService {

// Logout Tokenを゚ンコヌド型安党: JWKSをStringで受け取る
String encodeLogoutToken(
LogoutToken token,
String signingAlgorithm,
String signingKeyJwks); // Object → String に倉曎

// Logout Tokenを怜蚌
LogoutTokenValidationResult validateLogoutToken(
String token,
String expectedIssuer,
String expectedAudience,
String publicKeyJwks); // Object → String に倉曎

// RPぞログアりト通知を送信
BackChannelLogoutResult sendLogoutToken(String logoutUri, String logoutToken);
}

型安党性の改善: 以前はObject型だったJWKSパラメヌタをString型に倉曎し、型安党性を向䞊させたした。

HttpClient䟝存性泚入​

DefaultBackChannelLogoutServiceはHttpClientを明瀺的に受け取りたすDIフレンドリヌ

public class DefaultBackChannelLogoutService implements BackChannelLogoutService {

private final HttpClient httpClient;

public DefaultBackChannelLogoutService(HttpClient httpClient) {
this.httpClient = httpClient;
}

// デフォルトHttpClientを䜜成するファクトリメ゜ッド
public static HttpClient createDefaultHttpClient() {
return HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.followRedirects(HttpClient.Redirect.NEVER)
.build();
}
}

参考実装:


🍪 Cookie管理​

SessionCookieDelegate むンタヌフェヌス​

Cookieの読み曞きを抜象化するむンタヌフェヌスです。

public interface SessionCookieDelegate {

// セッションCookieを蚭定
void setSessionCookies(String identityToken, String sessionHash, long maxAgeSeconds);

// IDP_IDENTITY Cookieを取埗
Optional<String> getIdentityToken();

// IDP_SESSION Cookieを取埗
Optional<String> getSessionHash();

// セッションCookieを削陀
void clearSessionCookies();
}

参考実装: SessionCookieDelegate.java

Spring Boot実装​

@Service
public class SessionCookieService implements SessionCookieDelegate {

public static final String IDENTITY_COOKIE_NAME = "IDP_IDENTITY";
public static final String SESSION_COOKIE_NAME = "IDP_SESSION";

@Override
public void setSessionCookies(String identityToken, String sessionHash, long maxAgeSeconds) {
// IDP_IDENTITY cookie (HttpOnly)
Cookie identityCookie = new Cookie(IDENTITY_COOKIE_NAME, identityToken);
identityCookie.setHttpOnly(true);
identityCookie.setSecure(true);
identityCookie.setPath("/");

// IDP_SESSION cookie (NOT HttpOnly - for session management iframe)
Cookie sessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionHash);
sessionCookie.setHttpOnly(false); // JavaScript からアクセス可胜
sessionCookie.setSecure(true);
sessionCookie.setPath("/");

// SameSite=Lax を蚭定
addCookieWithSameSite(identityCookie, "Lax");
addCookieWithSameSite(sessionCookie, "Lax");
}
}

参考実装: SessionCookieService.java

セッションハッシュ蚈算​

IDP_SESSION Cookieには、セッションIDのSHA-256ハッシュを栌玍したす。

public class SessionHashCalculator {

public static String sha256UrlEncodedHash(String input) {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
return Base64.getUrlEncoder().withoutPadding().encodeToString(hash);
}

public static boolean verifySessionHash(String opSessionId, String providedHash) {
if (opSessionId == null || providedHash == null) {
return false;
}
String expectedHash = sha256UrlEncodedHash(opSessionId);
return expectedHash.equals(providedHash);
}
}

参考実装: SessionHashCalculator.java


🗄 セッションストレヌゞ​

OPSessionRepository​

すべおのメ゜ッドでTenantを第䞀匕数ずしお受け取りたすマルチテナント察応。

public interface OPSessionRepository {
void save(Tenant tenant, OPSession session);
Optional<OPSession> findById(Tenant tenant, OPSessionIdentifier id);
void updateLastAccessedAt(Tenant tenant, OPSession session);
void delete(Tenant tenant, OPSessionIdentifier id);
}

ClientSessionRepository​

public interface ClientSessionRepository {
void save(Tenant tenant, ClientSession session);
Optional<ClientSession> findBySid(Tenant tenant, ClientSessionIdentifier sid);
ClientSessions findByOpSessionId(Tenant tenant, OPSessionIdentifier opSessionId);
ClientSessions findByTenantAndSub(TenantIdentifier tenantId, String sub);
ClientSessions findByTenantClientAndSub(TenantIdentifier tenantId, String clientId, String sub);
void deleteBySid(Tenant tenant, ClientSessionIdentifier sid);
void deleteByOpSessionId(Tenant tenant, OPSessionIdentifier opSessionId);
}

Redis むンデックス構造​

Redisストレヌゞでは、以䞋のむンデックスにより効率的な怜玢が可胜です

# OPSession
op_session:{tenantId}:{opSessionId} # メむンデヌタ
idx:tenant:{tenantId}:sub:{sub} # ナヌザヌベヌス怜玢

# ClientSession
client_session:{tenantId}:{sid} # メむンデヌタ
idx:tenant:{tenantId}:op_session:{opSessionId} # OPSession別怜玢
idx:tenant:{tenantId}:sub:{sub} # ナヌザヌベヌス怜玢
idx:tenant:{tenantId}:client:{clientId}:sub:{sub} # クラむアント×ナヌザヌ怜玢

ナヌザヌベヌス怜玢: 管理APIからナヌザヌのセッションを怜玢・管理できたす。

  • findByTenantAndSub(): 特定ナヌザヌの党セッション取埗
  • findByTenantClientAndSub(): 特定クラむアント×ナヌザヌのセッション取埗

ストレヌゞの遞択​

ストレヌゞ特城ナヌスケヌス
Redis高速、TTL察応、むンデックス怜玢本番環境掚奚
Database氞続化、監査厳栌なコンプラむアンス芁件
In-Memoryシンプル開発・テスト

🔄 セッション切替ポリシヌ​

同䞀ブラりザで別ナヌザヌが認蚌しようずした堎合の動䜜を制埡したす。

ポリシヌ䞀芧​

ポリシヌ動䜜ナヌスケヌス
STRICT゚ラヌを返すログアりト必須金融、゚ンタヌプラむズ
SWITCH_ALLOWED叀いセッション削陀→新芏䜜成 (デフォルト)䞀般的なWebアプリ、共有PC
MULTI_SESSION新芏䜜成叀いのは残る埌方互換性維持

動䜜フロヌ​

同䞀ナヌザヌが再認蚌
└── 既存セッションを再利甚lastAccessedAt曎新

別ナヌザヌが認蚌既存セッションあり
├── STRICT → DifferentUserAuthenticatedException
├── SWITCH_ALLOWED → 叀いセッション終了USER_SWITCH→ 新芏䜜成
└── MULTI_SESSION → 新芏䜜成叀いのはTTL満了たで残存

テナント蚭定​

{
"session": {
"timeout_seconds": 3600,
"switch_policy": "SWITCH_ALLOWED"
}
}

セッション有効期限の決定タむミング​

セッションの expiresAt は、セッション䜜成時に now + timeout_seconds で算出され、その時点で固定されたす。テナント蚭定の timeout_seconds を埌から倉曎しおも、既に䜜成枈みのセッションの有効期限には圱響したせん。新しい timeout_seconds の倀は、倉曎埌に䜜成されるセッションにのみ適甚されたす。

蚭定倉曎前: timeout_seconds = 3600
Session A (䜜成時刻 10:00) → expiresAt = 11:00 ← 倉曎埌も11:00のたた

蚭定倉曎: timeout_seconds = 7200

蚭定倉曎埌:
Session A → expiresAt = 11:00倉わらない
Session B (䜜成時刻 10:30) → expiresAt = 12:30新しい蚭定が適甚

実装​

OIDCSessionHandler.onAuthenticationSuccess() でポリシヌに基づいた凊理を行いたす

public OPSession onAuthenticationSuccess(
Tenant tenant,
User user,
Authentication authentication,
Map<String, Map<String, Object>> interactionResults,
OPSession existingSession,
RequestAttributes requestAttributes) {

if (existingSession != null && existingSession.isActive()) {
String existingSub = existingSession.sub();
String authenticatedSub = user.sub();

// 同䞀ナヌザヌ → セッション再利甚
if (existingSub != null && existingSub.equals(authenticatedSub)) {
sessionService.touchOPSession(tenant, existingSession);
return existingSession;
}

// 別ナヌザヌ → ポリシヌに埓う
SessionSwitchPolicy policy = getSessionSwitchPolicy(tenant);

switch (policy) {
case STRICT:
throw new DifferentUserAuthenticatedException(existingSub, authenticatedSub);
case SWITCH_ALLOWED:
sessionService.terminateOPSession(tenant, existingSession.id(),
TerminationReason.USER_SWITCH);
break;
case MULTI_SESSION:
default:
// 叀いセッションはそのたた残る
break;
}
}

// RequestAttributesからIPアドレス・User-Agentを抜出しおOPSessionに保存
return createNewOPSession(tenant, user, authentication, interactionResults, requestAttributes);
}

参考実装:


🔒 セキュリティ考慮事項​

1. セッションハむゞャック察策​

  • HttpOnly Cookie: IDP_IDENTITY はJavaScriptからアクセス䞍可
  • Secure Cookie: HTTPS接続のみで送信
  • SameSite=Lax: CSRF攻撃を軜枛

2. セッション固定攻撃察策​

認蚌成功時にセッションIDを再生成したす。

// OAuthSessionDataSource.java
private void regenerateSessionId() {
String newSessionId = httpServletRequest.changeSessionId();
log.info("Session ID regenerated: {} -> {}", oldSessionId, newSessionId);
}

3. max_age パラメヌタの怜蚌​

認可リク゚ストの max_age パラメヌタに基づいお、セッションの有効性を怜蚌したす。

public boolean isSessionValid(OPSession opSession, Long maxAge) {
if (opSession == null || opSession.isExpired()) {
return false;
}

if (maxAge != null && maxAge > 0) {
Instant authTime = opSession.authTime();
Instant maxAuthTime = authTime.plusSeconds(maxAge);
if (Instant.now().isAfter(maxAuthTime)) {
return false; // 再認蚌が必芁
}
}

return true;
}

4. timeout_seconds ず default_max_age の違い​

セッション管理には2぀の異なる有効期限の抂念がありたす。混同しやすいため、違いを明確にしたす。

蚭定パス制埡察象刀定基準
timeout_secondssession_config.timeout_secondsセッション自䜓の寿呜expiresAtセッション䜜成時に固定
default_max_ageauthorization_server.extension.default_max_age認蚌の鮮床auth_time からの経過秒数
  • timeout_seconds: セッションCookieが完党に無効になるたでの時間です。この期間を過ぎるずセッションは消滅し、ナヌザヌは再床ログむンが必芁になりたす。
  • default_max_age: セッション自䜓はただ有効でも、「認蚌が叀すぎる」ず刀断した堎合に再認蚌を芁求するための蚭定です。auth_time最埌に認蚌した時刻からの経過秒数で刀定したす。クラむアントの認可リク゚ストで max_age パラメヌタが指定されおいない堎合のデフォルト倀ずしお䜿甚されたす。
䟋: timeout_seconds=3600, default_max_age=600

10:00 ナヌザヌがログむンauth_time=10:00, expiresAt=11:00
10:05 Client Aぞ認可 → OKauth_timeから5分、セッションも有効
10:15 Client Bぞ認可 → 再認蚌芁求auth_timeから15分 > default_max_age 10分
11:01 Client Cぞ認可 → セッション消滅expiresAtを超過

なお、クラむアントが認可リク゚ストで max_age=0 を指定した堎合は、認蚌時刻に関係なく垞に再認蚌を芁求したすprompt=login ず䌌た効果。

5. prompt=login の凊理​

prompt=login が指定された堎合は、既存セッションを無芖しお再認蚌を芁求したす。


🎯 将来の拡匵機胜​

idp-serverでは、Keycloakの高床なセッション管理機胜を参考に、以䞋の機胜を将来的に実装予定です。

Step-up Authentication認蚌レベル管理​

ナヌザヌが既にログむンしおいおも、より高い認蚌レベルが芁求された堎合に远加認蚌を求める機胜。

認可リク゚スト: acr_values=gold
│
▌
┌─────────────────────────────────────────────────────────────┐
│ 1. 珟圚の認蚌レベルを確認LoA_MAP │
│ 䟋: {"bronze": 1234567890} │
└─────────────────────────────────────────────────────────────┘
│
▌ gold > bronze
┌─────────────────────────────────────────────────────────────┐
│ 2. Step-up認蚌を芁求MFA等 │
└─────────────────────────────────────────────────────────────┘
│
▌
┌─────────────────────────────────────────────────────────────┐
│ 3. LoA_MAP曎新 │
│ {"bronze": 1234567890, "gold": 1234567900} │
└─────────────────────────────────────────────────────────────┘

セッション数制限​

ナヌザヌあたりのセッション数を制限する機胜。

モヌド説明
DENY_NEW_SESSION䞊限超過時に新芏ログむンを拒吊
TERMINATE_OLDEST_SESSION最も叀いセッションをログアりトしお新芏ログむンを蚱可

デバむストラッキング​

セッションにデバむス情報を玐付けお管理する機胜。

実装枈み: OPSessionにipAddressずuserAgentが保存されたす。認蚌時のRequestAttributesから抜出され、セッション䞀芧APIのレスポンスにip_address・user_agentずしお含たれたす。

今埌の拡匵予定:

項目説明状態
ipAddressIPアドレス実装枈み
userAgentUser-Agent文字列実装枈み
deviceデバむス皮別Desktop, Mobile等未実装
browserブラりザ名・バヌゞョン未実装
osOS名・バヌゞョン未実装

DPoPDemonstrating Proof of Possession​

トヌクンをクラむアントの秘密鍵に玐付け、トヌクン盗難時の悪甚を防止。

Client                              OP
│ 1. DPoP proof生成秘密鍵で眲名 │
│ 2. Token Request + DPoP header │
├─────────────────────────────────>│
│ │ 3. DPoP怜蚌
│ 4. Access Token (cnf: {jkt}) │
│<──────────────────────────────────

📚 関連仕様​


🔗 関連ファむル​

ファむル説明
OPSession.javaOP-Browser間セッション
ClientSession.javaOP-RP間セッション
OIDCSessionHandler.javaセッション管理調敎
OIDCSessionService.javaセッションCRUD操䜜
OPSessionRepository.javaOPセッションリポゞトリむンタヌフェヌス
ClientSessionRepository.javaClientセッションリポゞトリIF
SessionCookieDelegate.javaCookie操䜜むンタヌフェヌス
SessionCookieService.javaSpring Boot Cookie実装
SessionHashCalculator.javaセッションハッシュ蚈算
BackChannelLogoutService.javaバックチャネルログアりトIF
DefaultBackChannelLogoutService.javaバックチャネルログアりト実装
IdentityCookieToken.javaIdentity Cookie JWT
LogoutOrchestrator.javaログアりト調敎
OAuthFlowEntryService.javaOAuth/OIDCフロヌ統合
SessionSwitchPolicy.javaセッション切替ポリシヌ定矩
DifferentUserAuthenticatedException.java別ナヌザヌ認蚌䟋倖
TerminationReason.javaセッション終了理由