Ale*_*eev 5 javascript security cookies google-chrome
我正在使用script
标签在[site2] /page.html上加载[site1] /script.js 。并且浏览器在请求JS文件时不会发送cookie。
响应头:
HTTP / 1.1 200 OK 服务器:nginx 日期:2015年4月2日,星期四14:45:38 GMT 内容类型:应用程序/ javascript 内容长度:544 连接:保持活动状态 内容位置:script.js.php 变化:协商,接受编码 TCN:选择 Set-Cookie:test_id = 551d5612406cd; expires =星期六,2016年4月2日14:45:38 GMT; 路径= / 内容编码:gzip
请求标头-没有Cookie:
GET /script.js HTTP / 1.1 主持人:[site1] 连接:保持活动状态 快取控制:max-age = 0 接受:* / * 用户代理:Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 41.0.2272.101 Safari / 537.36 引荐来源:[site2] /page.html 接受编码:gzip,deflate,sdch 接受语言:ru,en-US; q = 0.8,en; q = 0.6,sk; q = 0。
浏览器在请求JavaScript文件时会发送cookie,就像在请求其他内容时一样。同样的规则也适用:Cookie必须用于原点/路径。在您的示例中,您似乎使用了两个不同的来源(site1
和site2
),这可以解释为什么您在请求中看不到cookie。
例如:我test.php
在服务器上设置了一个名为cookie的页面。然后,它具有一个test2.html
包含的链接foo.js
。这些都在同一路径上(/
在我的示例中,因为我很懒并且没有为测试创建子目录)。
在浏览器获取响应标题时test.php
,我看到了
Set-Cookie:test = 123
如果再单击test2.html
,则会在请求标题中看到以下内容test2.html
:
Cookie:test = 123
然后,我看到的请求foo.js
,在该请求中,我看到:
Cookie:test = 123
在特殊情况下,即使来源相同,也不会发送cookie,这是在加载ES6模块时!
<script type="module" src="some-script.js"></script>
Run Code Online (Sandbox Code Playgroud)
这不会发送cookie,因此如果您的服务器需要验证请求,则可能会失败。
正如这篇出色的文章所指出的那样,您需要通过添加crossorigin
属性来明确要求发送凭据
:
<script type="module" crossorigin src="some-script.js"></script>
Run Code Online (Sandbox Code Playgroud)
目前,此行为被视为错误(没有任何意义,对吗?),并且已在所有主流浏览器中修复。有关更多详细信息,请参见上面的链接。