【问题标题】:Angular NodeJS cookie credentials. Why use client cookie?Angular NodeJS cookie 凭据。为什么要使用客户端 cookie?
【发布时间】:2021-05-19 04:35:03
【问题描述】:

我正在努力详细了解 cookie 凭据。 主要问题是我的前端和后端在不同的域上运行。在 localhost 上,它们具有不同的端口(localhost:4200 和 localhost:3000),在我的服务器上具有不同的子域(example.com 和 api.example.com)。

基本设置:

Angular 发送帖子请求以登录:

this.http.post(environment.apiUrl + 'users', credentials)

NodeJS 验证请求并创建一个快速会话(数据库中的会话和带有 sessionId 的 cookie):

app.use(session({
    secret: process.env.SECRET,
    saveUninitialized: false,
    store: mongoDBStore,
    name: 'node_session',
    cookie: {
        secure: true,
        httpOnly: true,
        maxAge: 5 * 60 * 1000
    }
}));

app.post('/', (req, res) => {
    // some validations
    req.session.userId = result._id;
    res.send(result._id);
}

我的理解

据我了解,cookie 是为服务器域存储的。因此,如果两者都在同一个域上运行,则在每个请求上,后端都可以使用会话 cookie。但是对于不同的域,会话在进一步请求时为空。

另外,我在前端和后端找到了 cookie node_session。因此,如果我将 { withCredentials: true } 添加到 Angular 的请求中,一切正常。但在这种情况下,我使用前端的 cookie。

我的问题:

使用前端 cookie 是否安全?

为什么前端和后端都能找到会话cookie?

为什么我的后端找不到会话 cookie?

【问题讨论】:

    标签: node.js angular cookies express-session


    【解决方案1】:

    会话信息存储在后端。前端只是将 uniq 会话标识符存储在 cookie 中。如果您想以某种方式了解请求来自同一用户,则其中一个选项是使用{withCredentials: true},没有它,cookie 就不会保存到客户端,并且后端无法定义不同的查询是由一个客户端发送还是不是。

    作为 cookie 的替代方案,有一个使用授权令牌的流行选项,但设置起来有点困难

    【讨论】:

    • 您好,谢谢您的回答。所以这意味着没有 {withcredentials:true} 它不能工作,除非前端和后端在同一个域上运行?
    • 它可以工作,但您需要定义哪个客户端执行查询。发送 cookie 是最简单的方法,但您也可以在标题中发送此信息。流行的方式是在每个请求中发送Autorization: Bearer token 标头
    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2020-01-20
    • 2020-10-21
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多