在为网站实现“记住我”功能的同时,为什么我们会让事情变得复杂,并且除了会话令牌之外还有一个名为mem me token的令牌。
据我所知,记住我可以使用令牌登录并创建新的会话令牌,而会话令牌只持续几分钟或直到用户关闭浏览器。 为什么我们不能将会话令牌本身的到期持续时间增加到我们希望用户登录的所需时间?
我需要在运行tomcat的基于flex的应用程序中实现这样的功能,我想知道需要记住我的令牌
此外,是否有可能在tomcat中开箱即用?
答案 0 :(得分:12)
1)会话通常包含除用户登录名之外的一大堆数据。因此,如果您只是将过期日期设置为几周或几个月,就像记住我的令牌一样,那么由于成千上万的重量级会话对象,您可能会在服务器上遇到性能问题。
2)记住令牌是客户端,而不是服务器端。这将所有存储要求放在用户的浏览器上,这对于登录名等简单数据来说是更好的解决方案。如果您依赖于链接到服务器上的内存中对象的会话ID,那么每次重新启动服务器或服务器进程(例如,部署更新的应用程序)时,所有这些会话对象都将丢失。
答案 1 :(得分:3)
因为根据定义,一旦用户关闭他或她的浏览器,会话就会结束。因此,只要浏览器关闭,会话cookie就会过期。
由于remember-me功能的目的是让用户跨会话登录,因此存储在remember-me cookie中的信息必须在浏览器重新启动时保持不变。
要“开箱即用”获得此功能,请查看使用框架like Spring Security。
答案 2 :(得分:1)
记住我的cookie通常会存储用户名和某种令牌。它们都用于验证用户身份。看看Improved Persistent Login Cookie Best Practice,它描述了这个过程非常好。
会话cookie用于在客户端上存储会话ID,允许服务器识别会话并加载与会话关联的会话数据。
因此,记住我的cookie比会话cookie有更长的使用寿命(通常是几天或几周)。会话cookie通常会在几分钟后或浏览器关闭时过期。
从我的头脑中可以看出为什么使用两种不同的饼干有几个原因:
答案 3 :(得分:0)
人们已经正确地说会话包含了许多重量级的对象。如果您的系统上有足够多的用户,如果您尝试将它们全部保存在服务器所拥有的有限内存中,那么当内存最大时,您将崩溃服务器。
我曾经在一个项目上工作,生产代码更新有内存泄漏。这是一个J2EE项目(是J2EE而不是Java EE)。当用户登录以检查此电话公司的发票时,用户会话未从内存中正确释放(我不记得原因,但这肯定是问题)。这个错误模仿了你有意做的事情。
服务器一直崩溃。所以我们在其上放置了一个分析器。我们会看到内存使用量持续一整天,直到它在应用服务器崩溃后突然出现并缩短。我们添加了内存并增加了VM内存设置。我告诉他们这是一个内存泄漏,但因为我不是200美元/小时的“服务器专家”,人们不愿意相信它,因为那里的人仍然相信垃圾收集器都是强大而不是非常好。
两天后(它影响了“查看您的发票”系统,而不是主要业务系统,即它没有相同的工作负载或内存要求,即使服务器中有足够的硬件内存),他们雇用了一小时200美元/小时的顾问在一天后告诉他们应用程序有上述内存泄漏。它是固定的,一切都很好......减去顾问费。
在任何情况下,这都是以下内容:如果您在用户注销或关闭浏览器时没有结束用户会话(会话超时),则会面临最大化内存和服务器崩溃的风险。特别是如果您的网站或应用拥有大量用户。正如其他人所说,轻量级代币/饼干是最好的。
答案 4 :(得分:0)
为什么我们应该使用sessionId cookie以外的其他cookie来记住用户的原因不是因为会话应该快速到期,或者你将面临服务器上的性能问题。
Jetty(可能还有许多其他servlet容器)有一个功能,可以自动驱逐从内存到磁盘或数据库的空闲会话,IMHO排除了所有上述关于将重量级会话存储在内存中的性能问题的理由。
使用另一个cookie的原因是记住我即使在会话过期后也要记住用户。因此,如果用户的会话已过期,则另一个cookie用于对用户进行身份验证,而无需输入密码,这显然会降低网络钓鱼攻击的可能性。虽然它也有缺点,例如,如果某人获得了对您的笔记本电脑的访问权并窃取您的身份验证令牌,则可以冒充您,除非服务器采用更多安全措施将令牌绑定到您的客户端和位置。 / p>
简而言之,记住我是一种身份验证机制,而不是会话cookie的替代品。
我认为只要存储内存不足,就可以拥有长期会话到期日期。一旦它们到期,只需要输入密码。许多网站提供此功能为"记住我30天"这只是通过使用长期的sessionId cookie实现的,没有别的。