我正在尝试使用此处概述的系统实现“记住我”实用程序:改进的持久登录 cookie
但是,对我来说这里的逻辑存在问题,并且想知道是否有人可以为我解决这个问题。
给用户一个会话 ID。这是一个随机生成的字符串,并且在用户帐户的整个生命周期内都是持久的。
给用户一个令牌 ID。这是一个随机生成的字符串,每次用户成功登录时都会重新创建。
这两个值都作为签名 cookie 存储在用户机器和数据库中。
这个想法是,如果有人设法欺骗用户的令牌和系列并以用户身份登录,那么他们将生成一个新的令牌 ID。下次合法用户尝试登录时,他们将有一个匹配的系列但一个无效的令牌,从而通知系统发生了安全漏洞并且可以采取任何必要的措施(清除用户的令牌)。
这很棒。但是,当用户尝试从多个设备或浏览器使用我的应用程序时会发生什么?假设用户使用 Chrome 登录我的服务并检查记住我。下次他们通过 Firefox 登录并选择记住我时。将生成一个新令牌,以便用户下次尝试使用 Chrome 登录时会触发虚假盗窃 - 不是吗?
如果是这种情况,我怎样才能更可靠地实施这个解决方案?我很清楚基于 cookie 的授权本质上不太安全,并且不允许 cookie 授权用户执行任何破坏性操作,例如购买。