如何有效地实施Json Web令牌(JWT)?

时间:2019-05-08 11:29:33

标签: jwt

我正在尝试实现并利用JWT (JSON Web Token)来保护我的系统。我让JWT做到了防篡改。我参加了很多关于如何安全地实现JWT的讨论,但仍然有些困惑。

首先,我决定要做的是使用2个令牌(刷新令牌和访问令牌)。

  1. 刷新令牌将具有更长的生存期,并用于维护日志记录会话和创建访问令牌。它是在用户首次登录时创建的,并在用户每次主动使用该应用程序时刷新其到期时间,因此,如果用户正在主动使用我的应用程序,则无需重新登录。
  2. 访问令牌将短暂存在,我正在尝试为每种特定请求创建访问令牌。因此,第二个问题是,
  

(1)我应该创建单个访问令牌还是应该使用的令牌   用于不同类型请求的不同访问令牌。

我的逻辑流程是这样的:

A)用户使用有效的用户名和密码登录==>服务器验证参数,并成功创建刷新令牌(RT)并将RT发送回用户。

B)用户访问我服务器中受保护的api时,首先发送刷新令牌(RT),如果有效的服务器发回访问令牌(AT)以访问该api。

C)用户将访问令牌发送到受保护的api,并在成功验证后根据需要向用户发送受保护的资源。

  

(2)但我仍然觉得从安全角度来看我缺少一些东西   观点。就像其他人获得刷新令牌一样,他们可以创建访问令牌吗?

     

(3)同样,通过实现(B)在这里甚至需要访问令牌   和(C)。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果坏演员获得刷新令牌,他们将无法创建和签名新令牌,但是可以将当前令牌的寿命延长到可预见的将来。显然,这构成了安全风险-如果您要承担这种风险,则取决于您。

在您描述的流程的某个阶段,您将需要访问令牌。

您可能会忘记一起支持刷新令牌。如果他们获得刷新令牌,很难阻止坏演员造成伤害。

我建议创建一种访问令牌,并使用它来授予对服务器上资源的访问权限。您可以采取的一种策略如下:

您的身份验证服务器将需要成为微服务的JWT的唯一颁发者。因此,当用户登录并成功进行身份验证时,您的身份验证服务器将发布一个使用私钥签名的JWT(签名必须不对称-RS256是一个示例),您只需保留在身份验证服务器上即可;不要将此私钥提供给您希望在其中验证JWT的其他微服务。您可以做的是根据与您的令牌进行签名的私钥派生公钥,并将其发布到不需要身份验证的身份验证服务器上的端点-公钥将以JWK的形式表示(请参阅规格链接)。 Google做了类似的here。然后,在每个微服务中,您需要设计一种方法,每隔X分钟向auth服务器上的公钥端点发出GET请求,并将公钥缓存在每个微服务中。

然后,无论何时有请求进入您的微服务之一,您都将抓住JWT,检查其有效性,并在令牌有效的情况下授予访问/授权。使用私钥/公钥对和非对称密钥签名的好处在于,您可以仅基于公钥来验证令牌,但不能对其进行签名。因此,只要每个服务都具有来自/ cert端点的公钥,它们就可以验证令牌,而无需与auth服务器交谈或知道私钥。

这将需要做更多的事,但是将来,只有一个来源知道您的私钥,您才能获得大量的轻松,灵活和安心。

如果您的实现是在Java中,我建议使用this库进行JWT验证。

总体架构最终看起来像这样:

enter image description here