为什么浏览器在请求JavaScript文件时不发送cookie?

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。

T.J*_*der 6

浏览器在请求JavaScript文件时发送cookie,就像在请求其他内容时一样。同样的规则也适用:Cookie必须用于原点/路径。在您的示例中,您似乎使用了两个不同的来源(site1site2),这可以解释为什么您在请求中看不到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


Luc*_*iva 5

在特殊情况下,即使来源相同,也不会发送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)

目前,此行为被视为错误(没有任何意义,对吗?),并且已在所有主流浏览器中修复。有关更多详细信息,请参见上面的链接。

  • 我们在 Safari 中遇到了这个问题。它仍然没有使用“crossorigin”发送 cookie,但它使用“crossorigin="use-credentials"”发送 cookie。 (7认同)
  • 截至 2020 年,Safari 仍然会发生这种情况,这个答案非常有帮助。@Alexander Matveev,我知道您的实际问题是不同的,但在研究这个问题时,您的问题首先出现。如果您更改对此问题的接受答案,也许会很有用,因为它提供了解决方案...... (3认同)

Ale*_*eev 1

抱歉,这是我的错误。Google Chrome 阻止了第三方 cookie。

默认情况下,浏览器会通过 JavaScript 文件请求发送 cookie。