Node.js 中 Cookie 与 Session 原理及实战配置详解

作者:栖木

时间:2026-10-22

浏览:296

本文深入解析 Node.js 中 Cookie 与 Session 的工作原理及区别。详细讲解 Session 的创建流程、持久化存储方案,并基于 client-sessions 模块展示完整的配置代码。重点阐述如何通过中间件实现全局会话验证、登出重置及安全性设置(httpOnly、secure),最后对比两者在安全性、性能与时效性上的差异,提供完整的登录安全建议。

文章目录

Cookie 的基本原理与限制

Cookie 的基本原理与限制

一 Cookie

由于 HTTP 协议本身是无状态的,但在实际应用中往往需要保持用户状态,例如判断用户是否已登录。为了解决这一问题,Cookie 应运而生,它允许在浏览器端保存用户数据,具有以下特点:

1. 仅存在于客户端浏览器中;

2. 用于记录信息,大小限制为最大 4K 字节;

3. 一旦启用 Cookie,对该域名的任何访问请求都会自动携带 Cookie 数据;

目前新型网站更多采用浏览器缓存,Cookie 存在一些问题,例如每次向服务器提交请求时都会附带 Cookie,无论请求的是否为静态图片资源。

Cookie 示例:

Cookie 的基本原理与限制

Session 的创建流程与存储策略

二 Session

Session 类似于服务器端的 Cookie,数据保存在服务器端,可视为服务器缓存。用户登录后需要进行身份验证,此时可通过 Session 进行验证,Session 与 Cookie 之间存在一一对应关系。

Session 的创建顺序如下:

生成全局唯一标识符(sessionid);

开辟数据存储空间。通常在内存中创建相应的数据结构,但这种方式下,一旦系统掉电,所有会话数据将丢失,对于电子商务网站而言,这种事故后果严重。因此,也可以将数据写入文件或存储在数据库中,虽然这会增加 I/O 开销,但 Session 可以实现某种程度的持久化,且更有利于 Session 的共享;

将 Session 的全局唯一标识符发送给客户端。

问题的关键在于服务端如何发送这个 Session 的唯一标识。结合 HTTP 协议,数据可以放置在请求行、头域或 Body 中,基于此,通常有两种常用方式:Cookie 和 URL 重写。

Set-Cookie 机制解析

三 Set-Cookie

Cookie 是如何被设置的呢?由服务器返回的请求设置。

Cookie 的基本原理与限制

服务器会返回一个 set-cookie 的消息,通知浏览器要设置 Cookie 了,于是浏览器会根据 set-cookie 里的字段来设置信息,例如上图的信息就会设置 session=r@rdegges.com

Node.js 中 Session 的实战配置

四 实战

我们以client-session(express-session基本完全一样)为例,为项目配置 Session

1 安装模块


var session = require('client-sessions');

2 配置 Session


app.use(session({
 cookieName: 'session',
 secret: 'random_string_goes_here',
 duration: 30 * 60 * 1000,
 activeDuration: 5 * 60 * 1000,
}));

1)secret:一个随机字符串,因为客户端的数据都是不安全的,所以需要进行加密

2) duration:Session 的过期时间,过期了就必须重新设置

3) activeDuration: 激活时间,例如设置为 30 分钟,那么只要 30 分钟内用户有服务器的交互,那么就会被重新激活。

五 在 Session 中保存用户信息


app.post('/login', function(req, res) {
 User.findOne({ email: req.body.email }, function(err, user) {
  if (!user) {
   res.render('login.jade', { error: 'Invalid email or password.' });
  } else {
   if (req.body.password === user.password) {
    
    // sets a cookie with the user's info
    req.session.user = user;
    // 这里貌似有误,只是set了session,返回这个sessionid,但但数据并不会set到这个cookie里头
    
    res.redirect('/dashboard');
   } else {
    res.render('login.jade', { error: 'Invalid email or password.' });
   }
  }
 });
});

Session 中间件与全局验证

六 Session 层中间件

我们当然不希望每个请求都加上这一段,所以我们使用 express 来做全局配置


app.use(function(req, res, next) {
 if (req.session && req.session.user) {
  User.findOne({ email: req.session.user.email }, function(err, user) {
   if (user) {
    req.user = user;
    delete req.user.password; // delete the password from the session
    req.session.user = user; //refresh the session value
    res.locals.user = user;
   }
   // finishing processing the middleware and run the route
   next();
  });
 } else {
  next();
 }
});

如果用户逻辑在没有登陆时必须登陆,那我们可以继续加一个路由


function requireLogin (req, res, next) {
 if (!req.user) {
  res.redirect('/login');
 } else {
  next();
 }
};
app.get('/dashboard', requireLogin, function(req, res) {
 res.render('dashboard.jade');
});

Session 安全性设置与登出处理

七 安全性

1 我们可以在登出时重置 Session


app.get('/logout', function(req, res) {
 req.session.reset();
 res.redirect('/');
});

还可以加一些安全性

httpOnly:用来保证 Cookie 只能通过 http 访问,而不能用 js 来读取

secure:强制使用 https

ephemeral:关闭浏览器时同时关闭 Cookie

Cookie 与 Session 的多维度对比

八 总结

Cookie 和 Session 由于实现手段不同,因此也各有优缺点和各自的应用场景:

  1. 应用场景

Cookie 的典型应用场景是 Remember Me 服务,即用户的账户信息通过 Cookie 的形式保存在客户端,当用户再次请求匹配的 URL 的时候,账户信息会被传送到服务端,交由相应的程序完成自动登录等功能。当然也可以保存一些客户端信息,例如页面布局以及搜索历史等等。 Session 的典型应用场景是用户登录某网站之后,将其登录信息放入 Session,在以后的每次请求中查询相应的登录信息以确保该用户合法。当然还是有购物车等等经典场景;

  1. 安全性

Cookie 将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差,一般情况下敏感信息是经过加密后存储在 Cookie 中,但很容易就会被窃取。而 Session 只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比 Cookie 小了太多。

Session 安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,这在下文会进行更详细的说明。总体来讲,Session 的安全性要高于 Cookie;

  1. 性能

Cookie 存储在客户端,消耗的是客户端的 I/O 和内存,而 Session 存储在服务端,消耗的是服务端的资源。但是 Session 对服务器造成的压力比较集中,而 Cookie 很好地分散了资源消耗,就这点来说,Cookie 是要优于 Session 的;

  1. 时效性

Cookie 可以通过设置有效期使其较长时间内存在于客户端,而 Session 一般只有比较短的有效期(用户主动销毁 Session 或关闭浏览器后引发超时);

  1. 其他

Cookie 的处理在开发中没有 Session 方便。而且 Cookie 在客户端是有数量和大小的限制的,而 Session 的大小却只以硬件为限制,能存储的数据无疑大了太多。

完整登录流程的安全建议

继续补充下,关于如何做一个完整的登陆

1 用户端

一般来说应该使用 https,而且密码绝不能在网络中明文传输,因此在往服务器传输时就应该先加密,常见的 md5,但 md5 被破解,因此可以用 SHA512 来加密 SHA256(password)

2 服务端

服务端需要对密码再进行加密,因为所有客户端的东西都是不安全的,万一你的网络被监听了呢,因此会进行 SHA512(username+SHA512(password)+sault) 的加密,这里的 sault 为随机数,防止被脱库了后被猜出密码,所以需要附加一个随机数,这个 sault 最好是存放到另外的数据库中,防止因为存到一个库中被脱库中猜出

总结

以上所述是小编给大家介绍的 Nodejs 和 Session 原理及实战技巧小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章