| 維度 | Cookie | Session |
|---|---|---|
| 存儲位置 | 客戶端(瀏覽器內存/硬盤) | 服務端(內存/數據庫/Redis) |
| 生命週期控制 | 可設置過期時間(持久化)或會話級(關閉瀏覽器失效) | 服務端控制,默認 30 分鐘無操作過期,可配置 |
| 數據大小限制 | 單個 ≤ 4KB,域名下 ≤ 20 個 | 理論無上限,受服務端內存/存儲限制 |
| 安全性 | 低:明文傳輸,易被竄改、盜取(XSS/CSRF) | 高:敏感數據不離開服務端,僅傳 SessionID |
| 服務端壓力 | 無 | 高併發時佔用大量內存,需集群共享方案 |
| 跨域支持 | 原生支持(設置 Domain/Path) | 需共享存儲(Redis/Sticky Session) |
.example.com 含子域名)/app)Strict/Lax/None(防 CSRF),現代瀏覽器默認 LaxJSESSIONID(Cookie 或 URL 重寫)Set-Cookie: JSESSIONID=xxx; Path=/; HttpOnly 種植到瀏覽器將 SessionID 附加在 URL 參數或路徑中:url;jsessionid=xxx。Servlet API response.encodeURL(url) 自動判斷是否需要重寫。
session.invalidate() 重建需要跨瀏覽器會話持久化? → 是 → Cookie(設置 Max-Age)
↓ 否
數據敏感/大於 4KB/不想暴露給客戶端? → 是 → Session (Redis)
↓ 否
僅需客戶端輕量標識(如偏好設置、追蹤 ID)? → Cookie
↓ 否
服務端有狀態邏輯(購物車、權限、多步表單)? → Session
JSESSIONID(HttpOnly)Cookie 是「客戶端身份證」,Session 是「服務端檔案櫃」。敏感、大數據、服務端邏輯用 Session(Redis);非敏感、持久化、客戶端只讀用 Cookie。現代架構下,Session 必須外置到 Redis 實現無狀態水平擴展,Cookie 僅作為 SessionID 傳輸載體,並開啟全部安全屬性。