如何从客户端访问 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 的安全。
我正在使用 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 的安全。