对于以下场景: 有 API 服务器 a.com ,同一个用户在 b.com 和 c.com 调用 a.com 的 API 的时候,a.com 可以识别到这是同一个用户。
或者说,在 b.com 登录 a.com 之后,c.com 访问 a.com 的 API 也是登录状态。
如果浏览器没有开启第三方 Cookies 保护,有以下这些隐式的方法:
- CORS, withCredentials
- Iframe 设置 Cookies
- Iframe 使用 postMessage
- 古老的 P3P 头,已经被淘汰
如果浏览器开启了禁止 第三方 Cookies,对于一些浏览器,上述的第三个仍然可以使用,但是 Safari 均不行。而且 Safari 默认禁止第三方 Cookies,如果需要用户开启,这也看作是 显式 的方法。
在禁止第三方 Cookies 的情况下,Facebook 以前使用了一种浏览器指纹的技术进行隐式追踪,来识别用户,这对于大多数浏览器仍然可行,但是苹果今年在开发者大会上面说,“我们只提供了一个简化的系统配置,因此,你的 Mac 看起来更像其他所有人的 Mac 电脑,而数据公司要想识别你的设备并追踪你,将会变得更加困难”,说明,这个路径也被堵死了。
另外,还有一些是可行的跨多域方法,但是都是显式的,我列出来,以免大家回复的时候误会
- b.com 和 c.com 都跳转到 a.com 设置 cookies,再跳转回来
- 使用小弹窗的方式设置 Cookies
- Storage Access API,在 Safari 上会弹出一个用户授权框,需要用户显式授权
- 让用户修改浏览器设置,允许第三方 Cookies
当然,为了防止还是有人出来杠我,我再提一下 jsonp, 普通 CORS, localstorage 和 document.cookie,这些虽然是隐式的,也可以做所谓的跨域,但是不能跨多域,在 b.com 获取到的 token/cookies,c.com 不知道,在 c.com 仍然需要重新获取 token