我目前正在为 Web 应用程序实现登录会话系统。我已经阅读了很多推荐非常低的会话和空闲超时的文章。例如OWASP说:
空闲超时值和绝对超时值都高度依赖于 Web 应用程序及其数据的重要性。高价值应用程序的常见空闲超时范围为 2-5 分钟,低风险应用程序的空闲超时范围为 15-30 分钟。绝对超时取决于用户通常使用应用程序的时间。如果应用程序旨在供办公室工作人员使用一整天,则适当的绝对超时范围可以在 4 到 8 小时之间。
“如果会话 ID 被盗,它过期的越快越好”,这具有直观的意义。但是,在使用 Google、Twitter 或 GitHub 等网站时,我看不到这些短会话超时。在那里,我几乎不必再次重新登录:会话无限期地保持活动状态。
他们如何在不影响安全性的情况下实现如此长的会话时间?我已经研究过了,我发现了一些潜在的原因,但没有一个能真正说服我:
我看过类似这样的文章,他们认为大玩家可以这样做,因为它们具有额外的安全功能,例如远程注销、关键操作的重新身份验证提示、登录历史记录和登录通知。这很好,但我真的不明白这将如何允许超长的会话持续时间。大多数普通用户可能从不使用远程注销、登录历史记录或登录通知。并且重新验证提示仅针对“更改密码”和“删除存储库”之类的内容出现,但还有很多事情是您真的不希望攻击者能够做的,并且这些提示不受这些提示的保护。所以这不可能是全部原因!
大型网站还具有额外的保护,例如将会话 ID 绑定到浏览器指纹和 IP 范围。这就是他们的长期会话安全的原因吗?
或者互联网上随处可见的关于超短会话的建议是否已经过时?假设您遵循最佳实践(真正的随机会话 ID,>=128 位熵,Secure; HttpOnly; SameSite=Lax
),被盗的会话 ID 实际上仍然是值得考虑的风险吗?如果攻击者可以从您的本地浏览器中提取 cookie 值,那么您肯定会遇到比受损会话更大的问题。
或者最后,大玩家是否只是将用户体验置于安全之上?