cookie作用域


昨天跟前端联调接口,发现种在根域的cookie无法通过ajax请求带上来。很诧异,今天做了个实验。代码如下:

<!-- file: index.html -->
<!-- 绑定host:127.0.0.1 cookie.com a.cookie.com b.cookie.com a.a.cookie.com b.b.cookie.com -->
<!-- 开启web服务器: php -S 127.0.0.1:80 -->
<!-- 打开cookie.com种cookie:document.cookie = "a=1; domain=.cookie.com"; -->
<!-- 打开:http://cookie.com http://a.cookie.com http://b.cookie.com http://a.a.cookie.com http://b.b.cookie.com -->

<img src="http://a.cookie.com/a.png">
<img src="http://b.cookie.com/b.png">
<img src="http://a.a.cookie.com/a.a.png">
<img src="http://b.b.cookie.com/b.b.png">

<script type="text/javascript" src="http://a.cookie.com/a.js"></script>
<script type="text/javascript" src="http://b.cookie.com/b.js"></script>
<script type="text/javascript" src="http://a.a.cookie.com/a.a.js"></script>
<script type="text/javascript" src="http://b.b.cookie.com/b.b.js"></script>

<script src="https://cdn.bootcss.com/jquery/3.1.0/jquery.js"></script>

<script>
	$.get('http://cookie.com');
	$.get('http://a.cookie.com');
	$.get('http://b.cookie.com');
	$.get('http://a.a.cookie.com');
	$.get('http://b.b.cookie.com');

	$.getJSON('http://cookie.com?callback=?');
	$.getJSON('http://a.cookie.com?callback=?');
	$.getJSON('http://b.cookie.com?callback=?');
	$.getJSON('http://a.a.cookie.com?callback=?');
	$.getJSON('http://b.b.cookie.com?callback=?');
</script>

以往印象:cookie的domain属性决定了它在哪些请求中生效(携带),如果种在根域下的cookie,请求所有子域资源均带此cookie。

实验结论:请求png、js均带上了cookie;get请求只有当前域带上了cookie;getJSON请求均带上了cookie。

ajax请求如果跨域了,是不安全的,所以就不带cookie了。就算服务端响应头包含了允许跨域的头,也不会带上cookie(是先发的请求,后响应的,想想都知道跟这个没关系,当然,再次请求依旧不会带)。

而getJSON请求为何会带上cookie呢?本质上getJSON就是加载js资源。。。

 

Ps:实践出真知


《“cookie作用域”》 有 1 条评论

  1. 当然,解决方案自然也是有的。
    一种思路:p3p
    另一种思路:全jsonp,服务端做referer校验

    各有优缺点~自行体会~

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注