什麼是cookie
HTTP
是無狀態協議,也就是說服務器完全不清楚是否是同一位用戶在訪問。在最開始HTTP
協議只是做爲共享文本內容而存在是可行的,但是隨着Web
發展,Web
內容的豐富化,必須需要有一種技術去記錄HTTP
協議的用戶狀態,而cookie
技術就是充當這個角色的。
簡言之,cookie
就是存儲在瀏覽器下的文本文件,用於記錄用戶狀態信息。用戶在第一次向服務器發送訪問請求時,瀏覽器發起請求,服務端返回相應通過首部set-cookie
字段向瀏覽器寫入cookie
信息,在cookie
有限期內,瀏覽器再次向服務器發起訪問請求時,會帶上cookie
信息,從而服務器能識別當前用戶身份以及保存的狀態信息等內容。
如下是google
主頁log
接口攜帶的cookie
信息。
cookie的屬性
cookie
屬性主要包含Name
、Value
、Domain
、Path
、Expires/Max-Age
、HttpOnly
、Secure
、SameSite
。
Name
:cookie
的名稱,同域名下cookie
名稱應該是唯一的,如果同域名下存在同名的cookie
會被覆蓋;Value
:cookie
的具體值,一般建議cookie
值進行編碼;Domain
:cookie
綁定的域名,如果不指定默認綁定到當前域名,也可以通過設置Domian
屬性實現跨域,就是通過將cookie
綁定在一級域名下,從而實現二級域名訪問跨域;Path
:cookie
綁定的訪問路徑,一般都是默認綁定在跟路徑下即/
;Expires/Max-Age
:cookie
的有效期,一般cookie
都是有有效時效的,時效範圍內cookie
是可用,過時效以後即失效;HttpOnly
:cookie
是否可以通過JavaScript
進行操作,如果設置HttpOnly
屬性爲true
客服端將無法操作該cookie
信息;Secure
:HTTP
不僅無狀態且是不安全的協議,內容是以明文的方式傳遞的,而Secure
這個屬性就是標示cookie
是不是僅在https
、ssl
等安全協議下使用,設置secure
爲true
時及僅安全協議使用;SameSite
:用來限制第三方cookie
的屬性,避免風險,主要包括三個值strict
(最爲嚴格,完全禁止第三方cookie
,跨站點時,任何情況下都不會發送cookie
。換言之,只有當前網頁的URL
與請求目標一致,纔會帶上cookie
)、Lax
(稍稍放寬,大多數情況也是不發送第三方cookie
)、none
(顯式關閉SameSite
屬性,必須同時設置Secure
屬性(cookie
只能通過HTTPS
協議發送),否則無效),目前Chrome 80
已經將該屬性默認設置爲Lax
規則(詳情參看:Cookies default to SameSite=Lax)。
Chrome 80的SameSite
A cookie associated with a cross-site resource at https://accounts.google.com/ was set without the SameSite attribute. A future release of Chrome will only deliver cookies with cross-site requests if they are set with SameSite=None and Secure. You can review cookies in developer tools under Application>Storage>Cookies and see more details at
https://www.chromestatus.com/feature/5088147346030592
andhttps://www.chromestatus.com/feature/5633521622188032
Chrome
升級到80版本之後cookie
的SameSite
屬性默認值由None
變爲Lax
,這也就造成了一些訪問跨域cookie
無法攜帶的問題。比如本地調試時使用http://localhost:3000/
,而cookie
是種在測試環境路徑下這就造成本地調試跨域訪問不通了。可以考慮在本地開發環境下disable
該SameSite
屬性。在Chrome
中訪問chrome://flags/
,搜索SameSite
並設置爲disabled
即可。