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_IDENTITY | opSessionId | Yes | SSOèå¥çšïŒãµãŒããŒåŽã§äœ¿çšïŒ |
IDP_SESSION | SHA256(opSessionId) | No | Session Management iframeçš |
__Host-IDP_BROWSER_{tenantId} | ä¹±æ°ïŒOPSession ã«ã¯ããã·ã¥ã ãïŒ | Yes | ãã®ãã©ãŠã¶ããã°ã€ã³ããŠåãåã£ãã»ãã·ã§ã³ã㮠蚌ãSecureã»Path=/ã»Domain ãªãåºå®ãã¢ã«ãŠã³ã飿ºã® /linking/start ã getBrowserHeldOPSessionFromCookie ã§ç
§åãã |
åèå®è£ : 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);
}
}