如何有效地实现Json Web令牌(JWT)?
我试图实现并利用如何有效地实现Json Web令牌(JWT)?,jwt,Jwt,我试图实现并利用JWT(jsonweb令牌)来保护我的系统。我得到了JWT的部分是防篡改的。我参加了很多关于如何安全地实现JWT的讨论,但我还是有点困惑 首先,我决定使用2个令牌(刷新令牌和访问令牌) 刷新令牌将具有更长的生存期,并用于维护日志会话和创建访问令牌。它是在用户首次登录时创建的,并在用户每次主动使用应用程序时刷新其到期日期,这样,如果用户正在主动使用我的应用程序,则无需重新登录 访问令牌将是短期的,我正在尝试为每种特定请求创建访问令牌。因此,第二个问题是 (1) 我应该创建单个访问令
JWT(jsonweb令牌)
来保护我的系统。我得到了JWT的部分是防篡改的。我参加了很多关于如何安全地实现JWT的讨论,但我还是有点困惑
首先,我决定使用2个令牌(刷新令牌和访问令牌)
我将非常感谢您的帮助。如果一个糟糕的参与者获得了刷新令牌,他们将无法创建和签署新令牌,但他们可以在可预见的未来延长当前令牌的使用寿命。显然,这会带来安全风险——如果你想冒这个风险,这取决于你自己 在您描述的流程的某个点期间,您将需要一个访问令牌 您可以忘记一起支持刷新令牌。如果一个坏演员得到一个刷新令牌,要阻止他造成伤害是非常困难的 我建议创建一种访问令牌,并使用它来授予对服务器上资源的访问权。您可以采取以下策略: 您的身份验证服务器将需要是微服务的JWT的单一颁发者。因此,当用户登录并成功进行身份验证时,您的身份验证服务器将发出使用私钥签名的JWT(签名必须是非对称的-RS256是一个示例),您只保留在身份验证服务器上;不要将此私钥提供给您希望在其中验证JWT的其他微服务。您可以做的是基于您用其签名令牌的私钥派生公钥,并将其发布到auth服务器上不需要身份验证的端点-公钥将以a的形式表示(请参阅指向规范的链接)。谷歌也做了类似的事情。然后,在每个微服务中,您需要设计一种方法,每X分钟向auth服务器上的公钥端点发出GET请求,并在每个微服务中缓存公钥 然后,每当一个请求进入一个微服务时,您就获取JWT,检查其有效性,并在令牌有效时授予访问/授权。使用私钥/公钥对和非对称密钥签名的好处在于,您可以仅基于公钥验证令牌,但不能对其进行签名。因此,只要每个服务都有来自/cert端点的公钥,它们就可以验证令牌,而无需与身份验证服务器通信或知道私钥 这将需要更多的前期工作,但将为您带来大量的方便、灵活性和安心,因为只有一个来源知道您的私钥 如果您的实现是Java的,我建议使用库进行JWT验证 整个体系结构最终将看起来像这样:
但如果我不使用刷新令牌,如何让用户保持登录状态。由于访问令牌被设置为短寿命。一旦访问令牌过期,您只需提示用户重新验证或再次登录即可。这对用户来说是一个小小的不便,但减少了安全漏洞。这是一个折衷方案,我愿意接受。谢谢你,但我宁愿不按我的要求。