partitioned
属性机制有一个别名CHIPS
,英文全称Cookies Having Independent Partitioned State
。
partitioned
属性是Cookie家庭的新成员,主流浏览器都会支持该属性,且后续有变动的可能性较小。 在第三方Cookie很快终结的背景下,partitioned
属性变得越来越重要了。
用法
partitioned
属性不区分大小写,没有值。
假设我们要设置的Cookie名称为x
,值为value
,带partitioned
属性:
JavaScript设置方式:
js
document.cookie = "x=value; secure; path=/; partitioned;"
HTTP的设置方式:
ini
Set-Cookie: x=value; secure; path=/; partitioned;
每次设置Cookie时,Partitioned
只要不是放在最前面都可以。第一个;
前的内容一定是Cookie的名称和值,其他任何属性放到最前面都会被浏览器解释为Cookie的名称或者值。
partitioned的含义
第三方Cookie即将被浏览器禁用,如果你还想使用第三方Cookie,只需要在设置第三方Cookie时,加上partitioned
属性。
partitioned
属性(CHIPS)是谷歌Privacy Sandbox计划的一部分,用于应对禁用第三方Cookie。
从业务角度理解 partitioned
加上partitioned
属性虽然可以绕过浏览器对第三方Cookie的禁用,但是该第三方Cookie不再可以跨站点使用。
下面以两个实际场景为例,来帮助大家理解。
场景1:第三方Cookie禁用前
用户访问网站a.com
=>
网站a.com
用iframe内嵌了客服服务third-party.com
=>
third-party.com
客服服务在浏览器中种了一个Cookie userId
用来标识当前用户。
后来用户又访问了b.com
=>
网站b.com
也用iframe内嵌了客服服务third-party.com
=>
third-party.com
客服服务可以访问到之前种的Cookie userId
。
third-party.com
客服服务可以通过HTTP的请求头referer
得知自己被哪些网站使用过了,还可以通过Cookie userId
得知用户访问了两个网站a.com
和b.com
。这就形成了对用户行为的跟踪,这是第三方Cookie要被禁用的主要原因。
一下图片来自Chrome开发者网站的官方文章,形象地展示了这种场景:
图片中,A内嵌的C和B内嵌的C和C自身可以供用相同的Cookie。
场景2:第三方Cooke禁用后
用户访问网站a.com
=>
网站a.com
用iframe内嵌了客服服务third-party.com
=>
third-party.com
客服服务想在浏览器中种一个Cookie userId
用来标识当前用户,对用户的上网痕迹进行追踪,但是这个Cookie被浏览器拒绝了,因为浏览器已经禁用了第三方Cookie。
third-party.com
客服服务追踪用户上网痕迹的想法落空。
third-party.com
客服服务的产品经理认为不能追踪用户可以接受,因为这本身就是对用户隐私的窥探。
但是不能设置Cookie导致无法标识用户,从而保存聊天记录到服务端时,无法和用户的标识对应上,用户下次进入时将没有聊天记录。 这个是产品经理不能接受的,这个是客服服务的核心功能,没有这个功能会影响用户体验。
这时partitioned
可以出场了。客服服务的开发人员说:我们可以给Cookie userId
加上partitioned
属性,这样我们还可以往浏览器里种Cookie,但是我们内嵌到a.com
网站时种的Cookie只能在用户访问a.com
网站时才能用,用户访问b.com
网站时,虽然也内嵌了我们的服务,但是我们拿不到之前内嵌到a.com
网站时种的Cookie,需要在内嵌到b.com
网站时重新种Cookie。也就是说,我们虽然是第三方的服务,但是我们依然可以通过Cookie标识用户,但是我们不能跨站追踪用户了,因为虽然都是内嵌了third-party.com
,但是两个网站中third-party.com
种的Cookie不能共享。
从上面的例子可以看出partitioned
的存在价值。禁用第三方Cookie是为了防止用户隐私泄露,但是禁用第三方Cookie有时也会损害用户体验,而partitioned
属性可以让我们继续使用第三方Cookie,而且还不会让用户的隐私泄露。
因此严格来说,浏览器禁用第三方Cookie这个说法并不准确,准确的说是禁止了非partitioned
的第三方Cookie。
一下图片来自Chrome开发者网站的官方文章,形象地展示了这种场景:
图片中,A中内嵌的C单独存了一份Cookie,B中内嵌的C也单独存了一份。
另外C也无法单独获取在A和B环境下种的Cookie,请看下图:
从技术角度理解 partitioned
对于普通的没有partitioned
属性的Cookie,我们可以理解为每个Cookie都使用一个域名作为Key。 例如:https://support.chat.example
网站种一个Cookie,那它的Key有可能是support.chat.example
或者chat.example
,不管是哪个,他的Key只有一个。 但是使用partitinoed
后,这个Cookie会有两个key,一个是Cookie所在HTTP服务的域名Key,还有一个叫做Partitioned Key
,Partitioned Key
是http://
或https://
加上当前用户访问的网站的域名所对应的一级域名。只有这两个Key同时满足时,才能被种它的HTTP服务访问到。
举例如下: 网站https://xxx.a.com
嵌入了第三方客服服务third-party.com
,第三方客服服务通过HTTP的Response种了一个Cookie userId
。
种法如下:
ini
Set-Cookie: userId=xxx; secure; path=/; partitioned;
有partitioned
属性,因此该Cookie有两个Key,一个是它所属的域名:third-party.com
,另一个是partitioned key
:https://a.com
。
这里有两点要注意:
partitioned key
是带https://
的。partitioned key
是https://a.com
,而不是https://xxx.a.com
,partitioned key
总是当前浏览器访问网站的一级域名a.com
,而不是正在访问的二级域名xxx.a.com
。
我们再跳出Key的概念,可以这样来理解带partitioned
属性的Cookie:
普通Cookie的访问受制于domain
path
等等属性,而带partitioned
属性的Cookie比普通Cookie多了一个限制条件就是partitioned key
。
到这里相信大家应该对partioned
有一个较为详细的认识了。
下图是partioned key
在Chrome浏览器的开发者工具中的显示:
至此Partitioned
属性的主要内容就讲完了。它还有一些使用上的限制,我们继续往下看。
必须和 secure 一起使用
partitioned
属性必须和secure
属性一起使用,这就意味着它必须在https
或者http://localhost
的环境下使用,否则整个Cookie设置无效。
浏览器支持情况
Chrome 114 版本开始正式支持该属性。Chrome 114 版本2023年5月份才发版,国内使用的人还不多。 不过主流浏览器对于无法识别的Cookie属性都是直接忽略,并不会影响整个Cookie的设置,因此如果我们确实需要第三方Cookie,那可以把该属性加上。
结束语
partitioned
属性(CHIPS)的讲解到此结束。