虫虫的技术博客 技术 生活

Tuesday, March 12, 2019

关于cookie是否能跨域的解读

        这篇文章目的是对CORS跨域携带cookie的理解作一个解释,之前一直对这里有一个误解,以为跨域是可以携带不同域名下的cookie,事实上,cookie的传递是要遵循同源策略的
        问题引出
        同事遇到了一个问题,希望在跨域ajax请求的时候,带上原域的cookie,希望被访问的目标域服务端能访问到原域的cookie,问到了我,我还比较自信的表示跨域这点小事肯定能搞定,因为之前也多次处理过跨域的问题,经过多次尝试,均以失败告终,很是汗颜,最后不断的找资料以及问大牛,得知,这种方式无法实现。

        究其根本&原理说明
        本次的两个域名涉及到跨域。
说到跨域就要说到同源策略,而同源策略,同源策略限制cookie的访问以及ajax请求。
本次的跨域AJAX请求是用的CORS实现方式,CORS是w3c的标准。
CORS方式,默认不允许携带cookie,如果允许携带,是需要客户端和服务端同时设置。CORS方式,携带的cookie,也是要遵循同源策略的,cookie只能携带被访问域名以及其父域下的,其它域的cookie是不被允许访问的
        白话总结
        两个域名下的cookie,是不能相互访问和传递的

对于有相同根域名(二级及以上),可以把cookie设置到根域上才能实现跨子域名的cookie访问(实际上,cookie并没有跨域)

相关问题,跨域的几种方式,每种方式的具体实现,适用场景,针对不同的语言的实现细节,这里就暂不讨论了

CORS,同源策略等名词,直接百科即可

对于在尝试解决问题的过程中,做的一些测试代码,附录如下


Node,原生XHR,document写cookie
zcmtestop.58corp.com进行xhr请求zcmtestop1.58corp.com

var xmlHttp=new XMLHttpRequest();
xmlHttp.open("GET","http://zcmtestop1.58corp.com/",false);
xmlHttp.withCredentials = true;
xmlHttp.send();
result = xmlHttp.responseText;
alert(result);

写cookie
document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";

服务端设置header
response().setHeader("Access-Control-Allow-Credentials", "true");
response().setHeader("Access-Control-Allow-Origin", "http://zcmop.58corp.com");

Xhr请求,后端无法拿到zcmtestop.58corp.com域下的cookie

Java,jquery,jquery写cookie
http://zcmop.58corp.com/
$.ajax({type: 'GET',url:'http://zcmop1.58corp.com/scftest',data: {},success:function(data){alert(data);},dataType:"json",xhrFields: {withCredentials: true},crossDomain:true});
$.cookie('the_cookie','the_value',{expires:7,path:'/',domain:'zcmop.58corp.com'});

服务端设置header
    response.writeHead(200,{
        'Content-Type': 'text/plain',
        'Access-Control-Allow-Origin': 'http://zcmtestop.58corp.com',
        'Access-Control-Allow-Credentials': true
        });

Xhr请求,后端无法拿到zcmop.58corp.com域下的cookie
以上两次尝试均失败

同源理解参考

0 comments:

Post a Comment

Popular Posts

Copyright © 虫虫的成长历程 | Powered by Blogger Design by PWT | Blogger Theme by NewBloggerThemes.com