小cookie,大智慧
Cookie是什么?cookies是你訪問(wèn)網(wǎng)站時(shí)創(chuàng)建的數(shù)據(jù)片段文件,通過(guò)保存瀏覽信息,它們使你的在線體驗(yàn)更加輕松。
使用cookies,可以使你保持在線登錄狀態(tài),記錄你的站點(diǎn)偏好,并為你提供本地化支持。
First-party cookies or Third-party cookies
第一方cookie由你訪問(wèn)的站點(diǎn)創(chuàng)建。該站點(diǎn)指的是地址欄顯示的站點(diǎn);
第三方cookie是由其他站點(diǎn)創(chuàng)建的。這些站點(diǎn)擁有你當(dāng)前訪問(wèn)的網(wǎng)頁(yè)上部分資源,如廣告或圖像。
第一方/第三方cookie不是絕對(duì)的標(biāo)簽,而是相對(duì)于用戶(hù)的上下文。
同一cookie可以是第一方也可以是第三方,這取決于用戶(hù)當(dāng)時(shí)所在的網(wǎng)站。
為什么要提強(qiáng)調(diào)第三方cookie,這與下面的cookie的SameSite策略密切相關(guān)。
cookie的常規(guī)使用方式
web服務(wù)端發(fā)送給瀏覽器的cookie,瀏覽器會(huì)存儲(chǔ)并在下次請(qǐng)求原服務(wù)器的時(shí)候回發(fā)cookie。
在HTTP請(qǐng)求模型中以標(biāo)頭的形式體現(xiàn):Response中Set-Cookie標(biāo)頭種植cookie;Request Cookie標(biāo)頭攜帶(該請(qǐng)求允許攜帶的)cookies
HTTP/1.0 200 OK Content-type: text/html Set-Cookie: yummy_cookie=choco Set-Cookie: X-BAT-FullTicketId=TGT-969171-******; path=/; samesite=none; httponly[page content]Cookie標(biāo)頭的內(nèi)容是鍵值對(duì)(鍵值對(duì)才是具業(yè)務(wù)含義的cookie);同名cookie覆蓋原鍵值,不同名cookie會(huì)追加到鍵值對(duì)。
GET /sample_page.html HTTP/1.1 Host: www.example.org Cookie: yummy_cookie=choco; X-BAT-FullTicketId=TGT-969171-****** “除了服務(wù)端響應(yīng)時(shí)使用Set-Cookie標(biāo)頭種植cookie,瀏覽器javascript也可以種植cookie
cookie的種植面積
Domain和Path屬性定義了cookie的寫(xiě)入范圍:哪些url的請(qǐng)求可以攜帶該cookie。
Domain指定哪些host能被種植該cookie,如果沒(méi)有指定,默認(rèn)是當(dāng)前document location所在的host,不包含子域;如果指定了Domain,那么包括子域。
Path 指定能攜帶該cookie的具體url。"/" 是目錄分隔符,會(huì)匹配子目錄.
cookie的有效時(shí)長(zhǎng)
一般情況下瀏覽器關(guān)閉,cookie失效;
可通過(guò)設(shè)置特定的Expires或者M(jìn)ax-Age為cookie設(shè)置相對(duì)較長(zhǎng)的有效時(shí)間。
當(dāng)設(shè)置了過(guò)期時(shí)間,這個(gè)設(shè)置的時(shí)間是相對(duì)于瀏覽器而言,而非服務(wù)器。
cookie與web安全息息相關(guān)
因?yàn)閏ookie是站點(diǎn)私有片段數(shù)據(jù),與web上各種攻擊密切相關(guān),如XSS,CSRF.
根據(jù)W3c的操作規(guī)范,種植cookie時(shí)可通過(guò)某些屬性限制cookie的使用方式。
發(fā)送cookie的物理安全
Secure指定了發(fā)送cookie的物理安全:要求以HTTPS形式回發(fā)cookie
“Chrome52+、Firefox52+已經(jīng)支持Secure指令,再使用http請(qǐng)求已經(jīng)不會(huì)攜帶Secure cookie。
即便是Secure指令, 敏感信息也不要放在cookie中, 因?yàn)樗麄兲焐筒话踩?#xff0c;https并不能提供足夠有效的安全防護(hù)。
誰(shuí)能訪問(wèn)cookie?
web上能訪問(wèn)cookie的物件有兩種:
瀏覽器請(qǐng)求
JavaScript
HttpOnly指示cookie將不能通過(guò)JavaScript的document.cookie編程接口訪問(wèn),這樣可以緩解對(duì)跨站點(diǎn)腳本(XSS)的攻擊。
如:訪問(wèn)會(huì)話在瀏覽器留置的認(rèn)證cookie就沒(méi)有必要暴露給JavaScript,可對(duì)其設(shè)置HttpOnly指令 Set-Cookie: X-BAT-TicketId=TGT-969171-******; Expires=Wed, 21 Oct 2020 07:28:00 GMT; Secure; HttpOnly哪些瀏覽器請(qǐng)求能合法攜帶cookie?
首先科普一下重要的web HTTP知識(shí):
對(duì)頁(yè)面資源的請(qǐng)求,依據(jù)請(qǐng)求發(fā)起者的源Origin與資源的源Origin的相等關(guān)系,被劃分為4類(lèi)。
Http請(qǐng)求中Sec-Fetch-Site標(biāo)頭指示了這個(gè)屬性:
| cross-site | 請(qǐng)求的發(fā)起源與資源源完全不一樣 |
| same-origin | 請(qǐng)求的發(fā)起源與資源源完全一樣 |
| same-site | 請(qǐng)求的發(fā)起源與資源源不完全一樣,位于同一頂級(jí)域名下二級(jí)域名 |
| none |
Q1. 源Origin、站Site、域Domain傻傻分不清楚?
觀察www.cnblog.com任意一篇博文的network,看動(dòng)圖!
在博客頁(yè)面www.cnblog.com/xxx/p/110.htm上發(fā)起的
www.cnblogs.com/xxx/ajax/Follow/GetFollowStatus.aspx是same-origin請(qǐng)求
blog-static.cnblogs.com/files/shwee/clock.js是same-site請(qǐng)求
www.google-analytics.com/r/collect?v=1&_v=j81&a=38982783&t=pageview&_s=1是cross-site請(qǐng)求
Q2. 聊cookie為什么要提到Sec-Fetch-Site標(biāo)頭?
答:B站頁(yè)面在請(qǐng)求A站資源時(shí)能否攜帶A站cookie(第三方cookie)不僅是一個(gè)道德問(wèn)題;技術(shù)上還牽涉web安全(CSRF)。
針對(duì)以上的請(qǐng)求類(lèi)型,瀏覽器針對(duì)cookie有SameSite屬性,提供針對(duì)跨站點(diǎn)請(qǐng)求偽造攻擊(CSRF)的保護(hù)。
在服務(wù)端Set-Cookie種植cookie時(shí),SmmeSite屬性值可指示瀏覽器是否可在后續(xù)的“同一站點(diǎn)”或“跨站點(diǎn)”請(qǐng)求中攜帶這些cookie
Set-Cookie: X-BAT-TicketId=TGT-969171-******; path=/; samesite=none; httponly有如下枚舉值:
Lax :?對(duì)同源、頂級(jí)域的請(qǐng)求才可以攜帶cookie (等價(jià)于same-site)
Strict: 對(duì)同源請(qǐng)求才可以使攜帶cookie (等價(jià)于same-origin)
None:?對(duì)于cookie的使用無(wú)限制,隨便使用
最新的IEEF cookie SameSite策略:
敦促瀏覽器版本遷移,使cookie的SameSite默認(rèn)= Lax
如果需要跨域發(fā)送cookie,請(qǐng)使用None枚舉值選擇無(wú)SameSite限制, None指令需要搭配Secure指令
Tip:None枚舉值是標(biāo)準(zhǔn)新增枚舉值,一些舊瀏覽器不識(shí)別這個(gè)枚舉值,可能導(dǎo)致一些問(wèn)題.
總之,IEEF配合瀏覽器給cookie的存取、使用、傳輸、規(guī)定了一套策略,環(huán)環(huán)相扣,促進(jìn)了web上cookie的平衡應(yīng)用。
總結(jié)本文輸出
第一方cookie vs 第三方cookie的認(rèn)定:取決于訪客所處的上下文
cookie的常規(guī)用法
根據(jù)源Origin、站Site、域Domain,請(qǐng)求被劃分為4大類(lèi),關(guān)注HTTPSec-Fetch-Site標(biāo)頭
服務(wù)器在種植cookie時(shí),可對(duì)cookie設(shè)置SameSite屬性,故SameSite作用對(duì)象是cookie
SameSite屬性決定了后續(xù)的跨域/跨站請(qǐng)求是否可以攜帶B站cookie,緩解了CSRF攻擊
https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-Fetch-Site
https://web.dev/samesite-cookies-explained
推薦閱讀
●?程序員應(yīng)對(duì)瀏覽器同源策略的姿勢(shì)
●?臨近年關(guān),修復(fù)ASP.NET Core因?yàn)g覽器內(nèi)核版本引發(fā)的單點(diǎn)登錄故障
●?ASP.NET Core跨平臺(tái)技術(shù)內(nèi)幕
●?TPL Dataflow組件應(yīng)對(duì)高并發(fā),低延遲要求
●?實(shí)例解讀Docker Swarm
●?基于docker-compose的Gitlab CI/CD實(shí)踐&排坑指南
???轉(zhuǎn)載是一種動(dòng)力,分享是一種美德? ??~~..~~
如果你覺(jué)得文章還不賴(lài),您的鼓勵(lì)是原創(chuàng)干貨作者的最大動(dòng)力,讓我們一起激濁揚(yáng)清。
總結(jié)
以上是生活随笔為你收集整理的小cookie,大智慧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用BeetleX构建基础的SSL网络通
- 下一篇: 一文读懂常用开源许可证