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

Posted

技术标签:

【中文标题】为啥浏览器在请求 JavaScript 文件时不发送 cookie?【英文标题】:Why the browser doesn't send cookies while requesting a JavaScript file?为什么浏览器在请求 JavaScript 文件时不发送 cookie? 【发布时间】:2015-06-07 14:07:39 【问题描述】:

我正在 [site2]/page.html 上使用 script 标签加载 [site1]/script.js。 并且浏览器在请求 JS 文件时不会发送 cookie。

响应标头:

HTTP/1.1 200 OK
服务器:nginx
日期:格林威治标准时间 2015 年 4 月 2 日星期四 14:45:38
内容类型:应用程序/javascript
内容长度:544
连接:保持活动
内容位置:script.js.php
变化:协商,接受编码
TCN:选择
设置 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, like 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.

【问题讨论】:

Cookie 不在域之间共享(资源类型无关紧要)。为什么需要共享 cookie? 因为如果浏览器跨域发送您的 cookie,那么没有什么可以阻止 nastycriminalsite.ru 窃取您的 localbank.com 登录 cookie。 因为the same-origin policy 【参考方案1】:

有一种特殊情况,即不发送 cookie,即使来源相同:加载 ES6 模块时!

<script type="module" src="some-script.js"></script>

这不会发送 cookie,因此如果您的服务器需要对请求进行身份验证,它可能会失败。

作为this excellent article points out,您需要通过添加 crossorigin属性:

<script type="module" crossorigin src="some-script.js"></script>

这种行为目前被认为是一个错误(它没有任何意义,对吧?)并且它正在所有主要浏览器中得到修复。有关详细信息,请参阅上面的链接。

【讨论】:

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

对不起,这是我的错误。谷歌浏览器阻止了第三方 cookie。

默认浏览器发送带有 JavaScript 文件请求的 cookie。

【讨论】:

【参考方案3】:

浏览器在请求 JavaScript 文件时发送 cookie,就像在请求其他任何内容时一样。并且适用相同的规则:cookie 必须用于源/路径。在您的示例中,您似乎使用了两个不同的来源(site1site2),这可以解释为什么您在请求中看不到 cookie。

例如:我在我的服务器上设置了一个名为test.php 的页面,该页面设置了一个cookie。然后它有一个指向test2.html 的链接,其中包括foo.js。这些都在同一个路径上(/,在我的示例中,因为我很懒,没有为测试创建子目录)。

在浏览器获取test.php时的响应标头中,我看到了

设置 Cookie:test=123

如果我随后点击test2.html,我会在test2.html 的请求标头中看到这一点:

饼干:测试=123

然后我看到foo.js 的请求,在该请求中我看到:

饼干:测试=123

【讨论】:

以上是关于为啥浏览器在请求 JavaScript 文件时不发送 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

为啥onclick处理程序在javascript中与innerHTML一起使用时不起作用[重复]

为啥在单击事件后聚焦时不应用浏览器默认聚焦样式?

为啥ajax请求json数据,在IE浏览器里面不能正常显示?

intellij IDEA为啥运行时不编译grails或groovy了。

为啥 Scrolltrigger 在调整窗口大小时不更新我的动态 x 值?

为啥 GitHub 在提交历史记录时不显示文件历史记录?