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

时间:2015-04-02 14:53:09

标签: javascript security google-chrome cookies

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

回复标题:

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 02 Apr 2015 14:45:38 GMT
Content-Type: application/javascript
Content-Length: 544
Connection: keep-alive
Content-Location: script.js.php
Vary: negotiate,Accept-Encoding
TCN: choice
Set-Cookie: test_id=551d5612406cd; expires=Sat, 02-Apr-2016 14:45:38 GMT; path=/
Content-Encoding: gzip

请求标头 - 没有cookie:

GET /script.js HTTP/1.1
Host: [site1]
Connection: keep-alive
Cache-Control: max-age=0
Accept: */*
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36
Referer: [site2]/page.html
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru,en-US;q=0.8,en;q=0.6,sk;q=0.

3 个答案:

答案 0 :(得分:5)

浏览器执行在请求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

答案 1 :(得分:1)

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

默认情况下,浏览器会发送带有JavaScript文件请求的Cookie。

答案 2 :(得分: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>

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