express+cookie_parser:签名机制深入剖析

发布于 2025-01-19 06:46:12 字数 1995 浏览 2 评论 0

本文先简单介绍 session 跟 cookie 的区别与联系,接着深入剖析 express-session 中间件的实现。关于 express-session 的基础使用,可参见笔者前面的文章。

session vs cookie vs 登录态

HTTP 是无状态的,也就是说,同个用户,多次访问同一个网站,网站无法区分前后访问的是否同个用户。cookie 跟 session 的出现很好的解决了这个问题。

抛开两者的学术定义,从应用的角度来讲,session 跟 cookie 就是一对好基友,可以用来实现用户的身份识别。

session 是保存在服务端的小段数据,cookie 是保存在用户本地的小段数据,它们一般是一一对应的。

上面的解释比较抽象,先举两个常见的例子: 用户登录登录态检验

用户登录

  1. 张三:在网站输入用户名(zhang)、密码,点击“登录”。
  2. 浏览器:向服务端发送登录请求。
  3. 服务端:收到登录请求,对 用户名、密码 进行校验,且校验通过。
  4. 服务端:把张三的用户名 zhang 写到本地文件 session.txt。(session)
  5. 服务端:请求成功返回,附带 Set-Cookie:uid=zhang 首部。
  6. 浏览器:收到服务端返回,检测到 Set-Cookie 首部,将 cookie( uid=zhang ) 保存到本地。(cookie)

登录态检验

张三再次访问网站:

  1. 张三:访问网站的个人主页。
  2. 浏览器:向服务端发送访问请求(带上之前的 cookie)。
  3. 服务端:解析 cookie,找到 uid=zhang
  4. 服务端:查找本地 session.txt,发现 uid=zhang 这条记录,判断用户已登录。
  5. 服务端:返回个人主页。

express-session 实现原理

关键配置如下。其中, saveUninitialized 若为 true ,对状态为“未初始化”的会话,服务端会自动为该会话创建 session id,并保存到本地。

对于需要实现登录功能的站点,需要将 saveUninitialized 设置为 false

app.use(session({
    name: identityKey,
    secret: 'chyingp',  // 用来对 session id 相关的 cookie 进行签名
    store: new FileStore(),  // 本地存储 session(文本文件,也可以选择其他 store,比如 redis 的)
    saveUninitialized: false,  // 是否自动保存未初始化的会话,建议 false
    resave: false,  // 是否每次都重新保存会话,建议 false
    cookie: {
        maxAge: 10 * 1000  // 有效期,单位是毫秒
    }
}));

从请求的生命周期来看下 express-session 是怎么发挥作用的。

首先,是一个“未初始化”的请求(比如第一次访问网站的用户)

app.use(session(/* 配置项 */));
app.use('/', function(req, res, next){
    res.end('ok');
});

关注点

  1. 防止 cookie 篡改
  2. 登录态超时机制
  3. 登录态主动失效机制

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

旧梦荧光笔

暂无简介

文章
评论
26 人气
更多

推荐作者

迎风吟唱

文章 0 评论 0

qq_hXErI

文章 0 评论 0

茶底世界

文章 0 评论 0

捎一片雪花

文章 0 评论 0

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文