如何从客户端访问cookie会话?

时间:2017-10-21 00:58:46

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

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

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

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

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

2 个答案:

答案 0 :(得分:13)

所以我们假设你已经配置了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中解析值或仅检查其存在。如果你需要解析它,那么你需要base64解码相关的cookie值,然后JSON解码它。

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

答案 1 :(得分:-1)

会话是服务器的事情,你不能在客户端访问它,如果你的意思是cookie,那么,cookie不包含任何关于会话但指向它的ID。如果要从客户端的会话中获取信息,则必须创建请求,服务器才会发回会话信息。