
Cookie、Session、Token、LocalStorage——每個都能存資料,但搞混了就是資安漏洞。
先講結論
認證資訊最安全的做法是 HttpOnly Cookie + Session(伺服器端驗證、防 XSS、自動過期)。需要可擴展性就用 JWT Token(但拜託存在 HttpOnly Cookie 裡,不要存 LocalStorage)。一般資料需要持久化就 LocalStorage,只需要當前分頁就 SessionStorage。
Cookie:自動跟著請求走的小紙條
Cookie 的特別之處在於:瀏覽器會自動在每次請求帶上它。你不用寫任何程式碼,Cookie 就會乖乖跟著 HTTP 請求一起送出去。
首次請求
瀏覽器 ─── GET /login ──────────→ 伺服器
←── Set-Cookie: session=abc ──
後續請求(Cookie 自動帶上)
瀏覽器 ─── GET /profile ─────────→ 伺服器
Cookie: session=abc
但 Cookie 只有約 4KB 的容量,而且有一堆安全屬性要設定好。重點屬性:
- HttpOnly:JavaScript 讀不到,防 XSS 攻擊
- Secure:只在 HTTPS 傳送
- SameSite:防 CSRF(設
Strict或Lax)
這三個屬性是資安的基本盤。如果你看到一個網站的認證 Cookie 沒有設 HttpOnly——那它的安全性大概跟沒鎖門差不多。
Session:狀態存在伺服器那邊
Session 的概念是:敏感資料存在伺服器端,只發給瀏覽器一個 Session ID(通常放在 Cookie 裡)。瀏覽器每次帶著 ID 來,伺服器查表就知道你是誰。
// 這樣做很危險:直接把使用者資料存在 Cookie
Set-Cookie: user={"id":1,"name":"John","role":"admin"} // ❌
// Session 做法:只存一個 ID
Set-Cookie: sessionId=abc123 // ✅ 敏感資料在伺服器端Session 的缺點是不好水平擴展。你有三台伺服器,使用者登入在 A 機器建了 Session,下一個請求被 load balancer 導到 B 機器——B 機器不認識他。解法有 sticky session 或 Redis 共享 Session,但都增加了複雜度。
Token (JWT):自己帶著身分證走
JWT(JSON Web Token)的設計思路完全不同:把使用者資訊和簽章打包成一個 Token,伺服器不需要存任何狀態。Token 自己就包含了所有驗證需要的資訊。
// 登入後拿到 Token
const { token } = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ email, password })
}).then(r => r.json());
// 後續請求帶上 Token
fetch('/api/profile', {
headers: { 'Authorization': `Bearer ${token}` }
});JWT 的好處是無狀態、好擴展——不管你有幾台伺服器,拿到 Token 就能驗證。但代價是很難「立即撤銷」一個 Token(因為伺服器不記得發過哪些 Token),你得另外維護黑名單機制。
Token 存哪裡是一個經典的資安爭論。存 LocalStorage 方便但有 XSS 風險,存 HttpOnly Cookie 安全但有 CSRF 風險。我的建議是存 HttpOnly Cookie——CSRF 比 XSS 容易防禦得多。
LocalStorage 跟 SessionStorage
這兩個跟認證沒什麼關係,就是前端的小倉庫:
- LocalStorage:永久儲存,關掉瀏覽器還在。適合放使用者偏好、暫存草稿
- SessionStorage:分頁關掉就沒了。適合放表單暫存、不需要跨分頁的臨時資料
容量都是約 5MB,比 Cookie 大很多,但不會自動隨請求傳送。
安全性:你不能不知道的兩大攻擊
XSS(跨站腳本攻擊):攻擊者在你的網站注入 JavaScript,偷走 LocalStorage 裡的 Token。所以認證資訊不要放 LocalStorage,放 HttpOnly Cookie 讓 JS 根本碰不到。
CSRF(跨站請求偽造):攻擊者誘騙使用者的瀏覽器發送請求,利用自動帶上的 Cookie 冒充使用者。防禦方法:SameSite=Strict Cookie + CSRF Token。
這兩個攻擊手法是面試常客,但更重要的是你在實務上真的會遇到。搞懂它們不是為了面試,是為了不讓你的使用者被偷資料。
資料要存哪裡不是技術問題,是安全問題。選錯了不會報錯,但會上新聞。