如何从客户端访问 cookie-session?

How can I access cookie-session from client side?

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

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

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

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

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

因此,假设您已配置 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 的安全。