萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網頁製作 >> 互動設計

前端必懂:Cookie 屬性全解析與最佳實踐指南

Cookie 是前端狀態管理的基石,看似簡單的 `name=value` 背後,隱藏著生命週期控制、作用域隔離、安全防禦、性能優化、編碼規範、存儲選型等工程細節。實戰中踩過的坑,總結成這份完整屬性圖譜與避坑指南。

核心屬性詳解

1. expires / max-age —— 生命週期控制器

屬性單位行為優先級
expiresGMT 日期字符串指定過期絕對時間,舊標準低(被 max-age 覆蓋)
max-age秒指定相對生存秒數,現代標準高
  • max-age > 0: 持久化 Cookie,寫入硬盤,關閉瀏覽器/電腦仍有效,直至秒數耗盡。
  • max-age < 0(默認 -1): 會話級 Cookie,僅內存存儲,關閉當前瀏覽器窗口及其子窗口即失效。(注意:IE6 下新開窗口/標籤仍共享 Session,現代瀏覽器進程級共享)
  • max-age = 0: 立即刪除 Cookie(無刪除 API,通過即時失效實現)。
  • 未設置: 默認 Session Cookie(max-age=-1)。

2. domain —— 跨域共享的鑰匙

  • 默認值:創建 Cookie 頁面的主機名(如 `a.example.com`)。
  • 設置為 `.example.com`(前綴點可選,現代瀏覽器均支援),則 `a.example.com`、`b.example.com`、以及 `example.com` 下所有子域可共享。
  • 安全限制: 不能設置為當前域之外的域(無法將 `example.com` Cookie 設置為 `other.com`)。

3. path —— 路徑級作用域

  • 默認:創建頁面所在目錄及其子目錄(如 `/blog/` 則 `/blog/post/1` 可訪問)。
  • 設置 `/` 可讓全站訪問。注意: Path 不是安全邊界,同域下 JS 可讀取任意 Path Cookie。

4. Secure —— 傳輸加密強制

  • Boolean,`true` 時僅 HTTPS 傳輸,HTTP 請求不攜帶。
  • 必須配合 HTTPS 站點使用,否則 Cookie 永不發送。

5. HttpOnly —— XSS 防線

  • Boolean,`true` 時 JS (`document.cookie`) 無法讀寫,僅 HTTP 請求頭自動攜帶。
  • 核心作用: 緩解 XSS 攻擊竊取 Session ID。實戰慘痛教訓: 曾花 2 小時排查 JS 讀不到 Cookie,最終發現後端設置了 HttpOnly。
  • 獨立於 Secure:可單獨 HttpOnly、單獨 Secure、或雙重保障。

6. SameSite —— CSRF 終結者(現代必加)

值行為適用場景
Strict僅第一方請求攜帶(地址欄跳轉/書籤),任何第三方鏈接/表單/iframe 不攜帶高安全需求:銀行轉賬、修改密碼
Lax(現代默認)第一方 + 安全跨站請求(GET 鏈接跳轉、預加載),POST 表單/iframe 不攜帶大多數業務 Cookie,平衡安全與體驗
None所有跨站請求攜帶,**必須配合 Secure=true**第三方嵌入場景:SSO、廣告追蹤、嵌入式 Widget

傳輸性能:Cookie 體積即延遲

每次 HTTP 請求自動攜帶同域 Cookie。**Web 性能鐵律:單域 Cookie 總量 < 4KB,關鍵域 < 1KB**。

  • 超限風險:請求頭過大導致 431 錯誤、增加 RTT、擠佔頻寬。
  • 優化:非必要數據改用 `localStorage`/`sessionStorage`/`IndexedDB`;域名拆分靜態資源域(無 Cookie 域);定期清理過期/無用 Cookie。

編碼規範:別讓特殊字符搞壞解析

  • Cookie 值禁止:分號 `;`、逗號 `,`、空格 ` `、等號 `=`。
  • 統一編碼:`encodeURIComponent(value)` 存儲,`decodeURIComponent(value)` 讀取。
  • 封裝工具函數 `setCookie(name, value, options)` / `getCookie(name)` 統一處理編碼、屬性默認值、錯誤兜底。

存儲選型:Cookie 不是萬能倉庫

特性CookielocalStoragesessionStorageIndexedDB
容量~4KB5-10MB5-10MB數百 MB
隨請求發送✅ 自動❌ 否❌ 否❌ 否
過期控制max-age/expires手動清理/永久標籤頁關閉清空手動/版本控制
同源策略Domain/Path 靈活嚴格同源嚴格同源+標籤頁隔離嚴格同源
適用場景身份認證、CSRF Token、少量狀態同步客戶端緩存、偏好設定、離線數據表單暫存、多步驟向導中間態複雜結構化數據、離線優先應用

同名 Cookie 覆蓋規則

  • 同名 + 同 Domain + 同 Path = 同一 Cookie(後寫入覆蓋前值,`expires/max-age` 同步更新)。
  • 同名 + 不同 Domain 或 不同 Path = 不同 Cookie(並存,瀏覽器按 Path 長度優先發送最具體者)。

調試技巧

  • DevTools Application → Cookies:查看/編輯/刪除、過濾 Domain/Path、查看 Size/Expires/HttpOnly/SameSite。
  • Network → Request Headers → Cookie:實際發送內容驗證。
  • `document.cookie` 控制台快速查看當前頁可訪問 Cookie 字符串。

結語:細節決定安全與體驗

Cookie 屬性配置不是樣板代碼,每一個屬性都是對安全邊界、生命週期、作用域、傳輸性能的精確宣告。下次設置 Cookie 時,請逐項核對:`max-age` 合理?`Domain/Path` 最小化?`Secure; HttpOnly; SameSite=Lax` 全上了嗎?這才是專業前端的標配。

文章來源:搜道 UED

copyright © 萬盛學電腦網 all rights reserved