如何判断为啥没有发送 cookie?

Posted

技术标签:

【中文标题】如何判断为啥没有发送 cookie?【英文标题】:How to tell why a cookie is not being sent?如何判断为什么没有发送 cookie? 【发布时间】:2015-09-01 20:51:08 【问题描述】:

我正在使用 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 的开发工具中捕获的一些请求

这是我来自/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 - i.imgur.com/4W57ztA.png。如果不是,我们需要一个工具来验证您发送的标头。 我已确认 cookie 未在发布请求标题下的网络选项卡中发送。但是,cookie 不是在资源选项卡下设置的事件。 【参考方案1】:

问题是这样的:

域=开发;

引用RFC 2945:

Domain 属性的值指定域 cookie 对其有效的对象。如果明确指定的值 不以点开头,用户代理提供前导点。

所以web客户端只会在主机地址以.dev.结尾时发送cookie

尝试发送不带域属性的 cookie。

【讨论】:

这在 Firefox 中有效,但这不是它应该如何工作的。至少根据this post。用户代理应该“提供”点,所以它写成.dev,它应该在devdev的任何子域上提交cookie。【参考方案2】:

这是 Chrome 特有的错误。还没有修复..

#56211 localhost 域的 chrome.cookies 失败

https://code.google.com/p/chromium/issues/detail?id=56211

可能还想阅读this question。它不是像这个问题那样特定于 chrome,而是特定于 localhost 行为(与这个问题不同)。

【讨论】:

然而,当我使用 隐身模式 或其他 Chrome 配置文件时,它可以工作。所以我很困惑为什么这只是我正常 Chrome 配置文件中的一个问题。【参考方案3】:

Evan Carroll 链接到的铬问题(现在在此处重定向: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 会很好地发布一个关于这个的日志通知。唉,这会为我们所有人省去很多悲伤。

【讨论】:

【参考方案4】:

如果您处理跨域请求并使用 XHR 客户端(如 fetch API),请注意 withCredentials 参数。

XMLHttpRequest.withCredentials 属性是一个布尔值,指示是否应使用 cookie、授权标头或 TLS 客户端证书等凭据进行跨站点访问控制请求。设置 withCredentials 对同站点请求没有影响。

【讨论】:

【参考方案5】:

我在设置 cookie 时收到此错误,但未在我的 cookie 设置中指定 ; path=/。然后我的网络服务器将某些请求路由到/ 的网络服务器,并且没有设置 cookie,因为它仅对我最初设置的 /auth 有效。

请注意,上面的Path 是“/auth”,这是它的有效位置。在我的 cookie 中设置路径后:

`nz_auth_jwt=$jwt; path=/; expires=...` 

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

【讨论】:

【参考方案6】:

如何判断为什么没有发送 cookie:

转到网络选项卡,然后单击未与您的 cookie 一起发送的请求。

转到刚刚出现的“Cookies”标签。

选中“显示过滤掉的请求 cookie”以查看所有未发送的 cookie,它们将显示为黄色。

然后会在阻止发送 cookie 的属性旁边出现一个小的“i”标签。您可以将鼠标悬停在上面查看详细信息。

【讨论】:

谢谢,我从 3 天开始就一直在寻找这个。 对于有问题的请求,我发现 Cookies 选项卡没有出现。 @skainswo 这可能会对您有所帮助:https://***.com/questions/55414344/chrome-network-request-does-not-show-cookies-tab-some-request-headers-copy-as。虽然那里的答案对我不起作用。 你是真正的 MVP 兄弟【参考方案7】:

在我的情况下,这是因为 Fetch API 不会发送 cookie,除非credentials: "include" 作为选项提供。

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));

【讨论】:

【参考方案8】:

Chrome 中截至 2022 年...

开发者工具>网络选项卡>标题>响应你可以看到为什么没有设置cookies。

【讨论】:

以上是关于如何判断为啥没有发送 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

CORS 请求 - 为啥不发送 cookie?

为啥 jQuery 的 .ajax() 方法不发送我的会话 cookie?

为啥显示“邮件发送成功”后,对方却没有收到?

为啥我的 cookie 设置没有被应用?

为啥 Chrome 没有收到我的 cookie?

为啥我的“Set-Cookie”响应标头没有被翻译成实际的 cookie?