詳解 Cookie 新增的 SameParty 屬性
各大主流瀏覽器正在逐步禁用 三方Cookie ,之前筆者也在下面這篇文章中分析了全面禁用 三方Cookie 后對(duì)我們的網(wǎng)站帶來(lái)的一些影響:
當(dāng)瀏覽器全面禁用三方 Cookie
但是一個(gè)公司或組織往往在不同業(yè)務(wù)下會(huì)有多個(gè)不同的域名,例如 taobao.com、tianmao.com,所以很多正常的業(yè)務(wù)場(chǎng)景也許要借助 三方Cookie 來(lái)實(shí)現(xiàn)(比如 單點(diǎn)登錄和 consent管理),直接禁用后可能會(huì)給我們的業(yè)務(wù)帶來(lái)很大影響,而且之前一直以來(lái)都沒(méi)有很好的解決方案,這也是 Chrome 禁用 三方Cookie 進(jìn)展非常緩慢的原因。
在 第一方Cookie 和 第三方Cookie 被區(qū)別對(duì)待的情況下,Chrome 新推出了一個(gè) First-Party Sets 策略,它可以允許由同一實(shí)體擁有的不同關(guān)域名都被視為第一方。
這意味著我們可以標(biāo)記打算在同一方上下文共享 Cookie 的不同域名,目的是在防止第三方跨站點(diǎn)跟蹤和仍然保持正常的業(yè)務(wù)場(chǎng)景下之間找到平衡。
目前 First-Party Sets 策略還沒(méi)有正式在穩(wěn)定版推出,還在試用階段。
一方和三方 Cookie 的區(qū)別
可能很多小伙伴對(duì) 三方Cookie 的概念還比較模糊,我們先來(lái)回顧一下:
Cookie 本質(zhì)上不區(qū)分第一方或第三方,它取決于包含 Cookie 的當(dāng)前上下文。我們還用之前的老例子:
如果是你正常的正在逛著天貓,天貓會(huì)把你的信息寫(xiě)入一些 Cookie 到 .tmall.com 這個(gè)域下,然而打開(kāi)控制臺(tái)你會(huì)看到,并不是所有 Cookie 都是 .tmall.com 這個(gè)域下的,里面還有很多其他域下的 Cookie ,這些所有非當(dāng)前域下的 Cookie 都屬于第三方 Cookie,雖然你可能從來(lái)沒(méi)訪(fǎng)問(wèn)過(guò)這些域,但是他們已經(jīng)悄悄的通過(guò)這些第三方 Cookie來(lái)標(biāo)識(shí)你的信息,然后把你的個(gè)人信息發(fā)送過(guò)去了。
而 .tmall.com 這個(gè)域下的 Cookie 都屬于第一方 Cookie,那么為什么還需要第三方 Cookie 呢?再打開(kāi) taobao.com,你會(huì)發(fā)現(xiàn)你已經(jīng)不需要再登錄了,因?yàn)樘詫?、天貓都屬于阿里旗下的產(chǎn)品,阿里為他們提供統(tǒng)一的登錄服務(wù),同時(shí),你的登錄信息也會(huì)存到這個(gè)統(tǒng)一登錄服務(wù)的域下,所以存到這個(gè)域下的 Cookie 就成了三方 Cookie。
SameSite 的問(wèn)題
Chrome 在之前的版本為 Cookie 新增了一個(gè) SameSite 屬性 來(lái)限制三方 Cookie 的訪(fǎng)問(wèn),在 Chrome 80 版本后 SameSite 的默認(rèn)值被設(shè)定為 SameSite=Lax。
在 Strict 模式下,將阻止所有三方 Cookie 攜帶,這種設(shè)置基本可以阻止所有 CSRF 攻擊,然而,它的友好性太差,即使是普通的 GET 請(qǐng)求它也不允許通過(guò)。
在 Lax 模式下只會(huì)阻止在使用危險(xiǎn) HTTP 方法進(jìn)行請(qǐng)求攜帶的三方 Cookie,例如 POST 方式。同時(shí),使用 JavaScript 腳本發(fā)起的請(qǐng)求也無(wú)法攜帶三方 Cookie。
但是,試用上面兩種模式,我們上面提到的一些正常的需求場(chǎng)景就無(wú)法實(shí)現(xiàn)了,對(duì)于這種 Cookie ,我們現(xiàn)在一般會(huì)手動(dòng)設(shè)置 SameSite=None 。
這意味著這種 Cookie 又失去了跨站點(diǎn)請(qǐng)求偽造 (CSRF) 保護(hù),例如在 evil.site 發(fā)送一個(gè) me.site 的請(qǐng)求,也會(huì)帶上我們的 Cookie。
First-Party Sets 策略
在上面正常的業(yè)務(wù)場(chǎng)景中,所有不同的域名基本上都來(lái)自同一個(gè)組織或企業(yè),我們希望在同一個(gè)運(yùn)營(yíng)主體下不同域名的 Cookie 也能共享。
First-Party Sets 可以定義跨站點(diǎn)上下文仍然是 first-party 的情況。Cookie 可以包含在第一方集合中,也可以排除在第三方上下文中。
First-Party Sets 提出了一種明確定義在同一主體下?lián)碛泻瓦\(yùn)營(yíng)的多個(gè)站點(diǎn)關(guān)系的方法。比如 .tmall.com、taobao.com 都可以被定義為同一主體運(yùn)營(yíng) 。
這個(gè)策略來(lái)源于瀏覽器的隱私沙提案中對(duì)身份進(jìn)行分區(qū)以防止跨站點(diǎn)跟蹤的概念,在站點(diǎn)之間劃定界限,限制對(duì)可用于識(shí)別用戶(hù)的任何信息的訪(fǎng)問(wèn)。
瀏覽器的默認(rèn)行為是對(duì)同一站點(diǎn)進(jìn)行分區(qū),上面這個(gè)新的策略意味著分區(qū)被可以開(kāi)放為多個(gè)站點(diǎn)。
First-Party Sets 策略的一個(gè)重要部分是確??鐬g覽器的政策防止濫用或誤用。例如,F(xiàn)irst-Party Sets 策略不得在不相關(guān)的站點(diǎn)之間交換用戶(hù)信息,或?qū)Σ粚儆谕粚?shí)體的站點(diǎn)進(jìn)行分組。
所以單點(diǎn)登錄這種場(chǎng)景可能是不能用這種方式解決了,因?yàn)檫@個(gè)場(chǎng)景屬于交換用戶(hù)信息,目前怎么界定哪些信息是用戶(hù)信息官方還沒(méi)有明確的描述,所以這個(gè)地方筆者也不是很確定。
W3C 目前正在討論新的 First-Party Sets 的配置和驗(yàn)證,其中一個(gè)考慮的選項(xiàng)是由獨(dú)立實(shí)體而非瀏覽器公司處理驗(yàn)證。
目前 First-Party Sets 已經(jīng)確定的原則如下:
- First-Party Sets 中的域必須由同一組織擁有和運(yùn)營(yíng)。
- 所有域名應(yīng)該作為一個(gè)組被用戶(hù)識(shí)別。
- 所有域名應(yīng)該共享一個(gè)共同的隱私政策。
如何定義 First-Party Sets
每一個(gè)需要用到 First-Party Sets 策略的域名都應(yīng)該把一個(gè) JSON 配置托管在 /.well-known/first-party-set 路由下。
例如 conardli.top 的配置應(yīng)該托管在 https://conardli.top/.well-known/first-party-set 下:
- {
- "owner": "conardli.top",
- "version": 1,
- "members": ["conardli.com", "conardli.cn"]
- }
另外 conardli.com、 conardli.cn 兩個(gè)域名均需要增加所有者的配置:
- {
- "owner": "conardli.top"
- }
First-Party Sets 還有一些限制:
- 一個(gè)集合可能只有一個(gè)所有者。
- 一個(gè)成員只能屬于一個(gè)集合,不能重疊或混合。
- 域名列表不要過(guò)大。
SameParty 屬性
好了,上面介紹了一大堆,終于回到本文的主題 Cookie SameParty 屬性了,這個(gè)屬性就是為了配合 First-Party Sets 使用的。
所有開(kāi)啟了 First-Party Sets 域名下需要共享的 Cookie 都需要增加 SameParty 屬性,例如,如果我在 conardli.top 下設(shè)置了下面的 Cookie :
- Set-Cookie: name=lishiqi; Secure; SameSite=Lax; SameParty
這時(shí)我在 conardli.cn 下發(fā)送 conardli.top 域名的請(qǐng)求,Cookie 也可以被攜帶了,但是如果我在另外一個(gè)網(wǎng)站,例如 eval.site 下發(fā)送這個(gè)請(qǐng)求, Cookie 就不會(huì)被攜帶。
在 SameParty 被廣泛支持之前,你可以把它和 SameSite 屬性一起定義來(lái)確保 Cookie 的行為降級(jí),另外還有一些額外的要求:
- SameParty Cookie 必須包含 Secure.
- SameParty Cookie 不得包含 SameSite=Strict.
如何試用?
在瀏覽器禁用三方 Cookie 后,這個(gè)新的提案應(yīng)該會(huì)被大范圍的使用,現(xiàn)在可以先試用起來(lái)啦!
你可以在下面兩個(gè)地方參與提案的討論:
- First-Party Sets 策略討論:https://github.com/privacycg/first-party-sets
- SameParty 屬性討論:https://github.com/cfredric/sameparty
現(xiàn)在提案還在試用階段,你可以試用 --use-first-party-set 這個(gè)命令啟動(dòng) Chrome ,就可以進(jìn)行試用啦!
比如,在示例站 https://fps-member1.glitch.me/ 添加如下配置:
- --use-first-party-set=https://fps-member1.glitch.me,https://fps-member2.glitch.me,https://fps-member3.glitch.me
參考
- https://www.chromestatus.com/feature/5280634094223360
- https://github.com/cfredric/sameparty
- https://developer.chrome.com/blog/first-party-sets-sameparty/