【问题标题】:What is the best practice way to manage user session cookie expiration?管理用户会话 cookie 过期的最佳实践方法是什么?
【发布时间】:2021-12-04 17:47:09
【问题描述】:

我使用express-sessionconnect-redisioredis 来存储会话,并且用户将redis 密钥存储在浏览器cookie 中。 每次与服务器交互时,connect-redis 都会重置 TTL,这意味着现在使用默认设置,内存中的会话将在用户与网站交互时的某个时间点超过浏览器 cookie。我想保持用户会话处于活动状态,而不是向用户显示一个弹出窗口,指定他们应该重新进行身份验证或者他们将很快注销或类似的东西。 YouTube 和 Facebook 等大型网站如何保持用户会话活跃?我认为多年来我从未经历过突然需要在 youtube 上重新进行身份验证。所以我的问题是如何处理 cookie 会话到期日期,强调良好的用户体验,而不是牺牲安全性?

我目前的想法是简单地检查何时有一定的时间等于 cookie 过期之前的剩余时间,如果结果是真的并且用户刚刚与网站进行了交互,则重置 maxAge cookie 上的属性。这样,如果用户不打算与网站交互超过一定的时间,比如 3 个月,而 cookie 到期前的时间正好是 3 个月,那么用户将在下一次登出用户在这 3 个月后访问该网站的时间。换句话说,只要用户在不到 3 个月的时间间隔内继续在网站上做某事,那么他们将始终保持登录和身份验证。你怎么看?我也可以将rolling property 设置为true,但由于性能原因,我不想在每个经过身份验证的请求中发送会话cookie。此外,由于我将 httpOnly 设置为 true,因此我无法写入 cookie 以尝试使用客户端 Javascript 增加其到期日期。

【问题讨论】:

    标签: express authentication redis session-cookies express-session


    【解决方案1】:

    说实话,这要容易得多。想象一下,您在登录时记得我,如果未切换,您会将 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
    }));

    【讨论】:

    • 我认为您在这里真正想要的修复是 disableTouch: 是的,默认情况下它是禁用的,这会在每次会话行为与任何人想要的相反时重置 TTL。
    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2016-10-23
    • 2018-07-20
    • 1970-01-01
    • 2014-01-24
    • 2011-12-12
    相关资源
    最近更新 更多