Session 與 Cookie 是 Web 會話管理的兩大基石。本文從儲存位置、數據類型、路徑作用域、依賴關係、生命週期、安全性六個維度系統對比,並說明禁用 Cookie 時 Session 的替代機制 (URL 重寫)。
| 維度 | Session | Cookie |
|---|---|---|
| 儲存位置 | 伺服器端 (記憶體/資料庫/集群快取) | 客戶端瀏覽器 (文本文件/記憶體) |
| 數據類型 | 任意 Java 對象 | 僅字串 (Key-Value) |
| 路徑作用域 | 全域:同一會話內任何路徑均可訪問 | 可指定 path 屬性限制路徑,不同路徑 Cookie 隔離 |
| 依賴關係 | 預設依賴 Cookie 傳遞 Session ID (JSESSIONID) | 獨立運作,無賴 Session |
| 生命週期 | 會話結束/超時失效 (預設 30 分鐘無操作) | 可設 maxAge 長期持久化 (跨會話、跨瀏覽器重啟) |
| 安全性 | 敏感數據不離開伺服器,相對安全 | 客戶端可見、可竄改、易受 XSS/CSRF 攻擊,需 HttpOnly、Secure 標誌 |
JSESSIONID。Set-Cookie: JSESSIONID=xxx; Path=/ 發送給瀏覽器。若客戶端禁用 Cookie,伺服器可啟用 URL 重寫:將 Session ID 編碼嵌入所有 URL。
// 伺服器端編碼示例 (JSP/Filter 中)
String url = response.encodeURL("index.jsp?id=3");
// 輸出: index.jsp;jsessionid=ABC123?id=3
原理:伺服器解析 URL 中的 jsessionid 參數識別 Session。缺點:URL 醜陋、易洩露 Session ID (書籤、日誌、Referer)、需確保所有鏈接/表單/重定向經過編碼。
httpOnly、secure (僅 HTTPS 傳輸 Session ID Cookie);定期輪換 Session ID 防固定攻擊。HttpOnly 防 XSS、Secure 防明文傳輸、SameSite 防 CSRF;避免存大量數據 (4KB 上限、每請求攜帶影響性能)。Session 與 Cookie 互補而非互斥:Session 解決伺服器端有狀態存儲,Cookie 解決客戶端標識傳遞。理解兩者儲存邊界、作用域、生命週期差異,配合 URL 重寫應對無 Cookie 場景,並遵循安全配置原則,是構建健壯 Web 會話管理的基石。