Chrome 80 默认启用 HTTP Cookie SameSitehttps://www.chromestatus.com/feature/508814734603059218 ),不设置新 flag 的 Cookie 会默认 SameSite=Lax,跨域时只在一些常用的 GET 请求带 Cookie,其它 需要登录状态的请求会全部挂掉……

根据 LeanCloud Node.js SDK 所用 Cookie 库的文档( https://github.com/pillarjs/cookies#cookiesset-name--value---options--13 )设置:

import Koa from 'koa';
import { init, koa2, Cloud } from 'leanengine';

init({ appId: 'xxx', appKey: 'yyy' });

const app = new Koa()
    .use(koa2())
    .use(
        // @ts-ignore
        Cloud.CookieSession({
            framework: 'koa2',
            secret: 'zzz',
            // @ts-ignore
            secure: true,
            // sameSite: false  // 这是默认值
        })
    );

app.listen(3000);

希望恢复 Chrome 80 之前的默认设置,然而无效……

我的理解是这个变化只对于「跨域请求」的 Cookie 有影响,在同一个域内发送 Cookie 的行为并没有变化,请问你是在实际使用中遇到了什么问题么?

你的理解是正确的。

我的很多应用的前端都部署在 GitHub Pages 这样的地方,必然和 LeanCloud 跨域,CookieSession 中间件无法成功设置 Secure=true; SameSite=None 的话,应用就只能展示数据,不能更改数据了……

这样的话,因为 Cloud.CookieSession 会将所有参数都传入 cookies.set,所以开发者可以直接设置 sameSite 选项:

Cloud.CookieSession({sameSite: 'none'})

后续我们会把这段描述加到文档上,但应该不会默认设置 sameSite 选项,Chrome 这么做也是出于安全考虑,避免发生 CSRF。

采了同样的坑,这个应该怎么处理啊。
是不是必须设置https , 再设置 SameSite=None 才能恢复 cookie 的传递啊。

是的,必须用 HTTPS 地址访问,然后在调用 Cloud.CookieSession 的参数中加入 sameSite: 'none'

我的实验结果是无效,因为我们的 Node.js 应用接收请求还是 HTTP,Cookie 中间件此时不认为 Secure=true, SameSite='none' 就不生效……

如果请求还是 HTTP 的话,确实没什么比较好的办法了 ...

换一个不管 HTTPS、只管设置键值对的 Cookie 操作库?否则即使是个很简单的应用,也得换 JWT 这种不依赖 Cookie 的机制了……

这个不是 Cookie 库的要求,是浏览器的要求(必须 HTTPS)

我当然知道“SameSite 用 HTTPS 是浏览器的要求”……

但我前面一直在描述:

LeanCloud SDK 依赖的 Cookie 库也要求 Node.js 监听的协议是 HTTPS 才能设置 SameSite 成功