Safari ITP 协议限制和应对

Safari ITP

智能跟踪防护(也称为ITP)用来防止网站数据追踪,保护用户隐私,是Webkit开发的隐私功能,也就是苹果的Safari浏览器使用的内核。

官方对各个版本的说明如下:

限制是逐步的加强,下个版本不知会有什么 惊喜

概念

主要影响都是涉及到 一方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 中js document.cookie 写入的

ITP 2.2

  • 特定条件下一方cookie的时间也会变成1天,还是指的 document.cookie 写入cookie

条件如下:

  1. 从跨站最终的网站跳转过来
  2. url中带有query参数或者hash的标识符 ?id=123 #/id/123

一方cookie也受限制,就给一天

ITP 2.3

  • 从跨站点跟踪的网站跳转过来,并且带有query参数,比如 website.example?clickID=0123456789
  • 如果七天未与网站交互,删除所有非cookie的网站数据,例如:LocalStorage

补充说明

  • 最新版本完全阻止了三方cookie,包括 HttpOnly,2020-09-01 的时候发现在 Safari 13.013.1 的版本已经完全阻止了

https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/

如果项目本身接口跨域那即使配置了 credentials 也将无法写入和发送cookie。

接下来

接下来对于需要跟踪用户或者广告归因应的可以通过 服务端写一方cookie 或者 浏览器设备指纹 来标识用户。

服务端写入一方cookie

就是当你需要写入cookie的时候,发送一个请求到一方服务端,让服务端返回头通过 SetCookie 去写入。

注意需要:SecureHttpOnly,也就是需要https和httpOnly服务端使用。

这样就需要大量的回源请求,来处理cookie的计算逻辑并写入浏览器,大流量下感觉成本应该挺贵的吧

浏览器设备指纹

就是类似原生应用获取设备的 uuid,浏览器也可以获取到一些细微的差异,常见的主要通过 canvas像素差Etag校验值 等,准确率可以达到95%以上。

常见的浏览器设备指纹解决方案有:

  1. https://github.com/lucb1e/cookielesscookies
  2. https://browserleaks.com/canvas#how-does-it-work
  3. http://valve.github.io/fingerprintjs/

目前剩下的这两种方案很可能将来新版本中也会被和谐了,好在另一方面浏览器厂商也在针对隐私方面推出自己的解决方案,比如 Chrome的 Privacy Sandbox