如何在 Cookie 上指定 SameSite 和 Secure(使用 axios/React/Node Express)

Posted

技术标签:

【中文标题】如何在 Cookie 上指定 SameSite 和 Secure(使用 axios/React/Node Express)【英文标题】:How to Specify SameSite and Secure on Cookies (using axios/React/Node Express) 【发布时间】:2020-11-22 07:58:24 【问题描述】:

我有这个聊天应用程序已经工作了一段时间,但突然之间它在客户端给了我这个问题:

Because a cookie's SameSite attribute was not set or is invalid, it defaults to SameSite=Lax,
which prevents the cookie from being set in a cross-site context. This behavior protects 
user data from accidentally leaking to third parties and cross-site request forgery.

Resolve this issue by updating the attributes of the cookie:
Specify SameSite=None and Secure if the cookie is intended to be set in cross-site contexts.
Note that only cookies sent over HTTPS may use the Secure attribute.

我在我的 React 客户端上使用这样的 axios

axios.defaults.withCredentials = true
axios.post('https://easytalkchatappv2.herokuapp.com/signin', 
      username: username,
      password: password
    ).then(res => 
      console.log(res.data)
)

我正在使用 JWT 设置 cookie,方法是在我的 Nodejs Express 服务器中的 /signin 发布请求中执行此操作:

const user = id: resp.insertedId
const accessToken = await jwt.sign(user, process.env.ACCESS_TOKEN_SECRET)

res.cookie('token', accessToken)

我也在使用 cookie-parser。如何将这些 SameSite 和 Secure 属性添加到 cookie?

【问题讨论】:

您可以在 Node 应用程序中使用 CORS 作为中间件来实现此目的:npmjs.com/package/cors expressjs.com/en/resources/middleware/cors.html Stack Overflow 上还有另一个类似的问题,其答案可能会有所帮助:***.com/questions/58270663/samesite-warning-chrome-77 【参考方案1】:

您应该能够将 'secure' 和 'sameSite' 属性传递给 res.cookie 方法;如下所示,其中 x 被替换为您要使用的值:

res.cookie('token', accessToken,  sameSite: x, secure: x )

如 Express 文档中所示: https://expressjs.com/en/api.html#res.cookie

【讨论】:

以上是关于如何在 Cookie 上指定 SameSite 和 Secure(使用 axios/React/Node Express)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到“通过指定其 SameSite 属性指示是不是在跨站点请求中发送 cookie”?

AspNet Core Identity,如何设置options.Cookie.SameSite?

Springboot应用中设置Cookie的SameSite属性

如何设置 SameSite 属性?

如何将 SameSite 和 Secure 属性设置为 JSESSIONID cookie

如何在 ASP.NET 中将 SameSite cookie 属性减少回无?