即将到来的问题的座右铭是“我不知道我不知道什么”。我想知道身份验证实现是否存在不利因素或安全风险。
现在,我只将一个JWT存储在一个HTTP cookie中,以便将它从客户机(React应用程序)发送到服务器(Spring /Kotlin应用程序)。这消除了XSS漏洞。
JWT遵循基本原则(编码秘密、过期日期、发行者检查等)。服务器有servlet过滤器,用于检查每个请求的有效性。当通过客户端登录时,服务器使用有效的JWT进行响应:
客户端将在每个请求中发送其cookie,服务器的servlet过滤器将进一步检查每个请求的有效性。当这些检查为阳性时,用户将通过Security进行身份验证。
如上所述,JWT将在1小时、1天或任何配置之后过期。这就是为什么我需要以某种方式更新它。现在,我决定不再使用刷新令牌并将其放置在客户端的本地存储中,而是向服务器发出一个小请求,并创建一个新的JWT,它再次通过响应发送回来:
同样,当调用refresh
端点时,servlet过滤器将检查有效性。因此,只有已经通过身份验证的用户才会以这种方式接收新的JWT令牌。一些无效的JWT将不会接收新的JWT。我在间隔内从客户端调用这个端点,因此定期延长cookie中JWT的过期日期。
我知道的是:
如果真的有什么不好的事情发生,我仍然可以
我的问题是:我正在做的事情(替换cookie中的JWT )还有更多的缺点吗?
发布于 2021-05-29 18:22:09
这是一个基于理论观点的答案。
你正在设计的是不标准的.非标准的安全性总是一种风险。你必须决定你的风险偏好是什么。如果您在实现中遇到问题,您的所有用户都可能暴露或用户数据等风险。您愿意承担这个风险吗?这是你的选择,不是我的。
已经开发了一些标准,如基本安全性、oauth2流、Kerberos等,以标准化登录流以避免可能存在风险的实现。还可以实现诸如单点登录和不同服务之间的身份验证等功能。
有很多事情是危险的,不具体涉及你的流动,例如:
我不喜欢的是你的/refresh
解决方案。在标准oauth2流中,您一直对资源服务器执行请求,直到服务器用401 UNAUTHORIZED
响应客户机,然后获取刷新令牌并尝试刷新,然后重新执行原始请求。如果刷新失败,它们将被正式注销。如果它们刷新和重做请求,而请求失败,则它们将被注销。
当您在离开一段时间后访问该站点时,客户端将检查是否存在刷新令牌,如果它存在,则尝试刷新,然后您可以继续删除它。否则你需要重新登录。
在您的解决方案中,您需要一个经过身份验证的用户来定期轮询刷新端点以获得一个新的令牌。
这一解决办法的问题:
其他评论:
我觉得这更像是一个基于会话的登录,包含一个JWT。这个解决方案是如何扩展的?这就是为什么您通常分离并拥有一个发行者服务器,这纯粹是问题和验证令牌。这样您就可以在多个服务器和微服务上添加。
这结束了我的回答,但不看实现,这是理论上我可以威胁模型围绕这一点。
https://softwareengineering.stackexchange.com/questions/426729
复制相似问题