为啥浏览器在请求 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 必须用于源/路径。在您的示例中,您似乎使用了两个不同的来源(site1
和 site2
),这可以解释为什么您在请求中看不到 cookie。
例如:我在我的服务器上设置了一个名为test.php
的页面,该页面设置了一个cookie。然后它有一个指向test2.html
的链接,其中包括foo.js
。这些都在同一个路径上(/
,在我的示例中,因为我很懒,没有为测试创建子目录)。
在浏览器获取test.php
时的响应标头中,我看到了
如果我随后点击test2.html
,我会在test2.html
的请求标头中看到这一点:
然后我看到foo.js
的请求,在该请求中我看到:
【讨论】:
以上是关于为啥浏览器在请求 JavaScript 文件时不发送 cookie?的主要内容,如果未能解决你的问题,请参考以下文章
为啥onclick处理程序在javascript中与innerHTML一起使用时不起作用[重复]
为啥ajax请求json数据,在IE浏览器里面不能正常显示?
intellij IDEA为啥运行时不编译grails或groovy了。