这是关于网络 session 管理的一般性问题。 管理 session 超时的最佳实践方法是什么?
假设一个用户登录的系统,在服务器上创建一个 session ,并将 token 标识符发送回客户端(通过 httpOnly
cookie)。
如果用户尝试在验证 session 的地方进行一些基于访问的检查,那么在数据库中更新 session 的到期时间大概是有意义的。这是否也意味着当发生这种情况时,我们应该更新 session token cookie 上的到期时间以匹配?
这对我来说似乎是最明显的解决方案,但不断重写 cookie 似乎开销很大。
非常感谢对最佳实践方法的任何见解。谢谢!
最佳答案
如何管理 session 超时以保持用户登录状态,防止他/她意外退出?
为了让用户保持登录状态,没有必要经常重写 cookie。您需要做的就是使 session token cookie 的过期时间为 Session
,然后只要浏览器打开(客户端继续使用您的站点), session token cookie 就有效。服务器不需要知道 session 过期时间(因为不再有预定义的 session 过期时间),更不用说将它存储在数据库中了。用户关闭浏览器后, session token cookie 被清除, session 终止(无效)。
一般情况下,服务器端会有一个“session timeout”的设置,比如Struts2中的session-timeout
,如果客户端在一段时间后没有发出任何请求,就会终止 session 。
即使用户关闭浏览器,如何使 session “生效”?即如何实现“记住我1周”功能?
为实现此功能,使用了一个新的 token cookie(例如 RememberMeToken
)。当用户登录成功时(可能启用 UI 上的“记住我”复选框),服务器将生成一个唯一的随机 token 并将其存储在数据库中(出于安全原因连同其过期时间),使其属于用户帐户。此 RememberMeToken
cookie 的过期时间很长(例如 1 周),并将与登录响应一起发送回浏览器。
当用户关闭浏览器并稍后重新访问该站点(或者用户长时间不活动并且 session 在服务器端被终止)时,服务器检查 session token cookie 并发现它丢失/无效。此时,RememberMeToken
会检查并与数据库中存储的token进行比较,如果匹配,服务器会对相应的用户进行自动登录操作,并将生成的session token cookie返回给浏览器。这一切都发生在后端,客户端用户不会有任何感觉。
用户在 UI 上启用“记住我”复选框并登录 1 周后,RememberMeToken
cookie 已过期,如果用户打开浏览器并访问该站点,则需要重新登录。
关于http - 何时使 session 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42676948/