为什么 remember-me 比 spring-security 中的完整身份验证更次要?
Why is remember-me a lesser authentication then full-authentication in spring-security?
这是一个关于事实的概念性问题,身份验证在 spring 安全性方面有不同的等级。
有一个成绩
- anonymous authentication 也叫
IS_AUTHENTICATED_ANONYMOUSLY
- 和remember me authentication
IS_AUTHENTICATED_REMEMBERED
- 完整身份验证,当用户仅提供他的全部凭据并得到确认时
IS_AUTHENTICATED_FULLY
在 AuthenticatedVoter#isFullyAuthenticated
的实现中很明显,完全认证的用户不能是 anonymous authenticated
或 remember-me authenticated
。
虽然我完全理解为什么要区分 IS_AUTHENTICATED_FULLY
和 IS_AUTHENTICATED_ANONYMOUSLY
,但我真的不明白为什么 IS_AUTHENTICATED_REMEMBERED
与 IS_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 令牌:可以被认为是一种与用户共享的长期刷新令牌形式
这是一个关于事实的概念性问题,身份验证在 spring 安全性方面有不同的等级。
有一个成绩- anonymous authentication 也叫
IS_AUTHENTICATED_ANONYMOUSLY
- 和remember me authentication
IS_AUTHENTICATED_REMEMBERED
- 完整身份验证,当用户仅提供他的全部凭据并得到确认时
IS_AUTHENTICATED_FULLY
在 AuthenticatedVoter#isFullyAuthenticated
的实现中很明显,完全认证的用户不能是 anonymous authenticated
或 remember-me authenticated
。
虽然我完全理解为什么要区分 IS_AUTHENTICATED_FULLY
和 IS_AUTHENTICATED_ANONYMOUSLY
,但我真的不明白为什么 IS_AUTHENTICATED_REMEMBERED
与 IS_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 令牌:可以被认为是一种与用户共享的长期刷新令牌形式