【问题标题】:Cookies and SameSite + Secure - ExpressJSCookie 和 SameSite + 安全 - ExpressJS
【发布时间】:2020-02-02 08:20:50
【问题描述】:

即使我的 express 应用程序具有以下设置,控制台中仍会显示以下警告。有没有人见过这个错误?我的搜索将我带到https://github.com/expressjs/express/issues/3095

我也在使用 express : 4.17.1

let COOKIE_OPTIONS = { httpOnly: true, sameSite: 'None', secure: true };
A cookie associated with a cross-site resource at http://MYURL.URL was set
without the `SameSite` attribute. A future release of Chrome will only deliver 
cookies with cross-site requests if they are set with `SameSite=None` and 
`Secure`. You can review cookies in developer tools under 
Application>Storage>Cookies and see more details at 
https://www.chromestatus.com/feature/5088147346030592 and 
https://www.chromestatus.com/feature/5633521622188032.

当使用 Insomia (Postman) 发出请求时,我看到以下内容

access_token=someToken; 
Path=/; 
HttpOnly; 
Secure; 
SameSite=None

【问题讨论】:

  • 问题可能与通过 HTTPS 而不是我目前使用的 HTTP 提供 cookie 相关。
  • 经过测试,发现它也适用于 HTTP。

标签: javascript node.js express cookies


【解决方案1】:

您可以在不使用任何节点包的情况下设置这些选项。仅使用 Express 像这样:

app.get('/', (req,res)=>{
    //.....Other Code
    res.cookie('cookieName', 'cookieValue', { sameSite: 'none', secure: true})
    //.....Other Code
})

【讨论】:

    【解决方案2】:

    文档链接:https://www.npmjs.com/package/express-session#cookiesamesite

    以下代码将解决您的问题。今后也建议这样做。

    const express = require('express');
    const session = require('express-session');
    const app = express();
    
    const sessionConfig = {
      secret: 'MYSECRET',
      name: 'appName',
      resave: false,
      saveUninitialized: false,
      store: store,
      cookie : {
        sameSite: 'strict', // THIS is the config you are looing for.
      }
    };
    
    if (process.env.NODE_ENV === 'production') {
      app.set('trust proxy', 1); // trust first proxy
      sessionConfig.cookie.secure = true; // serve secure cookies
    }
    
    app.use(session(sessionConfig));
    

    在您的情况下,将sameSite 设置为'none'

    如果您想知道store 是什么?我正在使用我的数据库作为所有 cookie 的存储。这与OP提出的问题无关。正如@klevis 在评论中指出的那样添加。代码如下:

    const KnexSessionStore = require('connect-session-knex')(session);
    const store = new KnexSessionStore({
      tablename: 'session',
      knex: kx,
      createtable: false
    });
    
    • 编辑 1:修复了 CaptainAdmin 指出的问题
    • 编辑 2:添加了商店定义。

    【讨论】:

    • 会话配置没有像sameSite这样的属性,它是用于cookie的
    • @CaptainZero 已修复相同的问题。感谢您指出。
    【解决方案3】:

    据我所知,这是对 chrome 未来新实现的警告

    cookie 上的samesite 选项:从 Chrome 80 开始,未指定 SameSite 属性的 cookie 将被视为 SameSite=Lax 的附加行为,它们仍将包含在 POST 请求中以简化现有的转换网站。

    任何进一步的信息:https://www.chromium.org/updates/same-site

    如果您想测试您的网页,本文将介绍如何设置 Chrome 标志以进行测试。如果您的页面停止工作,您必须检查所有请求并查看“http://”到“https://”更新或检查第三方 cookie

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 2021-01-11
      • 2020-12-16
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多