Cookie是什么?
先給大家舉個例子,F12 打開瀏覽器的頁面之后,我們能在 Response Headers 的字段里面看到一個header 叫做 Set-Cookie,如下所示
圖中包含的 Set-Cookie 為
Set-Cookie:uuid_tt_dd=10_20293537580-1709432565344-232525; Expires=Thu, 01 Jan 2025 00:00:00 GMT; Path=/; Domain=.csdn.net
這個例子中,uuid_tt_dd 的值為 10_20293537580-1709432565344-232525,這個cookie 在2025 年 1 月 1 日過期,只能由 .csdn.net 域和其根路徑下的頁面訪問,我們可以在瀏覽器調試模式下的 Application 中找到uuid_tt_dd被瀏覽器記錄下來的樣式。
當發起新的請求時,Cookie 會出現在請求的 Request Headers中。
從這里我們可以看到,Request Headers里面的 Cookie 中記錄了 uuid_tt_dd。
基礎交互流程如下所示
Cookie 說白了就是一個 http 協議中的 header 字段,這個字段會由被訪問的網站放在response-header 中通過 Set-Cookie 返回,當用戶瀏覽該網站時,瀏覽器存儲 Cookie 后,下次訪問會將該值帶上,那么這個值的信息代表什么含義?這是可以由網站開發者定義的,可以在這個值中存一些如登錄狀態的信息,這樣當請求攜帶 cookie 時,信息會被讀取以幫助網站記住用戶的訪問信息和偏好設置,使得網站能夠為用戶提供個性化的瀏覽體驗,并可以用于追蹤用戶在網站上的行為。
Cookie分類和屬性含義
屬性
Cookie在HTTP協議中位于HTTP頭部。它有多個屬性,包括:Expires/Max-Age,Domain,Path,Secure,HttpOnly,SameSite等,這些屬性幫助控制Cookie的安全性和使用范圍。
Expires/Max-Age: Expires 和 Max-Age 是 Cookie 的兩個屬性,用于定義 Cookie 的有效期。Expires 指定了 Cookie 的過期日期和時間,瀏覽器會在這個時間后刪除 Cookie。它使用特定的日期格式,如 Expires=Wed, 09 Jun 2021 10:18:14 GMT 。Max-Age 指定了從當前時間開始,Cookie 存在的秒數。例如,Max-Age=3600 表示 Cookie 將在一小時后過期。如果同時指定了 Expires 和 Max-Age ,Max-Age 具有更高的優先級。
Domain: Domain 屬性定義了哪些域名可以接收 Cookie。設置 Domain 屬性后,不僅當前域名下的頁面可以訪問這個 Cookie,指定的域以及其子域也能訪問。例如,如果一個Cookie 的 Domain 屬性被設置為 example.com ,那么 www.example.com 和subdomain.example.com 等都可以訪問這個 Cookie。這有助于跨子域共享 Cookie信息,但也需要謹慎使用以避免安全問題。。
Path: Path 屬性指定了哪些網站路徑下的頁面可以訪問 Cookie。如果設置了 Path=/blog ,那么只有網址下的 /blog 目錄及其子目錄中的頁面能夠訪問這個 Cookie。這有助于限制 Cookie 的訪問范圍,確保只有特定部分的網站可以使用該 Cookie,從而提高網站的安全性和數據的準確性。。
Secure: Secure 屬性標記 Cookie 僅通過安全的 HTTPS 連接發送。Secure 屬性設置后,Cookie 只會在 HTTPS 請求中被發送。這有助于防止 Cookie 在數據傳輸過程中被竊聽,增強了用戶數據的安全性。
HttpOnly: 當 Cookie 設置為 HttpOnly 時,意味著這個 Cookie 只能通過 HTTP 協議被服務器訪問,而不能通過客戶端腳本(如 JavaScript )訪問,這有助于增強安全性,防止跨站腳本攻擊( XSS )。這種設置不限制 Cookie 通過 HTTP 或 HTTPS 協議傳輸,主要目的是提高安全性,確保只有服務器能夠讀取 Cookie 信息。
SameSite: SameSite 屬性用于控制 Cookie 在跨站請求中的發送行為,有助于防止跨站請求偽造攻擊(CSRF)。它有三個值:Strict 、Lax 和 None。 Strict 只允許來自相同站點的請求發送 Cookie;Lax 允許某些第三方請求發送 Cookie,例如從其他網站導航到鏈接的情況;None 允許所有跨站請求發送Cookie,但必須與 Secure 屬性一起使用,確保Cookie僅通過安全連接發送。不設置SameSite
屬性和將SameSite
設置為None
在效果上不完全相同,未明確設置 SameSite 屬性時,瀏覽器可能會使用默認行為,這在不同的瀏覽器和版本中可能有所不同。而明確將 SameSite 設置為 None 則指示瀏覽器在所有跨站請求中發送 Cookie,但這必須與 Secure 屬性一起使用,以確保Cookie僅通過 HTTPS傳輸。因此,明確設置提供了更明確的控制和跨瀏覽器的一致性。
一個包含多種屬性的Cookie例子可能是這樣的:
Set-Cookie: UID=Jack; Expires=Wed, 09 Jun 2023 10:18:14 GMT; Domain=example.com; Path=/; Secure; HttpOnly; SameSite=Strict
這個例子中,UID 是設置給用戶 Jack 的Cookie,它在2023年6月9日過期,只能由example.com域和其根路徑下的頁面訪問。此Cookie僅通過HTTP傳輸,不允許JavaScript訪問,且設置了SameSite為Strict,限制跨站點的發送。
類型
Cookie可以分為多種類型,包括基于生命周期的會話Cookie和持久Cookie;基于來源的第一方Cookie和第三方Cookie;以及基于功能的安全Cookie、HttpOnly Cookie、偏好Cookie、認證Cookie和跟蹤/廣告Cookie。還有其他特殊類型,如僵尸Cookie、Flash Cookie(本地共享對象)、超級Cookie和SameSite Cookie,它們在安全性、用戶跟蹤和廣告方面各有用途。這些分類幫助網站在為用戶提供個性化體驗的同時,確保交互的安全性和遵守隱私法規。
第一方 Cookie(First-party cookies):第一方Cookie是由用戶直接訪問的網站創建并設置的,它們通常用于記住用戶信息和偏好,如登錄狀態、語言選擇、主題偏好等,以便在用戶再次訪問網站時提供更個性化的體驗第一方Cookie僅為當前訪問的網站所用,不會被其他網站訪問或共享。
第三方Cookie(Third-party cookies):三方Cookie(Third-party cookies)是由非當前用戶正在訪問的網站域設置的Cookie。它們主要用于跨站跟蹤,允許第三方收集用戶在不同網站上的瀏覽信息,從而用于廣告定位、分析和個性化服務等目的。三方Cookie通常通過第三方廣告或者網頁元素(如圖像、廣告橫幅、或者社交媒體插件等)嵌入到網頁中來設置和訪問。
舉例來說,如果你訪問一個網站,這個網站包含了一個第三方廣告公司的廣告,那么這個廣告公司可能會在你的設備上設置一個Cookie,即使這個廣告公司的網站你并沒有直接訪問過。隨后,當你訪問其他包含同一廣告公司廣告的網站時,該公司可以讀取其之前在你設備上設置的Cookie,從而跟蹤你的網上行為,分析你的興趣和偏好,以便提供更加個性化的廣告。
會話Cookie(Session cookies):會話Cookie是臨時的Cookie,用于記住用戶在瀏覽器會話期間的活動。當用戶關閉瀏覽器窗口時,這些Cookie會被自動刪除。它們對于保持用戶登錄狀態、購物車中的商品等在短期內的信息至關重要。會話Cookie不需要指定過期時間(Expires)或最大年齡(Max-Age)屬性。當創建Cookie時,省略這些屬性,瀏覽器就會把它當作會話Cookie處理,這意味著用戶關閉瀏覽器窗口后,Cookie會被自動刪除。
持久Cookie(Persistent cookies):持久Cookie在用戶的設備上存儲更長時間,直到它們到達設定的過期日期或被用戶手動刪除。這類Cookie用于記住用戶的登錄信息、偏好設置和在多次訪問之間跟蹤用戶的活動。