当无法以编程方式复制的浏览器关闭时会发生什么?

What happens when a browser closes that can't be programatically replicated?

许多身份验证服务(PHP_AUTH、Apache Basic Auth、SSO 服务)要求关闭用户的浏览器以properly/safely终止他们的身份验证会话。

我知道其中一些服务是 "stateless",这意味着它们不按照 "session" 的概念运作。为什么没有一种方法可以简单地告诉浏览器清空身份验证缓存或清除 cookie,就像它在关闭时所做的那样?我见过许多针对不同服务的 hack 来强制 "logout",但为什么首先需要这些?

无法通过 PHP(强制服务器终止会话)或 JavaScript(强制浏览器到客户端终止,因为它会似乎在关闭时做)?这些功能不存在的原因是什么(我只能假设它们会造成某种安全漏洞),尤其是在客户端?

编辑:至于为什么我要问这个:很多时候这些是最容易设置的服务(如果给定的组织有单点登录服务和现有的身份验证 UI,则没有自己写的理由)。然而,强迫用户关闭他们的整个浏览器只是为了任意注销一项服务似乎是笨拙和过时的事情,我试图了解是什么因素决定了它必须是这样的。

Public服务公告:强制用户关闭浏览器注销是一种糟糕的用户模型,它会阻止用户注销,从而降低有效的安全性。

那个挡道...

我怀疑幕后发生的事情是会话 ID 维护在 HTTP session cookie 中。这些 cookie 的生命周期为当前浏览器会话。所以当浏览器关闭时,用户失去了他们的浏览器和他们在服务器上的会话之间的关联。服务器会话实际上并没有终止,它只是悬空。估计超时就结束了。

所以注销完全是通过浏览器行为实现的。该应用无需执行任何特殊操作。

除了前面提到的可怕的用户模型之外,此解决方案还在用户完成会话后让会话保持活动状态。 live session 会消耗资源,有机会被劫持,直到超时。鉴于这些缺点,我怀疑这种策略仅在廉价实现会话时使用。