express-session的Cookie存储位置及自定义Session变量持久化疑问
我正在使用express-session存储用户会话相关数据(如登录状态、access_token),同时通过connect-session-sequelize创建会话存储,将Cookie相关信息保存到关联的数据库表中。但我有一个疑问:即便没有为会话表添加额外列来存储登录状态、令牌这类额外数据,这些数据在重启Express服务器后仍能保留。
我的会话配置代码如下:
app.use( session( { secret: SESSION_KEY, resave: false, saveUninitialized: false, store: new sequelizeStore( { db: db.sequelize, table: 'sessions' } ), cookie: { secure: true, maxAge: 600000 } } ) );
注意这里我保留了默认表结构,未做扩展,因此该表仅包含sid、expires和data字段,会话生成时这些字段会被自动填充。
/auth端点的处理代码:
app.get( '/auth', async ( req, res ) => { if ( !req.session.loggedIn ) { // 此处完成登录逻辑并获取Oauth2令牌 req.session.loggedIn = true; req.session.access_token = access_token; req.session.save(); res.redirect( `https://localhost/servers` ); } else { res.redirect( `https://localhost/servers` ); } } );
访问/auth端点时,会检查会话是否已登录;若未登录则完成登录并设置会话变量,否则直接重定向到服务器页面。loggedIn这类会话变量并未存入数据库表的额外列中,但登录后重启Express服务器,这些变量依然能保留。这是为什么?会话是否存储在其他位置?另外,express-session的Cookie存储在哪里?
1. 自定义会话变量重启后保留的原因
你添加的loggedIn、access_token这类会话变量,实际上是被自动序列化后存储在会话表的data字段里,不需要单独创建列。connect-session-sequelize会把req.session对象中的所有数据序列化为JSON格式,存入data字段。当服务器重启后,用户发起请求时,中间件会通过Cookie中的sid(会话ID)从数据库读取对应的data内容,反序列化后重新挂载到req.session上,所以你能获取到之前设置的变量。
你可以直接查看数据库sessions表的data字段,里面会包含你设置的loggedIn和access_token的键值对。
2. 会话是否存储在其他位置
你已经配置了connect-session-sequelize作为会话存储,所以所有会话数据都只存在你指定的数据库sessions表中。如果没有配置自定义存储,express-session默认会把会话存在服务器内存里,但你这里已经替换成了数据库存储,不存在其他存储位置。
3. express-session的Cookie存储位置
Cookie是存储在用户的浏览器中的。express-session会在用户首次创建会话时,向浏览器发送一个包含sid的Cookie。之后用户每次发起请求,都会自动带上这个Cookie,服务器通过sid去数据库查找对应的会话数据。你配置的cookie选项(如secure、maxAge)是用来设置这个浏览器Cookie的属性(比如是否仅HTTPS传输、过期时间)。
内容的提问来源于stack exchange,提问作者Adrian Wheeler

