- Cookie 是服務器委託瀏覽器存儲的一些數據,讓服務器有了“記憶能力”;
- 響應報文使用 Set-Cookie 字段發送“key=value”形式的 Cookie 值;
- 請求報文裏用 Cookie 字段發送多個 Cookie 值;
- 爲了保護 Cookie,還要給它設置有效期、作用域等屬性,常用的有 Max-Age、Expires、Domain、HttpOnly 等;
- Cookie 的生存週期
Max-Age 優先級大於 Expires
“Expires”俗稱“過期時間”,用的是絕對時間點,可以理解爲“截止日期”(deadline)。“Max-Age”用的是相對時間,單位是秒,瀏覽器用收到報文的時間點再加上 Max-Age,就可以得到失效的絕對時間。
- Cookie 的作用域
“Domain”和“Path”指定了 Cookie 所屬的域名和路徑,瀏覽器在發送 Cookie 前會從 URI 中提取出 host 和 path 部分,對比 Cookie 的屬性。如果不滿足條件,就不會在請求頭裏發送 Cookie。
- Cookie 的安全性
屬性“HttpOnly”會告訴瀏覽器,此 Cookie 只能通過瀏覽器 HTTP 協議傳輸,禁止其他方式訪問,瀏覽器的 JS 引擎就會禁用 document.cookie 等一切相關的 API,腳本攻擊也就無從談起了。
另一個屬性“SameSite”可以防範“跨站請求僞造”(XSRF)攻擊,設置成“SameSite=Strict”可以嚴格限定 Cookie 不能隨着跳轉鏈接跨站發送,而“SameSite=Lax”則略寬鬆一點,允許 GET/HEAD 等安全方法,但禁止 POST 跨站發送。
還有一個屬性叫“Secure”,表示這個 Cookie 僅能用 HTTPS 協議加密傳輸,明文的HTTP 協議會禁止發送。但 Cookie 本身不是加密的,瀏覽器裏還是以明文的形式存在。
Chrome 開發者工具是查看 Cookie 的有力工具,在“Network-Cookies”裏可以看到單個頁面 Cookie 的各種屬性,另一個“Application”面板裏則能夠方便地看到全站的所有
Cookie。
- Cookie 最基本的用途是身份識別,實現有狀態的會話事務。