具體屬性資料:https://github.com/mqyqingfeng/Blog/issues/157
起因:HTTP是無(wú)狀態(tài)協(xié)議
注意:Cookie的存在是為了解決后端服務(wù)的狀態(tài)問(wèn)題,而不是通訊協(xié)議的狀態(tài)問(wèn)題,別搞混了拗小。
優(yōu)點(diǎn):不需要保持狀態(tài)蚪拦,減少服務(wù)器的CPU及內(nèi)存消耗。也正是因?yàn)镠TTP協(xié)議本身非常簡(jiǎn)單根吁,所以被應(yīng)用于不同場(chǎng)景。
解決方案:Cookie
Cookie
作用:通過(guò)在請(qǐng)求和響應(yīng)報(bào)文中寫(xiě)入Cookie信息來(lái)控制客戶端的狀態(tài)。
主要流程:Cookie會(huì)根據(jù)服務(wù)器端發(fā)送的響應(yīng)報(bào)文內(nèi)的Set-Cookie首部字段信息合呐,通知客戶端保存Cookie。當(dāng)下次客戶端再次發(fā)送請(qǐng)求笙以,帶上該Cookie;服務(wù)端根據(jù)客戶端Cookie鑒定客戶端來(lái)源淌实,對(duì)比服務(wù)器記錄,得到該客戶端之前狀態(tài)信息。
跨域和跨站
首先要理解的一點(diǎn)就是跨站和跨域是不同的拆祈。同站(same-site)/跨站(cross-site)」和第一方(first-party)/第三方(third-party)是等價(jià)的恨闪。但是與瀏覽器同源策略(SOP)中的「同源(same-origin)/跨域(cross-origin)」是完全不同的概念。
同源策略的同源是指兩個(gè) URL 的協(xié)議/主機(jī)名/端口一致放坏。例如咙咽,https://www.taobao.com/pages/...,它的協(xié)議是?https淤年,主機(jī)名是?www.taobao.com钧敞,端口是?443。
同源策略作為瀏覽器的安全基石麸粮,其「同源」判斷是比較嚴(yán)格的溉苛,相對(duì)而言,Cookie中的「同站」判斷就比較寬松:只要兩個(gè) URL 的 eTLD+1 相同即可弄诲,不需要考慮協(xié)議和端口愚战。其中,eTLD 表示有效頂級(jí)域名齐遵,注冊(cè)于 Mozilla 維護(hù)的公共后綴列表(Public Suffix List)中寂玲,例如,.com梗摇、.co.uk敢茁、.github.io 等。eTLD+1 則表示留美,有效頂級(jí)域名+二級(jí)域名彰檬,例如 taobao.com 等。
舉幾個(gè)例子谎砾,www.taobao.com 和?www.baidu.com?是跨站逢倍,www.a.taobao.com 和?www.b.taobao.com?是同站,a.github.io 和 b.github.io 是跨站(注意是跨站)景图。
主要注意點(diǎn):SameSite
SameSite 是最近非常值得一提的內(nèi)容较雕,因?yàn)?2 月份發(fā)布的 Chrome80 版本中默認(rèn)屏蔽了第三方的 Cookie挚币,這會(huì)導(dǎo)致阿里系的很多應(yīng)用都產(chǎn)生問(wèn)題亮蒋,為此還專門(mén)成立了問(wèn)題小組,推動(dòng)各 BU 進(jìn)行改造妆毕。
屬性值:
1. Strict:僅允許一方請(qǐng)求攜帶Cookie慎玖,即瀏覽器將只發(fā)送相同站點(diǎn)請(qǐng)求的Cookie,即當(dāng)前網(wǎng)頁(yè)URL與請(qǐng)求目標(biāo)URL完全一致笛粘。
2. Lax: 允許部分第三方請(qǐng)求攜帶Cookie
3. None: 無(wú)論是否跨站都會(huì)發(fā)送Cookie
影響:舉個(gè)例子趁怔,例如阿里巴巴在各大網(wǎng)站比如今日頭條湿硝、網(wǎng)易、微博等投放廣告润努,是用iframe嵌入的关斜,設(shè)置SameSite為L(zhǎng)ax就不能發(fā)送Cookie,就不能準(zhǔn)確的進(jìn)行推薦铺浇。
解決:設(shè)置SameSite為None
不過(guò)也會(huì)有兩點(diǎn)要注意的地方:
HTTP 接口不支持 SameSite=none
????如果你想加 SameSite=none 屬性痢畜,那么該 Cookie 就必須同時(shí)加上 Secure 屬性,表示只有在 HTTPS 協(xié)議下該 Cookie 才會(huì)被發(fā)送鳍侣。
需要 UA 檢測(cè)裁着,部分瀏覽器不能加 SameSite=none
????IOS 12 的 Safari 以及老版本的一些 Chrome 會(huì)把 SameSite=none 識(shí)別成 SameSite=Strict,所以服務(wù)端必須在下發(fā) Set-Cookie 響應(yīng)頭時(shí)進(jìn)行 User-Agent 檢測(cè)拱她,對(duì)這些瀏覽器不下發(fā) SameSite=none 屬性