Safari ITP
智能跟踪防护
(也称为ITP)用来防止网站数据追踪,保护用户隐私,是Webkit开发的隐私功能,也就是苹果的Safari浏览器使用的内核。
官方对各个版本的说明如下:
1.0
https://webkit.org/blog/7675/intelligent-tracking-prevention/1.1
https://webkit.org/blog/8142/intelligent-tracking-prevention-1-1/2.0
https://webkit.org/blog/8311/intelligent-tracking-prevention-2-0/2.1
https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/2.2
https://webkit.org/blog/8828/intelligent-tracking-prevention-2-2/2.3
https://webkit.org/blog/9521/intelligent-tracking-prevention-2-3/2.3+
https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/
限制是逐步的加强,下个版本不知会有什么 惊喜
…
概念
主要影响都是涉及到 一方cookie
、三方cookie
的限制,这里先解释下一方和三方的区别
比如有一个网站
a.com
,加载可g.com
的资源,并且请求g.com
资源时会通过response
写入用户标识cookie,然后b.com
也加载了g.com
的资源。这样当你访问过
a
,然后又访问了b
,那g.com
依旧可以通过之前的标识知道就是你访问过a
,然后推你喜欢小广告,这就是一个简单的跨站追踪,被广泛应用在广告转换,用户数据收集等方面。
在上面这个过程中 g.com 所使用的cookie就是 三方cookie
(不是写在访问站点域下的cookie),a.com、 b.com 下的就是 一方cookie
跨站cookie 主要通过 iframe
内js写入,或者直接跨站请求 response
返回头写入。
ITP 各个版本简单介绍
ITP 1.0
限制了三方cookie24小时,超过的进隔离
- 三方cookie需要在24小时内与访问三方cookie的站点,并且有点击、表单提交的操作才算。
- 1天到30天之间不可用,被隔离
- 30天后会立即清除,并且不能再添加cookie
也就是要求用户要主动与三方cookie的网站有互动,点击,单击或表单输入,不然不给你存。
ITP 1.1
- 隔离cookie调整为会话级不会保存的磁盘。可以通过 Storage Access API 来访问隔离cookie
- 每一小时清除一次cookie和其它网站数据,具有待清除的cookie就无法添加新cookie,现有的cookie也不能发送
ITP 2.0
- 完全限制三方cookie,必须通过
Storage Access API
来访问,并且会弹出用户需要授权的窗口,一次授权可以使用30天,超过30天依旧删除。 - 另外调整到三方网站来源
referer
会抹去 path路径,比如https://lljj.me/xxx
只会返回https://lljj.me
ITP 2.1
- 不在隔离cookie了,原本隔离也是要删除,也就是三方cookie变成了 0 天
- js
document.cookie
创建的cookie都为 7 天
这里是限制通过
iframe
中jsdocument.cookie
写入的
ITP 2.2
- 特定条件下一方cookie的时间也会变成1天,还是指的
document.cookie
写入cookie
条件如下:
- 从跨站最终的网站跳转过来
- url中带有query参数或者hash的标识符
?id=123
#/id/123
一方cookie也受限制,就给一天
ITP 2.3
- 从跨站点跟踪的网站跳转过来,并且带有query参数,比如
website.example?clickID=0123456789
- 如果七天未与网站交互,删除所有非cookie的网站数据,例如:
LocalStorage
补充说明
- 最新版本完全阻止了三方cookie,包括
HttpOnly
,2020-09-01 的时候发现在 Safari13.0
、13.1
的版本已经完全阻止了
https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/
如果项目本身接口跨域那即使配置了
credentials
也将无法写入和发送cookie。
接下来
接下来对于需要跟踪用户或者广告归因应的可以通过 服务端写一方cookie
或者 浏览器设备指纹
来标识用户。
服务端写入一方cookie
就是当你需要写入cookie的时候,发送一个请求到一方服务端,让服务端返回头通过 SetCookie
去写入。
注意需要:Secure
和 HttpOnly
,也就是需要https和httpOnly服务端使用。
这样就需要大量的回源请求,来处理cookie的计算逻辑并写入浏览器,大流量下感觉成本应该挺贵的吧
浏览器设备指纹
就是类似原生应用获取设备的 uuid
,浏览器也可以获取到一些细微的差异,常见的主要通过 canvas像素差
、Etag校验值
等,准确率可以达到95%以上。
常见的浏览器设备指纹解决方案有:
- https://github.com/lucb1e/cookielesscookies
- https://browserleaks.com/canvas#how-does-it-work
- http://valve.github.io/fingerprintjs/
目前剩下的这两种方案很可能将来新版本中也会被和谐了,好在另一方面浏览器厂商也在针对隐私方面推出自己的解决方案,比如 Chrome的 Privacy Sandbox
等