即使在为 MERN 堆栈 Web 应用程序设置 SameSite:'none' 和 secure: true 后,Cookie 也不会保存在 Chrome 中

Pra*_*g k 5 cookies node.js express reactjs express-session

Chrome 最新更新后,浏览器不再保存我的服务器 cookie。以前,即使显示警告,它仍然可以工作。但现在不是了。

由于我的 React 应用程序托管在 netlify 上,而我的服务器在 AWS 上运行,因此它是跨源的。因此,我在快速会话中更改了 cookie 设置,sameSite=None secure选项如下。

app.use(session({
secret: 'my secret',
name: 'my-react-app',
resave: false,
saveUninitialized: true,
cookie: {
  secure: true,
  sameSite: 'none',
  maxAge: 24 * 60 * 60 * 1000,
  httpOnly: true
}
}));
Run Code Online (Sandbox Code Playgroud)

设置完之后secure: true,在firefox下就不行了。该网站通过 https 提供服务。我已经尝试了这些参数的几乎所有组合。我错过了什么吗?任何帮助,将不胜感激。

Pra*_*g k 3

我终于找到了解决方案。

实际上,这与我花了很多时间的快速会话设置没有太大关系。其背后的主要原因是反向代理配置错误。就我而言,反向代理和应用程序服务器之间的连接不是 https。因此,不会应用 cookie 中的安全标志,这又会导致将 SameSite 选项设置为默认的“lax”值。而且,这就是我的 cookie 在跨源请求中被拒绝的原因。

为了解决这个问题,我必须X-Forwarded-Proto在代理标头中进行设置。

打开反向代理配置文件

sudo nano /etc/nginx/conf.d/sysmon.conf
Run Code Online (Sandbox Code Playgroud)

就我而言,并添加以下行。

proxy_set_header X-Forwarded-Proto $scheme;
Run Code Online (Sandbox Code Playgroud)

这将通过 https 转发请求。

并且你还需要在express中设置“信任代理”。

var app = express()
app.set('trust proxy', 1) // trust first proxy
Run Code Online (Sandbox Code Playgroud)