p3p 就是为解决 cookie 携带问题的。
现在场景如下:客户网站为
a.com ,投放代码
b.com/b.js ,展现<iframe src="
b.com/b.html"></iframe>广告。需要在展现广告时,由 b 域下面的请求,给 b 域种上对应 cookie 以做统计追踪等。
前提:
客户访问
a.com 前,从未访问过
b.com ,即
b.com 下 cookie 是空的。
问题:
1 、 b.html 在 header 上附上 cookie 能写入进去吗?
2 、 b.html 页面里的 ajax 或者 json 请求的 header 上附上 cookie ,能写入进去吗?
结论:
在高级浏览器下,是可以写进去的。 chrome 上甚至可以通过 ajax 请求写入 cookie 。
但在 IE8 ( 9 好像也有)以下, a 域下的来自 b 域的 iframe ,是无法写入 cookie 的。这种 cookie 叫第三方 cookie ,不信你可以去看浏览器设置(浏览器设置为全放行第三方 cookie 的话,可以正常写入), IE 右下文会有一个小标识,提示有第三方 cookie 写入被拒绝。
这时想正常写入,就需要 P3P header ,类似『 P3P:CP=" OTI DSP COR IVA OUR IND COM "』里面的第个词都有应的意思。而且完整的 p3p header 会有相应的隐私策略 xml, IE 用户可以点进去看对应的隐私条款。
p3p header 必须由 b.html 携带, cookie 也从此条请求 response 中下发才可以, b.html 里面的 ajax header 中携带,或者在前端 setCookie 都是无效的。
——————————————
不信?把浏览器所有 cookie 全清掉,然后访问个挂百度联盟的小电影网站,看看
baidu.com 下是不是被写入了一堆 cookie 。你自己不加 p3p ,在 IE 下打死都写不进去。
这个场景算是 cors 里面的一种,和 Oauth 没有半毛钱关系(你可曾见过,你访问挂联盟广告的网站,弹个 oauth 确认?)。