這兩天(已是一個多月前了) SF 上面不少 cookie 的問題,而後還有個 cookie 相關的付費問答。
因此我們今天來這麼一節,廢話多說點,先說說大致問題方向。html
用於服務端辨別用戶身份,儲存在用戶本地的數據。
能夠解決客戶端與服務端會話狀態的問題,這個狀態是指後端服務的狀態而非通信協議(HTTP)的狀態。前端
域名下的 cookie 通常來講是最大是 4KB。固然你們也不會真的放這麼多。git
存儲是以 Name=Value
的形式。github
Domain
是限制域名,設置爲 www.lilnong.top
的話,cors.lilnong.top
就獲取不到了。Path
是限制路徑,若是設置爲 /cors
的話,/api
下的請求就不會攜帶該 cookie
。chrome
Expires
是當前 Cookie
的過時時間,默認是會話級別。json
Max-Age
是當前 Cookie
通過多少秒失效。segmentfault
Max-Age
的優先級比 Expires
更高。後端
設置之後客戶端腳本就沒法經過 document.cookie
等方式獲取。
有助於避免 XSS 攻擊。api
設置之後客戶端只有 HTTPS
協議下才會發送給服務端。
使用 HTTPS
安全協議,能夠保護 Cookie 在瀏覽器和 Web 服務器間的傳輸過程當中不被竊取和篡改。跨域
能夠設置 Cookie
在什麼場景下會被髮送。從而屏蔽跨站時發送 cookie,用於阻止跨站請求僞造攻擊(CSRF)。
SameSite
能夠設置下面三個值:
lilnong.top
跳轉到 www.lilnong.top/cors/
,就屬於同站。None(chrome 80 前的默認值) 不管是否跨站都會發送 Cookie。必須同時加上 Secure 屬性,不然無效,也就是說只支持 HTTPS。
IOS 12 的 Safari 以及老版本的一些 Chrome 會把 SameSite=none 識別成 SameSite=Strict,因此服務端必須在下發 Set-Cookie 響應頭時進行 User-Agent 檢測,對這些瀏覽器不下發 SameSite=none 屬性
接下來咱們來比對一下跨站的各個場景,Demo 晚點給吧。
場景類型 | 場景備註 | Strict | Lax | None |
---|---|---|---|---|
連接 | <a href> |
不發 | 發 | 發 |
預加載 | <link rel="prerender"> |
不發 | 發 | 發 |
get 表單 | <form method="get"> |
不發 | 發 | 發 |
post 表單 | <form method="post"> |
不發 | 不發 | 發 |
iframe | <iframe src> |
不發 | 不發 | 發 |
AJAX | <a href> |
不發 | 不發 | 發 |
圖片 | <img src> |
不發 | 不發 | 發 |
script | jsonp |
document.cookie
這裏只能獲取到容許獲取 (HTTPOnly) 的。Set-Cookie
,這個屬於最經常使用的方式。Set-Cookie: key1=value1; path=path; domain=domain; max-age=max-age-in-seconds; expires=date-in-GMTString-format; secure; httponly; SameSite=None
document.cookie="key=value"
這種是前端設置 cookie 。「同站 (same-site)、跨站 (cross-site)
」與「第一方 (first-party)、第三方 (third-party)
」這兩個概念是等價的。
可是和 瀏覽器同源策略(SOP) 中的「同源 (same-origin)、跨域 (cross-origin)
」是徹底不一樣的概念
同站是指二級域名+頂級域名,相等便可。
好比 www.lilnong.top
解析一下就是 主機名.二級域名.頂級域名
,因此判斷規則仍是比較鬆的。
eTLD 表示有效頂級域名,註冊於 Mozilla 維護的公共後綴列表( Public Suffix List)中,例如,.com、.co.uk、.github.io 等。
eTLD+1 表示,有效頂級域名+二級域名,例如 taobao.com 等。
同源策略的同源是指兩個 URL 的協議/主機名/端口一致。
域名 | 備註(請求 https://www.lilnong.top) |
---|---|
https://www.lilnong.top | (同源)同協議、同主機、同端口 |
http://www.lilnong.top | (跨域)不一樣協議 |
https://www.lilnong.top:8081 | (跨域)不一樣端口 |
http://www.lilnong.top:8081 | (跨域)不一樣協議、不一樣端口 |
https://cors.lilnong.top | (跨域)不一樣主機 |
SameSite
的設置致使異常。Cookie
時,咱們還要注意 withCredentials
的設置。而後就是清除 cookie,重啓瀏覽器了。