網路伺服器回應資源要求時,可以在回應中加入 Set-Cookie 標頭。該標頭會告知瀏覽器儲存 Cookie。
例如:Set-Cookie:cat=tabby。
除了提供 Cookie 名稱和值,Set-Cookie 還可以包含屬性,控制是否設定 Cookie,以及 Cookie 的到期時間。Cookie 屬性之間以半形分號分隔。例如:
Set-Cookie:cat=tabby; Secure; HTTPOnly; Expires=Tue, 31 Dec 2999 23:59:59 GMT;
本文說明最重要的 Cookie 屬性:
使用 HTTP Cookie 一文以更深入的技術細節說明 Cookie 屬性。
安全
如果 Set-Cookie 標頭包含 Secure,系統只會在採用 HTTPS 通訊協定的加密要求中加入 Cookie,不會在 HTTP 要求中加入 Cookie。這有助於防範中間人攻擊,也就是攻擊者在瀏覽器和伺服器之間的通訊中偷偷介入,藉此傳遞資訊,甚至可能竄改資訊。
HTTPOnly
如果 Set-Cookie 標頭包含 HTTPOnly,JavaScript 就無法存取 Cookie,例如使用 document.cookie。這有助於防範針對 Cookie 的特定類型攻擊。
SameSite
如果要求資源的網站與您造訪的網站不同,就是跨網站要求。為回應跨網站要求而設定的 Cookie 是第三方 Cookie。
SameSite 屬性會控管要求中是否包含第三方 Cookie。可能的值為 Strict、Lax 或 None。
瞭解詳情:什麼是第三方 Cookie?
嚴格
只有在回應來自 Cookie 來源網站網頁的要求時,才會傳送 Cookie。舉例來說,假設使用者造訪 cats.example,且已設定含有 SameSite=Strict 屬性的 Cookie。稍後,使用者瀏覽其他網站,並點選連結前往 cats.example 的頁面。系統不會將設定的 Cookie 納入該要求。
Lax
這與 Strict 的運作方式相同,差別在於使用者點選連結前往 Cookie 的來源網站時,瀏覽器也會一併傳送 Cookie。(在先前的 Strict 範例中,使用者點選 cats.example 的連結時,系統會加入 Cookie。) 如果 Set-Cookie 標頭中未加入任何 SameSite 屬性,則預設為 Lax。
無
無限制:無論是否為跨網站要求,系統都會在要求中加入 Cookie。使用 SameSite=None 時,Cookie 也必須具備 Secure 屬性。
已分區
這個屬性可讓您選擇將 Cookie 存入分割儲存空間,每個頂層網站都有各自的「Cookie 罐」。Cookie 會依頂層網站和設定 Cookie 的網域進行雙重鍵控。
舉例來說,假設網站 A 和網站 B 都包含來自網站 C 的 iframe。網站 A 的 iframe 設定的分區 Cookie 無法由網站 B 的 iframe 存取:AC Cookie 與 BC Cookie 是分開的。
具有 Partitioned 屬性的 Cookie 稱為 CHIPS,也就是具有獨立分區狀態的 Cookie。
分區 Cookie 必須具備 Secure 屬性。
詳情請參閱「具有獨立分區狀態的 Cookie」。
Expires 和 Max-Age
您可以指定 Expires 日期和時間,或以秒為單位的 Max-Age,之後系統就會刪除 Cookie,且不再傳送。例如:
Set-Cookie:cat=tabby; Expires=Tue, 31 Dec 2999 23:59:59 GMT;Set-Cookie:cat=tabby; Max-Age=86400
如未指定 Max-Age 或 Expires 屬性,系統會在目前工作階段結束時刪除 Cookie。這類 Cookie 有時也稱為「工作階段 Cookie」。
網域
如果 Set-Cookie 標頭具有 Domain 屬性,系統會將 Cookie 納入對指定網域及其任何子網域的要求中。
如果 Set-Cookie 標頭沒有 Domain 屬性,系統就不會在對子網域的要求中加入 Cookie。
換句話說,加入 Domain 屬性會減少網域限制。
舉例來說,如果網站 cats.example 回應:
Set-Cookie:cat=tabby
只有對cats.example的要求才會包含 CookieSet-Cookie:cat=tabby; Domain=cats.example
系統會將 Cookie 納入對cats.example的要求,以及對子網域 (例如fluffy.cats.example或user.assets.cats.example) 資源的任何要求
路徑
如果 Set-Cookie 回應標頭中包含 Path 屬性,則只有向與 Path 值相符的網址 (位於設定 Cookie 的網站上!) 發出要求時,才會納入設定的 Cookie。
例如:
Set-Cookie:cat=tabby; Path=/articles
系統會將 Cookie 納入以/articles開頭的任何網址路徑要求:
✅https://cats.example/articles/tabby/index.html
✅https://cats.example/articles/breeds/tabby/index.html
❎https://cats.example/images/tabby.jpg
❎https://cats.example/en/articles/tabby/index.htmlSet-Cookie:cat=tabby; Path=/
對網站上任何網址提出的要求都會包含 Cookie。
如果 Set-Cookie 回應標頭沒有 Path 值,Cookie 就只會隨附於對相同目錄的要求。舉例來說,假設系統在回應 cats.example/images/tabby.jpg. 的要求時設定了 cat=tabby Cookie。如果未設定 Path,系統只會在要求 cats.example/images 目錄中的檔案時,加入該 Cookie。
示範
- 1pc.glitch.me:第一方 Cookie 示範
- 3pc.glitch.me:第三方 Cookie 示範
工具
瞭解詳情
- 第一方 Cookie 食譜
- 什麼是 Cookie?
- 什麼是第三方 Cookie?
- HTTP 要求和回應
- Cookie 工具
- Cookie 示範
- 使用 HTTP Cookie
- SameSite Cookie 說明
- OWASP:Cookie