我目前正在努力在我的应用程序中实现用户授权,并且我正在尝试在两种方法之间做出决定。我希望获得一些有关以安全有效的方式处理用户授权的最佳实践的建议。
与API端点通信:我正在考虑实现一个授权过滤器,它与API端点通信以检查授权所需的用户信息。这样,授权决策始终基于来自服务器的实时数据。
在声明中存储数据:我正在考虑的另一种方法是将相关用户数据存储在 JWT 声明中,并在用户完成注册过程后更新令牌。这将减少用户会话期间频繁调用 API 的需要。
问题:
任何基于您的经验的见解或建议将不胜感激。预先感谢!
这取决于能够做出有关授权的最新决策的重要性。
通常,大多数安全系统都存在某种程度的缓存信息。当我在九十年代末进行 Windows 网络操作时,Windows Kerberos 会发出一个带时间戳的令牌,其中包含您所属的所有安全组的 ID 列表。只要您保持登录状态,此列表就不会更改,因此即使我作为网络管理员更改了您的组成员身份,更改也只会在您下次登录时生效。
那是很久以前的事了,今天可能会有所不同。然而,我提出这一点是为了解释发行带有授权信息的令牌是一种经过验证的架构,并且对于许多用途来说被认为是“足够安全”的。 (请记住,安全性不是一个非此即彼的问题,而是实际上是一个用功能性与安全性交换的层次。唯一绝对安全的系统是不存在的系统。)
通过现代基于令牌的授权(例如 OAuth 2,可以包含声明),您可以自定义过期时间。如果您可以接受授权缓存 20 分钟但不能再延长,请将过期时间设置为小于该时间(15 分钟?)。
最后,这是依赖于上下文的,但我认为基于令牌的授权比每次想做任何事情时都必须调用 API 更简单。一旦您拥有令牌,移动部件就会减少,因此可能损坏的东西也会减少。
因此,除非活力至关重要,否则我会倾向于基于声明的授权,但没有“最佳实践”,只有良好的架构。