問題定義
Cookie 受同源策略限制,無法跨主域 (如 a.com、b.com) 共享。Session 依賴 Cookie 傳遞 ID,故無法直接跨主域共享 Session。需設計機制在使用者登入後,將認證狀態同步至各主域。
提出方案:子域代理跳轉同步法
架構假設
- 主域:
a.com (身分認證中心)、b.com、c.com (業務應用)
- 各業務主域建立子域指向認證中心 IP:
passport.b.com、passport.c.com → A 伺服器
流程步驟
- 使用者在
a.com/login 完成驗證,建立 Session,取得 session_id
- 認證中心輸出導向鏈結頁面,依序導向:
passport.b.com/sync.php?sid=xxx&i=0 → passport.c.com/sync.php?sid=xxx&i=1 → ...
- 各
sync.php 執行:
session_id($_GET['sid']); session_start(); $_SESSION['synced'] = true; header('Location: ' . $next_url);
- 瀏覽器在各主域下建立相同
session_id 的 Cookie
- 最終導回業務首頁,各域 Session 已同步
關鍵代碼 (passport.b.com/sync.php)
優點與缺點分析
| 優點 | 缺點/風險 |
| 不需共享儲存體、資料庫 | 跳轉鏈路長,使用者可見網址變化 |
| 實作簡單、相容舊系統 | 任一跳轉失敗導致該域不同步 |
| 無第三方依賴 | 前端可見 session_id (URL 參數),需 HTTPS + 短效 |
| 同步後各域獨立運作 | 登出需反向同步清除所有域 Cookie |
現代標準替代方案 (強烈推薦)
OAuth 2.0 / OpenID Connect (OIDC)
- 業界標準:Keycloak、Auth0、Okta、自建 IdentityServer
- 授權碼模式 + PKCE,安全性高
- Access Token (JWT) 無狀態驗證,Refresh Token 更新
- 支援 SSO、社交登入、MFA、裝置授權
SAML 2.0
- 企業級聯邦身分識別,XML 基礎
- IdP (Identity Provider) + SP (Service Provider)
- 適合企業內部系統整合
共享 Session 儲存體 (Redis) + 同域 Cookie
- 所有主域部署於同一父域下 (如
app1.example.com, app2.example.com)
- Cookie 設定
domain=.example.com,共享 Session ID
- Session 資料集中存 Redis,各節點無狀態
結語
子域跳轉法可作為舊系統快速整合過渡方案,新系統建議直接採用 OIDC/OAuth 2.0 標準協定,安全、擴展、生態完善。
- 上一篇文章: PHP 利用 Oracle 資料庫變更通知 (DCN) 實作快取自動失效
- 下一篇文章: PHP 實作自訂搜尋引擎:串接 Google API 與結果解析重構
Copyright ©
程式碼之家 All Rights Reserved