获取不发送 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' 。相反,headerscredentials 都是单独的参数。它应该是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的主要内容,如果未能解决你的问题,请参考以下文章

如何在服务器发送的reactjs中获取JWT cookie

cookie机制&跨域问题

怎么获取Cookie

scrapy发送post请求获取cookie

Chrome扩展程序获取功能不会发送Cookie

跨域koa-session 无法获取问题