第三方cookie和第一方的cookie并不是技术上的区分,而是业务上的区别,我很赞同这句话,因为我觉得第三方和第一方都是一个相对的概念,其实我们操作的都是自己域下的cookie,只是在某种情景下的操作,我们称之为第三方域下cookie的操作
-------题记
注:此处讲的是跨一级域操作cookie,如果只是跨二级域的话,很简单,只需要设置cookie的domian为一级域名,并辅以path属性的设置即可;
关于跨域,首先我们要明确一个概念,根据安全策略,我们永远不可能操作第三域的cookie,比如在A域的页面试图去读取一个domian为B域的cookie;或者在域A的页面试图通过域A页面的JS或者来自域A的http请求返回让浏览器去写入一个domain为B域的cookie;
到底能不能跨域,跨的是什么域,我觉得这个是我们需要最开始弄清楚的地方,是后面操作一起的基础。因为有些事我们可以努力,有些事我们努力了也不会有结果。
记得曾经看到过一篇文章讲到,第三方cookie和第一方的cookie并不是技术上的区分,而是业务上的区别,我很赞同这句话。因为我觉得第三方和第一方都是一个相对的概念,其实我们操作的都是自己域下的cookie,只是在某种情景下的操作,我们称之为第三方域下cookie的操作。当然在这儿,我们假设我们已经对第一方和第三方cookie的定义有了完整准确的理解。
cookie的读写场景一般有两种,一般分为前台的JS的操作,和通过http请求传递到后台的读,及http响应的写操作。
前台的JS的读写是受同源策略限制的,我们永远只能将要写的cookie设置和当前载入js的文档为同一个域,就算是通过iframe引入的页面中的JS视图去读写的cookie也是只能和iframe的src是同一个域。
第二种一般发生在页面中包含了另外一个域的请求,比如iframe,img,script都可以。http请求一般都是携带cookie的,这个毋庸置疑,而且只能携带和请求同一个域下的cookie,但是当这个请求发生在另外一个域的页面中的时候,就会产生问题,这个时候对于主页面来说,你在我的页面请求读取不是我域下的cookie,也就是说你想跨域,这个时候他就不会让你这么轻易的得逞,关于这种情况的分析,下面会讲到。如果一个跨域的请求返回了一个写cookie的指令,前提是你写的是和自己请求的域是同一个域的cookie,如果是其他域的,就算和主域是同一个域,想都别想。这个时候你也不是这么容易办到的,因为对于主域来说,你又在想跨我的域来操作,肯定也不是那么容易让你得逞的。
现在我们先来假设这样一个场景,我们访问一个域A的页面(我们成为A_1页面),A_1页面的底部通过iframe引入一个域B的页面(我们称为B_1页面);
此时我们关心的是这个发向域B的请求会不会携带域B的cookie和来自域B的响应能不能在导航栏为域A的页面的情况下写入cookie;
因为对于A页面来说,此时在来自它的window中有一个关于域B的cookie操作请求,此时就发生了我们常说的跨域操作cookie的情况。
我们首先先拿出结果,在一般情况下,也就是没有服务端p3p的干预的情况下,B_1的请求中是不会携带域B的cookie的,域A的就更别想了。而且B_1的响应中携带的cookie是能够返回的。但是不能写到内存或者硬盘中的。
但是在火狐中就完全不存在这个问题了,完全可以正常操作。
对于火狐中不存在这个问题就没有什么好讲的了,IE中不支持的话我们就得分析问题去解决了。
在这里有一个概念就不得不提了,因为没有这个概念,我们上面谈的问题都不是问题,那就是p3p,关于这个概念,或者称之为协议,我们可以上网了解。它大概可以分为两部分,一部分是浏览器端用户设置的隐私偏好(有这个部分的前提是浏览器支持p3p),和服务端的隐私申明。比如用户可以在IE浏览器中设置隐私级别,默认级别一般都是中。一部分是服务端在头信息关于当前网页隐私安全性的声明;浏览器在最后执行的时候会将隐私安全性的生命和用户设置的做对比,如果不匹配的话,会告知用户,由用户选择安全性的执行方案。
既然用户已经选择了不去允许域B的cookie写入,IE认为是不安全的,那么我们能做的修改就是修改服务端的隐私安全性声明了,具体怎么去加这个p3p的声明,网上有很多方法,百度一下就行,比如在response的header中添加一个头信息:P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"。
如果你看到这篇文章,发现有什么谬误之处,还请留言斧正,将万分感谢!
分享到:
相关推荐
跨域访问解决方案,关于跨域访问cookie的资料
cookie跨域后端代码,主要解决跨域的问题,在servlet部分,供初学者使用
自从入了 Vue 之后,一直在用 axios 这个库来做...下面这篇文章主要给大家介绍了关于axios中cookie跨域及相关配置的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
asp.net cookie跨域小例子,这是httpwebrequest的这种方式来做的。 要想测试这个跨域,我们需要修改本地的host文件,配置两个域名,例如 127.0.0.1 www.xj5u.com 127.0.0.1 cc.xj5u.com 第一个项目绑定第一个域名...
因为cookie在跨域的情况下,浏览器根本不允许互相访问的限制,为了突破这个限制,所以有了以下这个实现方案,使用postmessage和localstorage进行数据跨域共享。 原理比较简单,但是遇到的坑也不少,这里梳理一下,做...
NULL 博文链接:https://pengfeifei26.iteye.com/blog/2173052
Dubbox跨域请求,配置CORS服务来解决跨域问题,亲测可用。
最近需要把阿里云上的四台服务器的项目迁移到客户提供的新的项目中,原来的四台服务器中用到了一级域名和二级域名。比如aaa.abc.com 和bbb.abc.com 和ccc.abc.com。其中aaa.abc.com登录,通过把cookie中的信息...
该文件可以通过代码实例,让你清楚的理解session和cookie的意思,当你明白了这点,你就可以设计出来单点登录功能,同一账号在同一时间只能登录一次功能。同时你可以通过ie、firefox去测试你对session、cookie的理解...
应某网友请求,做的一个Cookie跨域的简单演示 请将HTML和PHP文件放入不同的域名下测试,然后修改下面Js的调用地址
针对单点登录中的跨域身份认证问题,提出了一种基于可变Cookie的方案解决跨域单点登录,使用随机数字生成票据,并作为传统加密算法的会话密钥对客户端的Cookie进行加密,采用现代加密算法在异域系统之间安全传递票据,...
nginx配置文件#是否允许跨域发送Cookieif ($request_method = 'OPTIONS') {跨域携带发送cookie如果需要允许跨域携带
以前在面试的时候经常遇到问关于跨域的事儿,所以自己对跨域有一定的概念性了解,知道什么是跨域以及解决跨域的方法,但是具体实际从来没有操作过,直到最近在公司项目中,遇到了一个需要使iframe跨域进行POST提交的...
Expires 过期时间 跨域操作需要设置域属性: Response.Cookies(“MyCookie”).Domain = “jb51.net”; (这里指的是泛域名) 这样在其它二级域名下就都可以访问到了, ASP 和 ASP.NET 测试通过 虚拟目录下访问: 我在...
前后端分离必定面临跨域问题,以下是两个跨域请求携带cookie的nginx服务,完美演示跨域请求携带cookie
项目采用Spring、SpringMVC技术、具体实现的功能为基于Cookie技术的Session跨域功能
Cookie是一个伟大的发明,它允许Web开发者保留他们的用户的登录状态。但是当你的站点有一个以上的域名时就会出现问题了。在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名。因此,如果在浏览器...
SSO单点登录【基于cookie二级域名下跨域共享】的简单实现。