何时使会话无效

时间:2017-03-08 16:39:06

标签: http session cookies session-cookies

这是有关网络会话管理的一般问题。 管理会话超时的最佳实践方法是什么?

假设用户登录系统,在服务器上创建会话,并将令牌标识符发送回客户端(通过httpOnly cookie)。

如果用户尝试对会话进行验证的某些基于访问的检查,则可能更新数据库中会话的到期时间是有意义的。这是否也意味着当发生这种情况时,我们应该更新会话令牌cookie上的到期时间以匹配?

这对我来说似乎是最明显的解决方案,但不断重写cookie似乎需要很多开销。

非常感谢对最佳实践方法的任何见解。谢谢!

1 个答案:

答案 0 :(得分:1)

如何管理会话超时以保持用户登录,防止他/她意外退出?

要保持用户登录,不必经常重写cookie。您需要做的就是使会话令牌cookie的到期时间为Session,然后只要浏览器处于打开状态(客户端继续使用您的站点),会话令牌cookie就有效。服务器不需要知道会话到期时间(因为没有预先定义的会话过期时间),更不用说将其存储在DB中。用户关闭浏览器后,会话令牌cookie被清除,会话终止(无效)。

通常,服务器中会出现“会话超时”设置,例如Struts2中的session-timeout,如果客户端在一段时间后没有发出任何请求,则会终止会话。

即使用户关闭浏览器,如何使会话“验证”?也就是说,如何实现“记住我1周”功能?

要实现此功能,请使用新的令牌Cookie(例如RememberMeToken)。当用户成功登录(可能在UI上启用“记住我”复选框)时,服务器将生成一个唯一的随机令牌并将其存储在DB中(连同其过期时间以确保安全性),使其属于用户帐户。此RememberMeToken Cookie的到期时间相当长(例如1周),并将与登录响应一起发送回浏览器。

当用户关闭浏览器并稍后重新访问该站点(或者用户长时间处于非活动状态并且会话在服务器端被终止)时,服务器会检查会话令牌cookie并发现它丢失/无效。此时,将检查RememberMeToken并与存储在DB中的令牌进行比较,如果匹配,服务器将对相应的用户进行自动登录操作,并将生成的会话令牌cookie返回给浏览器。这一切都发生在后端,客户端用户不会有任何感觉。

自用户启用UI和登录后的“记住我”复选框1周后,RememberMeToken cookie已过期,如果用户打开浏览器并访问该网站,则需要再次登录。