如何确定cookie未发送的原因?

42

我正在使用Chrome浏览器,想知道是否有扩展程序或方法可以告诉我为什么某个cookie没有被发送。

我向http://dev/login发出一个请求,但它返回了:

Set-Cookie:DevId=cffbc7e688864b6811f676e181bc29e6; domain=dev; path=/; expires=Tue, 16-Jun-2015 21:27:43 GMT

然而,在发布到http://dev/Base/User/home/的帖子中,我没有发送DevId cookie。如果有人知道为什么没有发送cookie,我很想知道。但是,更重要的是,我想知道如何查明原因并在将来更好地调试此问题。

以下是Chrome Dev工具捕获的一些请求:

这是我从/login收到的响应(请注意Set-Cookie标头):

HTTP/1.1 200 OK
Date: Tue, 16 Jun 2015 19:57:43 GMT
Server: Apache
Pragma: no-cache
Cache-control: no-cache, max-age=0
Set-Cookie: DevId=cffbc7e688864b6811f676e181bc29e6; domain=dev; path=/; expires=Tue, 16-Jun-2015 21:27:43 GMT
Cache-Control: max-age=0
Expires: Tue, 16 Jun 2015 19:57:43 GMT
Keep-Alive: timeout=10, max=10
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json; charset=ISO-8859-1

这是我发布的帖子到/Base/User/home/1(注意没有cookie),

POST /Base/User/home/ HTTP/1.1
Host: dev
Connection: keep-alive
Content-Length: 0
Origin: http://dev
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.81 Chrome/43.0.2357.81 Safari/537.36
Content-type: application/x-www-form-urlencoded; charset=UTF-8
Accept: text/javascript, text/html, application/xml, text/xml, */*
X-Prototype-Version: 1.7.2
X-Requested-With: XMLHttpRequest
Referer: http://dev/user/1/home
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8

您可以在“资源”选项卡中验证 cookie 是否已设置 - https://i.imgur.com/4W57ztA.png。如果没有设置,我们需要一款工具来验证您发送的标头。 - Konrad Dzwinel
我已经在“网络”选项卡下的POST请求头中验证了Cookie未被发送。但是,在“资源”选项卡下,该Cookie甚至没有被设置。 - Evan Carroll
8个回答

70
如何判断为什么cookie没有被发送:
1. 在网络选项卡中,点击未携带cookie的请求。 2. 进入刚刚出现的“Cookies”选项卡。 3. 勾选“显示被过滤的请求cookie”。
然后,会在阻止cookie发送的属性旁边出现一个小的“i”标签。您可以将鼠标悬停在上面查看详细信息。

enter image description here


3
谢谢,我已经找了三天了。 - Aniket Singla
8
在出现问题的请求中,我发现 Cookies 选项卡没有显示。 - skainswo
1
@skainswo 这可能会对您有帮助:https://dev59.com/11MI5IYBdhLWcg3wv-TL。然而,那里的答案对我没有起作用。 - Lucas Said
谢谢,卢卡斯!我找了好几个小时都没找到问题所在,我也不知道 Chrome 里有这个选项。 - mrblue
不幸的是,这并没有显示被阻止的“第三方”cookie。Chrome的默认设置是在隐身模式下阻止第三方cookie,因此如果您正在隐身模式下进行测试,这可能是您的cookie未被发送的原因。 - yeerk

6
在我的情况下,这是因为Fetch API在不给出credentials: "include"选项的情况下不会发送cookie。
fetch('API_ENDPOINT',{
  method: 'POST',
  credentials: 'include',
  body: JSON.stringify(some_json_obj)
})

另外,我需要按照以下方式配置Node.js (express.js)后端的CORS。

const cors = require('cors')

const corsOptions = {
  origin: 'http://localhost:3000',
  credentials: true
}

app.use(cors(corsOptions));

4

然而,当我使用隐身模式或不同的Chrome配置文件时,它可以正常工作。因此,我很困惑为什么这只是在我的普通Chrome配置文件中出现问题。 - Arlo

3
问题是这样的:

domain=dev;

RFC 2945中引用:

Domain属性的值指定了cookie有效的域。如果显式指定的值未以点开头,则用户代理程序会提供前导点。

因此,只有主机地址以 .dev. 结尾时,Web客户端才会发送cookie。

尝试在没有Domain属性的情况下发送cookie。

1
这在Firefox中有效,但这不是它应该工作的方式。至少根据此帖子(https://dev59.com/9Gkw5IYBdhLWcg3w1d8m#9618243)来看是这样的。用户代理应该“提供”点,因此它被写成`.dev`,这应该在`dev`和任何`dev`的子域上提交cookie。 - Evan Carroll

3
如果您正在进行跨域请求并使用XHR客户端(例如fetch API),请注意withCredentials参数。
XMLHttpRequest.withCredentials属性是一个布尔值,指示是否应使用凭据(如cookie、授权标头或TLS客户端证书)进行跨站点访问控制请求。设置withCredentials对同一站点请求没有影响。

1
我在设置cookie时没有指定; path=/,因此收到了这个错误。我的web服务器随后将某些请求路由到/的web服务器上,因为该cookie仅对我最初设置它的/auth有效,所以它无法设置成功。

firefox screenshot of devtools

请注意上面的Path是"/auth",这是它有效的位置。在设置了我的cookie路径之后:
`nz_auth_jwt=${jwt}; path=/; expires=...` 

我在后续请求中看到了我的cookie。并验证了开发工具中的路径设置正确,对于所有路由都是有效的,这正是我想要的。


0

截至2022年在Chrome中...

开发者工具 > 网络选项卡 > 标头 > 响应中,您可以看到为什么未设置cookie。

Screenshot


0

Evan Carroll提到的与chromium相关的问题(现在重定向到此处:https://bugs.chromium.org/p/chromium/issues/detail?id=56211)似乎很相关,并标记为“已修复”。但是,具体修复方式并不是很清楚。

我在/etc/hosts中遇到了类似以下条目的主机条目问题:

127.0.0.1   local.app.service.tld

但是在将其更改为

127.0.0.1   app.localhost

它再次按预期工作。我认为当发生这种情况时,Chrome发布一个小的日志通知会很好。唉,这将节省我们所有人很多痛苦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接