管理用户会话cookie过期的最佳实践方法是什么?



我使用express-session, connect-redis和ioredis来存储会话,用户将有redis密钥存储在浏览器cookie中。connect-redis每次与服务器交互时都会重置TTL,这意味着现在使用默认设置,当用户与网站交互时,内存会话将比浏览器cookie更长寿。我想保持用户会话存活,而不是向用户显示一个弹出窗口,指定他们应该重新认证,或者他们将很快注销或类似的东西。像YouTube和Facebook这样的大型网站是如何保持用户留存的?我想我已经很多年没有经历过突然需要在youtube上重新认证了。所以我的问题是,如何处理cookie会话过期日期,以强调良好的用户体验,而不牺牲安全性?

我目前的想法是简单地检查当有一定数量的时间等于cookie过期前剩下的时间,如果结果是真的,用户刚刚与网站进行了交互,重置cookie上的maxAge属性。这样,如果用户在超过一定的时间(比如3个月)内不打算与网站互动,而cookie过期前的时间正好是3个月,那么用户将在这3个月后再次访问该网站时被注销。换句话说,只要用户在不到3个月的时间间隔内继续在网站上做一些事情,那么他们将始终登录并进行身份验证。你觉得怎么样?我也可以将rolling属性设置为true,但是由于性能原因,我不想为每个经过身份验证的请求发送会话cookie。另外,由于我将httpOnly设置为true,因此我无法通过客户端Javascript向cookie写入试图增加其过期日期的内容。

说实话,这要简单得多。想象一下,当你登录时,你有一个记住我,如果这是未切换的,你将TTL更改为创建会话时的一天或几个小时,或者你使用默认设置的TTL。

您肯定希望会话强制过期,所以这些密钥一直在变化,使任何劫持不太可能发生。

下面是我如何设置我的redisStore,我缺乏两个设备之间的同步,想要一个单一的帐户会话,但这是另一个话题。

WEBAPP.use(SESSION({
name: "WebSiteNameOrCookieName",
store: new redisStore({
client: client,
ttl: 604800,
disableTouch: true
}),
secret: "your_secret_key_make_it_hard_as_hell",
cookie: {
domain: ".example.com",
sameSite: 'strict',
secure: true
},
saveUninitialized: false,
resave: false
}));

相关内容

最新更新