Cookie 是儲存在瀏覽器中的一小段資料,用於保存網站執行功能所需的狀態和其他資訊。
Cookie 是網站儲存在使用者電腦上的小型檔案,其中儲存的資訊會在瀏覽器和網站之間來回傳輸。
每個 Cookie 都是鍵/值組合,以及控制 Cookie 使用時間和地點的屬性。這些屬性可用於設定到期日,或指出 Cookie 只能透過 HTTPS 傳送。您可以在 HTTP 標頭或透過 JavaScript 介面設定 Cookie。
Cookie 是其中一種方法,可將持續性狀態新增至網站。多年來,這些功能不斷成長和演進,但卻在平台留下一些有問題的舊版問題。為解決這個問題,瀏覽器 (包括 Chrome、Firefox 和 Edge) 正在改變行為,以強制執行更多隱私權保護預設值。
Cookie 運作方式
假設您想在網誌中向使用者顯示「最新消息」宣傳活動,使用者可以關閉宣傳,之後一段時間內就不會再看到。您可以將該偏好設定儲存在 Cookie 中,將到期時間設為一個月 (2,600,000 秒),並只透過 HTTPS 傳送。標頭如下所示:
Set-Cookie: promo_shown=1; Max-Age=2600000; Secure
Set-Cookie 標頭設定 Cookie。
如果讀者瀏覽的網頁符合這些條件 (使用安全連線,且 Cookie 不超過一個月),瀏覽器就會在要求中傳送這個標頭:
Cookie: promo_shown=1
Cookie 標頭中傳回 Cookie。
您也可以使用 document.cookie,在 JavaScript 中新增及讀取該網站可用的 Cookie。指派給 document.cookie 會建立或覆寫含有該金鑰的 Cookie。舉例來說,您可以在瀏覽器的 JavaScript 控制台中嘗試下列操作:
→ document.cookie = "promo_shown=1; Max-Age=2600000; Secure"
← "promo_shown=1; Max-Age=2600000; Secure"
讀取 document.cookie 會輸出目前環境中可存取的所有 Cookie,並以半形分號分隔每個 Cookie:
→ document.cookie;
← "promo_shown=1; color_theme=peachpuff; sidebar_loc=left"
document.cookie 存取 Cookie。
如果您在熱門網站上試用這項功能,會發現大多數網站設定的 Cookie 遠遠超過三個。在大多數情況下,系統會在每次向該網域發出要求時傳送這些 Cookie,這會造成許多影響。使用者的上傳頻寬通常比下載頻寬受限,因此所有輸出要求的額外負荷都會導致首次待命時間延遲。請謹慎設定 Cookie 的數量和大小。請使用 Max-Age 屬性,確保 Cookie 不會保留超過必要時間。
什麼是第一方和第三方 Cookie?
如果您返回先前查看的網站,可能會發現各種網域都有 Cookie,而不只是您目前造訪的網域。如果 Cookie 與目前網站的網域相符 (也就是瀏覽器網址列中顯示的網域),則稱為第一方 Cookie。同樣地,來自目前網站以外網域的 Cookie 稱為第三方 Cookie。這並非絕對標籤,而是與使用者情境相關;視使用者當時造訪的網站而定,同一個 Cookie 可能是第一方或第三方。
延續先前的例子,假設其中一篇網誌文章有一張特別可愛的貓咪圖片,且圖片位於 /blog/img/amazing-cat.png。由於這張圖片非常出色,其他人直接在自己的網站上使用。如果訪客曾造訪你的網誌並擁有 promo_shown Cookie,當他們在其他人的網站上查看 amazing-cat.png 時,該 Cookie 會隨要求一併傳送。由於 promo_shown 未用於該使用者的網站,因此對任何人來說都不特別實用,只會增加要求負擔。
如果這是非預期的效果,為什麼要這麼做?網站在第三方環境中使用時,就是透過這項機制維持狀態。舉例來說,如果您在網站上嵌入 YouTube 影片,訪客就會在播放器中看到「稍後觀看」選項。如果訪客已登入 YouTube,第三方 Cookie 會在嵌入式播放器中提供該工作階段,也就是說,「稍後觀看」按鈕會直接儲存影片,而不會提示訪客登入,也不會將他們導向 YouTube 頁面。
網路的文化特質之一,就是預設為開放。這也是許多人能在該平台創作自己的內容和應用程式的原因。不過,這也引發了許多安全和隱私權疑慮。跨網站要求偽造 (CSRF) 攻擊會利用 Cookie 附加至特定來源的任何要求,無論要求是由誰發起。舉例來說,如果您造訪 evil.example,該網站可能會觸發對 your-blog.example 的要求,而瀏覽器會附加相關聯的 Cookie。如果網誌未謹慎驗證這些要求,evil.example 就可能觸發刪除文章或新增自己內容等動作。
使用者也越來越瞭解 Cookie 如何追蹤他們在多個網站上的活動。不過,目前還無法明確指出您對 Cookie 的意圖。您的 promo_shown Cookie 應只在第一方情境中傳送,而用於嵌入其他網站的小工具工作階段 Cookie 則刻意在第三方情境中提供登入狀態。
您可以設定適當的 SameSite 屬性,明確指出 Cookie 的用途。
如要找出第一方 Cookie 並設定適當的屬性,請參閱第一方 Cookie 做法。