Session 允许用户永久登录-不同的实现方法

Session 允许用户永久登录-不同的实现方法,session,cookies,Session,Cookies,我正在开发一个应用程序,我想为用户提供一个永远保持登录的可能性。如果他选中一个复选框,他的会话将永远不会结束,除非他手动注销或删除cookie。如果他没有,他的会话cookie将在关闭浏览器时过期 我考虑了三种方法来实现这一点,但它们都有利弊: 使用用户名和哈希密码保存cookie: Pro:用户可以在不同的设备上有多个活动会话 缺点:如果cookie被第三方泄露,他们可以随时重新生成他的会话,除非他更改密码 生成将存储在数据库和用户cookie中的令牌。然后比较它们: 赞成:一旦用户注

我正在开发一个应用程序,我想为用户提供一个永远保持登录的可能性。如果他选中一个复选框,他的会话将永远不会结束,除非他手动注销或删除cookie。如果他没有,他的会话cookie将在关闭浏览器时过期

我考虑了三种方法来实现这一点,但它们都有利弊:

  • 使用用户名和哈希密码保存cookie
    • Pro:用户可以在不同的设备上有多个活动会话
    • 缺点:如果cookie被第三方泄露,他们可以随时重新生成他的会话,除非他更改密码
  • 生成将存储在数据库和用户cookie中的令牌。然后比较它们
    • 赞成:一旦用户注销,令牌将被随机分配,他的所有会话都将被销毁。他肯定会被开除的
    • 缺点:用户只能使用一台设备永久登录。一旦他从另一台设备登录并接受永久登录,他的另一个令牌将被覆盖
  • 仅假设:将会话永久保存在服务器上,并将不过期的cookie提供给用户。
    • 缺点:这可能是不现实的,因为您无法以有效的方式存储那么多数据
我现在更喜欢第二种方式,因为它不像第一种方式那样不安全,而且很容易实现。但我仍然不相信这一点,而且我已经看到有一些经过验证的框架以另一种方式实现了这一点


你能想象另一种可能更好的方式吗?你最喜欢什么?为什么?

永远不要将密码保存在cookie中。第二种方法很好,我想你会发现大多数应用程序都实现了这一功能。请注意,会话存储不需要是数据库。cookie包含一些唯一的(不可用的!)id,这个id指向一些唯一的存储。它可以是某个目录中的文本文件、数据库行、memcached中的JSON字符串,等等

赞成:一旦用户注销,令牌将随机化并 他的所有课程都将被销毁。他肯定会被记录在案 的

缺点:用户只能使用一台设备永久登录。一旦 他从另一台设备登录,接受永远登录, 他的另一个标记将被覆盖

不要将令牌id作为列存储在用户表中。而是创建一个新的交叉表,允许每个用户有多个会话。因此,每个设备将有自己的单独令牌,因此,它自己的单独会话可以单独管理


当用户注销时,您只销毁该cookie及其关联的会话存储。用户拥有的任何其他未完成会话将保持不变。

为每个用户创建多个令牌似乎是一个非常好的主意!非常感谢。这解决了无意中覆盖“唯一令牌”的问题。我在脑海中反复思考了这个问题,我遇到了以下问题:如果有用户总是永远登录,但在没有登录的情况下删除了所有cookie,那么他们会对数据库发送垃圾邮件。有没有更好的方法来防止出现这种情况,而不是在超过X个会话时立即删除旧会话?顺便说一句——我的第一个建议并不是要将用户密码保存在cookie中:我会保存一个哈希和盐渍表示法。每次访问会话存储时,我都会在其上触摸时间戳,然后编写一个cron脚本(或将其作为垃圾收集构建到应用程序中),删除X天内未访问的所有会话。所以,如果你保持活跃状态,就只能无限期登录。是的,我了解散列。它是否被散列并不重要。如果你的应用程序允许基于已经散列的密码进行访问,那么给出散列的密码和给出明文密码没有什么不同。啊,现在我明白你的意思了。同意,没错。我只是偶然发现了,因为我想是这样的IIRC。基于时间戳的解决方案似乎很实用,但它可能会让用户感到困惑,因为如果它说永远,他希望永远。相反,每个人每隔一段时间都会删除他的cookies,而不去想它,所以我承认这仍然是最好的解决方案。:-)非常感谢您提出的宝贵建议!呵呵,除非您愿意让会话存储无限增长,否则您真的没有选择的余地。:)