all articles

about Apple ITP

2019-07-29 @sunderls

js apple itp





最近开发需要做了个跨网站的认证系统,发现safari上用不了。擦。 网上搜了一下发现这是苹果safari的对第三方cookie的限制。

这里做一些笔记分享。

1. 第一方cookie 第三方cookie

这个比较简单,访问一个domainA的页面

  1. 这个域名下cookie就是第一方
  2. 网页中的image, iframe的的cookie就是第三方。

比如网页上放上一个微博的widget,虽然这个widget显示在不同的网站上, 但是第三方cookie仍然会在请求iframe的时候被传进去,所以用户的登陆状态可以得到保留,不用每次都登录。

这就是你为啥在百度搜索了商品,访问其他网站的时候会出现针对性的广告。 因为广告用的iframe(?)可定向知道你是谁。这就是跨域追踪。

2. 但是Apple觉得这个机制不够保护隐私要改掉。Intelligent Tracking Prevention 1.0

https://webkit.org/blog/7675/intelligent-tracking-prevention/

这是去年7月的事情了。苹果推出了ITP 1.0。具体看上述说明,总结一下

  1. safari会机器学习分析页面加载内容和用户行为,来决定哪些domain有跨域追踪能力。
  2. 被判断为跨域追踪后30天内
    1. 如果用户没有和这个domain的网页交互(非iframe,正常访问并且有点击等行为),那么这个domain的cookie就会被删除。此后新加的也会被删除,就是说添加不上去
    2. 如果用户交互(非iframe,正常访问并且有点击等行为)了,那么safari判定用户是对这个网页感兴趣的,会做出如下调整

也就是说

  1. 如果用户近24小时内发生了交互(非iframe,正常访问并且有点击等行为),那么这个domain的cookie可以作为第三方cookie。
  2. 否则不可以作为第三方cookie。并且30天后cookie消失。

如何实现「不可以作为第三方cookie」的呢?cookie会被partitioned,第三方访问不到,自己可以。 这样的效果就是,偶尔去访问一个网站的时候(30天之内),登录状态会被保持。但是iframe的情况下没有cookie。

3. 对于开发者而言?

  1. 如果用户不定期访问的话,cookie和其他的storage方法无效。
  2. 通过第三方cookie来做数据分析的如果用户不经常来的话不行。跨域名的统计,可以通过在url中加入相关参数。
  3. 广告(这个我不太懂了。。)
  4. SSO单点登录。必须要用户去那个单点交互,否则就有可能被判定为tracker。

SSO单点就是我的问题啊!!!!!文章说

单点登录后24消失之内是可以的。登录后各网站需要自己维持session,或者每天都redirect回来让交互一下。

4. 好了 2018年3月 ITP 1.1出来了 包含了Storage Access API和其他更新

不是说iframe中的cookie会被partition么?用storage access API可以解决这个问题。 这个待会儿讲。

先说更新内容。

  1. 被隔离(partition)的cookie不再存到disk。都变成了session cookie。 那不是浏览器关了就没了?不过通过storage access API可以取到非隔离的cookie 。 what?

  2. cookie在被删除之前的pending状态的时候,添加了block状态,无法新增cookie cookie被删除是每小时1次。那如果在这一小时间隔里面添加了新cookie,有可能10分钟后就被删除了。block状态避免了这个问题。其实也没有避免这个问题,根本就添加不进去啊!!!

5. 我们看看Storage Access API是怎么回事

比如微博的点赞按钮,放在了很多网站中。 ITP就会认为这是个点赞按钮有能力去track 用户,用户交互过后再过24消失,就让这个按钮只能取到一个partitioned cookie。 这样你就不知道谁是谁啦。

这非常不好。Storage Access API允许第三方iframe在用户与他们交互的时候,获取它们的第一方cookie。有两个API

document.hasStorageAccess() 检测是否已经获取权限。

var promise = document.hasStorageAccess();
promise.then(
  function (hasAccess) {
    // Boolean hasAccess says whether the document has access or not.
  },
  function (reason) {
    // Promise was rejected for some reason.
  }
);

Request Storage Access 请求权限(在用户交互的时候)

<script>
function makeRequestWithUserGesture() {
  var promise = document.requestStorageAccess();
  promise.then(
    function () {
      // Storage access was granted.
    },
    function () {
      // Storage access was denied.
    }
  );
}
</script>
<button onclick="makeRequestWithUserGesture()">Play video</button>

请求权限的时候如果没有给过权限,就会弹出确认弹层。

但是这个storage access API不解决问题啊。。用户需要点一下才能取到cookie? wtf

6. ITP 2.0 在2018年6月推出,去掉了1天的窗口期!!!wtf

因为可以用storage access API,所以24小时窗口期也没了。被判断为有能力track过后,里面进入了partition状态。

嗯,其他变化不大。



如果觉得有帮助到你的话,
欢迎支付宝donate