【问题标题】:How can I access cookie-session from client side?如何从客户端访问 cookie-session?
【发布时间】:2018-04-02 05:10:33
【问题描述】:

我正在使用 NodeJS 构建一个应用程序单页面,并希望使用我的 cookie 会话(cookie-session npm)来验证用户是否已登录。从我的节点服务器端,我可以获取和设置会话 cookie,但我不知道如何从我的客户端获取。

这是我从服务器端设置的方式:

req.session.user_id = user[0]._id;

user[0]._id 是我从 mongodb 获得的用户 ID。

【问题讨论】:

    标签: node.js session-cookies client-side


    【解决方案1】:

    假设你已经配置了cookie-session 类似这样的东西:

    var cookieSession = require('cookie-session');
    
    app.use(cookieSession({
        keys: ['secret']
    }));
    

    那么让我们在会话中存储一些数据:

    req.session.user_id = 123;
    

    如果您查看浏览器的开发工具,您会看到 2 个 cookie 集:

    express:sess = eyJ1c2VyX2lkIjoxMjN9
    express:sess.sig = 01I_Rx2gACezZI1tdl2-NvxPq6w
    

    cookie express:sess 是 base64 编码的。如果我们解码它,我们会得到{"user_id":123}。重要的是要认识到会话数据存储在 cookie 本身中 - 这不仅仅是会话的 id。

    另一个 cookie express:sess.sig 是签名。此签名使用密钥(本例中为secret)生成,用于帮助防止篡改。任何人都可以轻松修改express:sess,但除非他们也可以生成相应的express:sess.sig,否则服务器会知道它已被更改。

    说了这么多,我建议你看看express-session 中间件。这也使用了 cookie,但它只使用它们来存储会话 ID。 cookie 中不存储任何数据,所有数据都存储在服务器上。这更类似于大多数其他 Web 框架中会话的工作方式,但我不能确定哪种方法最适合您的需求。

    无论您使用哪种方法,cookie 默认设置为httponly。您将能够在浏览器的开发工具中验证这一点。这意味着它包含在 HTTP 请求中,但无法通过客户端 JavaScript 访问。这是一种安全措施,旨在使恶意代码更难以窃取 cookie。您可以在cookie-session 中使用以下方法禁用此安全功能:

    app.use(cookieSession({
        httpOnly: false,
        keys: ['secret']
    }));
    

    然后您就可以使用 document.cookie 访问这些 cookie。

    我重申这是一项安全措施,不建议将其关闭。我无法判断这是否是您的申请中真正存在的问题。

    从您的问题中不清楚您是真的想从 cookie 中解析值还是只是检查它的存在。如果需要解析,则需要对相关的 cookie 值进行 base64 解码,然后进行 JSON 解码。

    您可以采用多种替代方法来保留 cookie httponly。如果不知道您将如何处理这些信息,就很难具体说明。如果您使用的是 Express 视图(即模板渲染),那么您可以在模板中完成所有工作。如果您在 SPA 领域,那么您可以使用 AJAX 请求来收集相关信息。在紧要关头,您甚至可以使用另一个 cookie 为您提供所需的信息,同时保证会话 cookie 的安全。

    【讨论】:

    • 因此,要从客户端编辑 cookie,您需要解码 (atob) cookie,编辑该数据,然后将其重新编码为 base64 (btoa),但是必须以某种方式生成正确的签名 - 这不是一个真正的选择?
    • 精湛的解释@skirtle。 [点赞]
    【解决方案2】:

    会话是一个服务器的东西,你不能在客户端访问它,如果你的意思是 cookie,那么,cookie 不包含任何关于会话的内容,而是一个指向它的 ID。如果你想在客户端从会话中获取信息,你必须创建一个请求,服务器将会话信息发回。

    【讨论】:

    • 他在谈论 cookie-session 包,该包解密/加密会话数据并将这些内容存储在客户端设备上
    • 他在说cookie-session,你在解释通用会话和通用cookie
    猜你喜欢
    • 2014-05-10
    • 2021-02-04
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多