核心概念速覽
| 維度 | Cookie | Session |
| 存儲位置 | 客戶端瀏覽器(臨時文件/內存) | 服務端內存/數據庫/Redis 等 |
| 生命周期控制 | setMaxAge(秒);未設置則瀏覽器關閉失效 | 默認 30 分鐘無訪問失效;可配置 web.xml 或代碼 setMaxInactiveInterval |
| 安全性 | 明文傳輸與存儲,易竄改/竊取;需加密敏感數據 | 數據不離開服務端,相對安全;需防 Session 劫持 |
| 網絡傳輸開銷 | 每次請求自動攜帶,增大帶寬 | 僅傳輸 Session ID(通常在 Cookie 中),體積極小 |
| 作用域 | 同域名下多窗口/標籤頁共享 | 每個瀏覽器會話獨享一個 Session 對象 |
| 存儲容量 | 單個 ≤ 4KB,總數限制(約 300 個/域) | 理論無上限,受限於服務端內存 |
生命周期細節差異
- Cookie:絕對時間。創建瞬間開始倒計時,與用戶是否活躍無關。
- Session:滑動窗口。每次訪問重置計時器;20 分鐘無操作則銷毀。關閉瀏覽器只刪除 Session ID Cookie,Session 本體仍在服務端直到超時。
常見銷毀 Session 的方式
- 關閉/重啟 Tomcat
- 熱部署/Reload Web 應用
- 超時自動失效
- 代碼調用
session.invalidate()
選型決策樹
需要跨會話持久化用戶偏好(如「記住我」)? → Cookie (設長過期時間)
涉及敏感業務數據(賬戶、權限、購物車)? → Session
數據量極小且非敏感(如頁面佈局偏好)? → Cookie 可行
高併發、分佈式集群環境? → Session + Redis 共享存儲
純靜態資源、無狀態 API? → 盡量無狀態,JWT 替代 Session
最佳實踐建議
- 敏感操作必須用 Session:登錄態、權限、交易流程。
- Cookie 僅存非敏感標識:如
rememberMe=true、語言偏好、追蹤 ID。
- 設置 Cookie 安全屬性:
HttpOnly 防 XSS、Secure 強制 HTTPS、SameSite 防 CSRF。
- Session 存儲外部化:集群環境下使用 Redis/Memcached,避免單點故障與粘性 Session。
- 定期清理過期 Session:防止內存洩漏,Tomcat 默認有清理機制,但大流量需調優。
一句話總結
Cookie 是「隨身帶」的小紙條,Session 是「服務端存」的大檔案;敏感數據進檔案,偏好設定寫紙條,分佈式環境檔案放公共倉庫。