获取不发送 Cookie
Posted
技术标签:
【中文标题】获取不发送 Cookie【英文标题】:Fetch Not Sending Cookies 【发布时间】:2020-03-13 23:45:27 【问题描述】:当我在浏览器的控制台(在开发人员工具中)使用以下 js sn-p 时(尝试使用 chrome、firefox 和 edge),在获取发送 cookie 时遇到问题:
fetch('http://127.0.0.1:3010/check',
credentials: 'include'
method: 'GET'
)
.then(res=>res.json())
.then(jsonobj=>console.log(jsonbj));
这是我处理 api 请求的快速代码:
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var cors = require('cors');
var app = express();
app.use(cors(
credentials: true,
origin: 'https://www.youtube.com'
));
app.use(express.json());
app.use(express.urlencoded( extended: false ));
app.use(cookieParser());
app.get('/check', (req, res)=>
console.log(JSON.stringify(req.cookies));
res.json(
message: "COOL"
);
);
获取调用成功,消息 COOL 被记录到浏览器控制台。但是,NodeJS 控制台会打印空对象 或空 cookie。
例如,当我在http://youtube.com/的控制台中运行获取请求时,我希望浏览器将我本地主机上的cookie发送到我的快递服务器(我这样做是为了模拟cookie发送在跨站点请求中)。
编辑 1:我的本地主机上的一些 cookie 也未设置 SameSite,并且 mdn 文档说这些 cookie 也可以通过跨站点请求发送到服务器:
标志未设置或不支持时的默认行为 浏览器,是在任何请求中包含 cookie,包括 跨域请求。
mdn 文档中的 sn-p 错误或浏览器对 SameSite 的实现不一致。我很困惑。
EDIT 2:这个页面https://textslashplain.com/2019/09/30/same-site-cookies-by-default/ 说
在 Chrome 80 及更高版本中,cookie 将默认为 SameSite=Lax。这 意味着 cookie 将仅在第一方自动发送 除非他们通过明确设置无指令来选择退出:
mdn 文档关于 SameSite 的默认值真的不正确吗?
编辑 3:我已提议对 mdn 文档进行编辑,并已被接受。
【问题讨论】:
这看起来不正确:headers: credentials: 'include'
。相反,headers
和 credentials
都是单独的参数。它应该是credentials: 'include'
(并且可以跳过headers
,因为您似乎没有任何额外的标题)。如果这能解决您的问题,请告诉我,我会根据此评论做出回答。
【参考方案1】:
请先查看问题的编辑,然后再使用此答案。现在,如果 cookie 的 SameSite 属性未设置,我们就不能再发送带有跨站点请求的 cookie,因为浏览器已将 SameSite 的默认值更改为 lax。以下是 chrome 补丁说明的快照(对于稳定版 80,虽然 Beta 测试将适用于版本 79 beta,因为 google 认为此更改将具有破坏性,并可能导致某些 Web 应用程序行为不正确,因此显示警告也)https://support.google.com/chrome/a/answer/7679408#76:
默认情况下使用 SameSite 的 Cookie,并且 Secure SameSite=None Cookie Chrome 80 从 Chrome 80 开始,未指定 SameSite 属性将被视为 SameSite=Lax。 仍然需要在跨站点上下文中传递的 Cookie 可以 明确要求 SameSite=None。它们还必须标记为安全和 通过 HTTPS 交付。政策将为企业提供 需要将 Chrome 配置为临时恢复到旧版 SameSite 行为。
目前 Firefox 和 Edge 也显示了类似的行为。要在跨源请求中发送 cookie,我们必须将 SameSite 属性显式设置为 None 为:
Set-Cookie: key=value; SameSite=None; Secure
另外,请注意 Secure 是强制性的,否则它将被视为 Lax cookie。仅当您确实确定自己在做什么并准确处理跨站点请求伪造时,才使用无选项!
我已提议对 Http Cookie (https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies) 的 mdn 文档进行更改,并且更改已发布。现在 mdn 文档说:
以前,如果未设置 SameSite 属性,则默认行为, 或浏览器不支持,将 cookie 包含在任何 请求——包括跨域请求。
但是,新版本的浏览器默认为 SameSite=Lax。其他 换句话说,没有设置 SameSite 属性的 cookie 现在被处理为 SameSite 属性的值设置为 Lax — 这意味着 cookie 将仅在第一方上下文中自动发送。到 指定要在同站点和跨域中发送 cookie 请求,该值必须显式设置为 None。
【讨论】:
以上是关于获取不发送 Cookie的主要内容,如果未能解决你的问题,请参考以下文章