为啥不使用长寿命会话 ID 来代替带有令牌的持久 cookie?

Posted

技术标签:

【中文标题】为啥不使用长寿命会话 ID 来代替带有令牌的持久 cookie?【英文标题】:Why not use a long life session ID for auto-login instead of a persistent cookie with a token?为什么不使用长寿命会话 ID 来代替带有令牌的持久 cookie? 【发布时间】:2021-12-25 11:15:35 【问题描述】:

php 网站上声明“开发人员不得使用长寿命会话 ID 进行自动登录,因为这会增加会话被盗的风险。”。相反,建议使用安全的一次性哈希密钥作为使用setcookie() 的自动登录密钥 - 然后它将成为一个持久性 cookie。

但我无法理解这样更安全?

带有令牌的持久 cookie 也可能被盗,如果您确保您的网站永远不会仅使用 HTTP,而仅使用 HTTPS - 与 HSTS 一样,并且还阻止 javascript 访问 httponly,那么窃取会话 ID 也非常困难。 .

我在这里错过了什么?

【问题讨论】:

这听起来更适合Information Security 【参考方案1】:

我猜他们是什么意思。我相信当他们说“安全的一次性哈希密钥”时,他们的真正意思是某种HOTP mechanism。然后我有更多的猜测他们想用它实现什么。他们希望能够在超时时终止会话,但他们也希望客户端能够通过简单地调用其内部 HOTP 机制并生成下一个令牌并最终将其传递给服务器来自动重新创建会话。

这里有很多猜测,但老实说,说“安全的一次性哈希密钥”并不意味着什么,这样的表达真的很模糊。

【讨论】:

【参考方案2】:

我想我自己已经找到了正确的答案。

会话 cookie 用于保持请求之间的状态。它可用于在打开的浏览器会话期间跟踪登录,但应在用户注销或关闭浏览器时结束会话。持久性 cookie 中的“记住我”令牌用于保持请求之间的状态,它仅用于“跳过”登录过程并允许访问需要登录的特定页面。当您使用 $_SESSION 时,您正在处理会话 cookie,只有会话 ID 存储在浏览器或客户端中,并且您放入 $_SESSION 数组的所有值都存储在服务器上的文件中(默认情况下),其中包含纯文本中的值。

“记住我”的持久 cookie 不用于类似的事情,它仅在浏览器中保留一个哈希令牌,以便识别用户并避免每次访问网站时都必须登录。

换句话说,会话 cookie 和持久性“记住我”cookie 是针对两个不同问题的两种不同解决方案。

您可以使用“记住我”cookie“保持状态”,但这不是它的用途,也不会为您提供会话。您可以使用会话 cookie 来实现“记住我”功能,但这不是它的用途,它用于在服务器上存储状态变量并在会话中保持状态。

但是,如果您为 cookie 实施适当的安全功能,即仅在 HTTPS 上提供服务并使用 securehttponly,那么它们在窃取 cookie 或会话 ID 的风险方面同样安全。

【讨论】:

以上是关于为啥不使用长寿命会话 ID 来代替带有令牌的持久 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

更新长寿命访问令牌服务器端

刷新令牌如何比长寿命的 JWT 更安全?

Oauth2 - 客户端凭证流中的长寿命令牌与重新身份验证

google oauth refresh token 长寿命解决方案

使用用户 ID 代替电子邮件发送密码恢复令牌是不是安全?

带有存储在 cookie 中的刷新令牌的 SPA - 如何使用 IdentityServer4 进行配置?