如何判断未发送 cookie 的原因?

How to tell why a cookie is not being sent?

我正在使用 chrome,我想知道是否有扩展程序或方法来说明为什么未发送 cookie。

我向 http://dev/login 提出了一个请求,它正在返回,

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

但是,在 post 到 http://dev/Base/User/home/ 上,我没有发送 DevId cookie。如果有人碰巧知道,我很想知道为什么不发送 cookie。但是,此外,我很想知道我如何知道为什么以及将来如何更好地调试这个问题。

以下是从 Chrome 的开发工具

中捕获的一些请求

所以这是我来自 /login 的回复(注意 Set-Cookie header),

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

这是我的 post 到 /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

问题是这样的:

domain=dev;

引用自RFC 2945

The value of the Domain attribute specifies the domain for which the cookie is valid. If an explicitly specified value does not start with a dot, the user agent supplies a leading dot.

因此,如果主机地址以 .dev.

结尾,Web 客户端只会发送 cookie

尝试发送没有域属性的 cookie。

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

#56211 chrome.cookies 本地主机域失败

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

可能还想读this question。它不像这个问题那样特定于 chrome,但它特定于本地主机的行为(与这个问题不同)。

Evan Carroll 链接到 chromium 的问题(现在重定向到这里:https://bugs.chromium.org/p/chromium/issues/detail?id=56211)似乎相关,并被标记为 "Fixed"。不过,目前还不是很清楚。

我遇到了 /etc/hosts 中的主机条目问题,例如:

127.0.0.1   local.app.service.tld

但是改成

之后
127.0.0.1   app.localhost

它再次按预期运行。我认为 chrome 会在它发生时发布一个关于此的小日志通知。唉,这会让我们所有人免去很多悲伤。

如果您正在进行跨域请求并使用 XHR 客户端(如提取 API),请注意 withCredentials 参数。

The XMLHttpRequest.withCredentials property is a Boolean that indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies, authorization headers or TLS client certificates. Setting withCredentials has no effect on same-site requests.

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

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

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

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

如何判断未发送 cookie 的原因:

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

  • 转到刚刚出现的“Cookies”选项卡。

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

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

在我的例子中,这是因为 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));

截至 2022 年 Chrome...

开发者工具 > 网络选项卡 > Headers > 响应 中,您可以看到未设置 cookie 的原因。