为什么 remember-me 比 spring-security 中的完整身份验证更次要?

Why is remember-me a lesser authentication then full-authentication in spring-security?

这是一个关于事实的概念性问题,身份验证在 spring 安全性方面有不同的等级。

有一个成绩
  1. anonymous authentication 也叫 IS_AUTHENTICATED_ANONYMOUSLY
  2. remember me authenticationIS_AUTHENTICATED_REMEMBERED
  3. 完整身份验证,当用户仅提供他的全部凭据并得到确认时 IS_AUTHENTICATED_FULLY

AuthenticatedVoter#isFullyAuthenticated 的实现中很明显,完全认证的用户不能是 anonymous authenticatedremember-me authenticated

虽然我完全理解为什么要区分 IS_AUTHENTICATED_FULLYIS_AUTHENTICATED_ANONYMOUSLY,但我真的不明白为什么 IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_FULLY 没有同等对待。

我怎么理解记得我:

我知道记得我是使用某种秘密令牌的身份验证 - 使用此令牌我们加载现有的 SecurityContext,其中已经包含在初始 [=23] 期间写入的完全验证的 Authentication 对象=].这方面基本恢复了全认证。

将此与具有类似令牌但在 spring 安全性中考虑完全身份验证的会话登录进行比较,为什么 remember-me 和基于会话的区别?

问题:

考虑到 remember-me 恢复了完全验证的 SecurityContext,应用程序逻辑会将上下文视为正常的完全验证。

如果我们对应用程序中的完全认证用户有一些逻辑,它肯定也适用于 remeber-me 认证案例。

当然,对于 anonymous authenticated 用户,我们经常需要做出不同的决定,所以我理解为什么要单独列出这一点。

我是否以错误的方式理解了记住我的概念,或者不将用户 remembered 计为完全认证的确切原因是什么?

Comparing this to the session-login, which has a similar token but considered full-authentication in spring security, why is there a difference between remember-me and session-based?

通常情况下,您的会话超时时间比记住我令牌的寿命短。根据 Spring 的文档,remember-me 令牌的生命周期为 2 周,而会话超时通常仅以分钟为单位定义。

Remember-me 可以被认为类似于恢复超时的会话,但这与仅恢复安全上下文一样不安全。为什么?

一般来说,您希望应用多个安全层,但作为应用程序开发人员,您无法控制(至少不能直接控制)某些安全层,例如:

  • 无法保证用户不会共享其凭据 (uersname/password),因此可能需要进行多重身份验证。
  • 不能保证经过身份验证的用户离开他们的机器并且不锁定它。在那种情况下,其他人可以访问该应用程序,因此您会希望令牌的寿命尽可能短。因此,许多应用程序使用额外的令牌进行关键操作,例如当我可以将产品放入我在亚马逊上的购物车时,但当我想下订单时,我需要重新验证以确保它确实是我。

这基本上是 remember-me 增加的第二个风险:如果用户正在积极使用该应用程序,您只能假设他们仍在他们的机器前,因此您希望尽可能短的会话超时快速确定用户处于非活动状态(并且寿命足够长以保持良好的可用性水平)。

Remember-me 会重新激活一个不活动的会话(或至少关联的安全上下文),因此在这里您假设现在在机器前面的用户是原始用户.不能保证这一点,因此记住我的身份验证可以被认为不太安全。

OAuth 刷新令牌可以被认为是类似的东西:当用户成功通过身份验证时,您将获得一个访问令牌,但无论 activity 是什么,访问令牌都会过期。然后,如果会话仍处于活动状态,您将使用刷新令牌获取新的访问令牌(这不能保证用户是否已更改)。

因此,在不考虑身份验证选项的安全性方面,我将按以下顺序对它们进行排名:

  • access token 通过显式验证用户来检索:将其用于关键操作,使它们短暂存在并且不为这些操作提供刷新令牌
  • refresh token 和通过刷新令牌检索的访问令牌:基本上与会话安全性相当,因为刷新令牌的生命周期通常与会话生命周期相关(如果用户没有在时间 X 内访问受保护的资源那么访问令牌和刷新令牌都将过期,用户将需要重新进行身份验证)。请注意,不应与用户共享刷新令牌。
  • remember-me 令牌:可以被认为是一种与用户共享的长期刷新令牌形式