Chrome 80跨域cookie無法攜帶

什麼是cookie

HTTP是無狀態協議,也就是說服務器完全不清楚是否是同一位用戶在訪問。在最開始HTTP協議只是做爲共享文本內容而存在是可行的,但是隨着Web發展,Web內容的豐富化,必須需要有一種技術去記錄HTTP協議的用戶狀態,而cookie技術就是充當這個角色的。
google中cookie
簡言之,cookie就是存儲在瀏覽器下的文本文件,用於記錄用戶狀態信息。用戶在第一次向服務器發送訪問請求時,瀏覽器發起請求,服務端返回相應通過首部set-cookie字段向瀏覽器寫入cookie信息,在cookie有限期內,瀏覽器再次向服務器發起訪問請求時,會帶上cookie信息,從而服務器能識別當前用戶身份以及保存的狀態信息等內容。
cookie send
如下是google主頁log接口攜帶的cookie信息。
攜帶cookie

cookie的屬性

cookie屬性主要包含NameValueDomainPathExpires/Max-AgeHttpOnlySecureSameSite
cookie屬性

  • Namecookie的名稱,同域名下cookie名稱應該是唯一的,如果同域名下存在同名的cookie會被覆蓋;
  • Valuecookie的具體值,一般建議cookie值進行編碼;
  • Domaincookie綁定的域名,如果不指定默認綁定到當前域名,也可以通過設置Domian屬性實現跨域,就是通過將cookie綁定在一級域名下,從而實現二級域名訪問跨域;
  • Pathcookie綁定的訪問路徑,一般都是默認綁定在跟路徑下即/
  • Expires/Max-Agecookie的有效期,一般cookie都是有有效時效的,時效範圍內cookie是可用,過時效以後即失效;
  • HttpOnlycookie是否可以通過JavaScript進行操作,如果設置HttpOnly屬性爲true客服端將無法操作該cookie信息;
  • SecureHTTP不僅無狀態且是不安全的協議,內容是以明文的方式傳遞的,而Secure這個屬性就是標示cookie是不是僅在httpsssl等安全協議下使用,設置securetrue時及僅安全協議使用;
  • 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 and https://www.chromestatus.com/feature/5633521622188032

Chrome升級到80版本之後cookieSameSite屬性默認值由None變爲Lax,這也就造成了一些訪問跨域cookie無法攜帶的問題。比如本地調試時使用http://localhost:3000/,而cookie是種在測試環境路徑下這就造成本地調試跨域訪問不通了。可以考慮在本地開發環境下disableSameSite屬性。在Chrome中訪問chrome://flags/,搜索SameSite並設置爲disabled即可。
禁用SameSite

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章