Spring security SpringCloud微服务JSON Web令牌(JWT)安全性

Spring security SpringCloud微服务JSON Web令牌(JWT)安全性,spring-security,spring-boot,jwt,spring-cloud,Spring Security,Spring Boot,Jwt,Spring Cloud,我有一个多微服务体系结构,我打算在其中应用安全性 我对安全设计的看法: 身份验证将通过LDAP进行,当用户通过身份验证时,将使用“密钥”生成JSON Web令牌(JWT),该令牌将具有角色、过期时间等。每次调用微服务时,该令牌将在标头中传递以供授权。在我看来,我只有一个auth服务器,它对用户进行身份验证并生成JWT 我的怀疑: 现在,当一个微服务接收到一个调用(包含JWT-in报头)时,它是否总是点击身份验证服务器来验证令牌? 如果是,是否会导致多次调用身份验证服务器,从而导致不良行为? 如果

我有一个多微服务体系结构,我打算在其中应用安全性

我对安全设计的看法: 身份验证将通过LDAP进行,当用户通过身份验证时,将使用“密钥”生成JSON Web令牌(JWT),该令牌将具有角色、过期时间等。每次调用微服务时,该令牌将在标头中传递以供授权。在我看来,我只有一个auth服务器,它对用户进行身份验证并生成JWT

我的怀疑:
现在,当一个微服务接收到一个调用(包含JWT-in报头)时,它是否总是点击身份验证服务器来验证令牌?
如果是,是否会导致多次调用身份验证服务器,从而导致不良行为?

如果否,客户端将如何验证令牌以及身份验证服务器的作用域是什么?

JWT总是经过签名,这样您就可以验证给定的令牌,而无需调用某个中央身份验证实例。身份验证服务器知道签名令牌的秘密,所有想要验证令牌的服务也需要有一种方法来检查这一点

有两种不同的签名方法:

  • 对称:在散列有效负载之前附加一个秘密值。消费服务还需要知道该秘密,并且可以通过将该秘密附加到接收的有效负载并用传输的散列检查结果散列来进行验证
  • 不对称:通过使用一些PKI签名/验证,可能只有身份验证服务器具有对令牌进行签名的私钥。然后,所有消费服务只需要公共部分进行验证
我更喜欢第二种方式,因为它减少了钥匙被盗的机会。如果某个消费服务被劫持,则不会丢失任何秘密,从而使攻击者能够创建有效的令牌。使用这种算法进行验证可能比使用对称方式的简单哈希需要更多的时间/cpu周期


有关不同机制的示例,请参见JWT官方页面:

谢谢,这回答了大部分问题。那么,如果我们有一个所有微服务都通用的公钥,那么分发公钥的最佳方法是什么?如果是微服务,则通过DB或通过配置服务器?当您已经有一个正在运行的配置服务器并使用PKI版本时,以这种方式分发公钥是没有问题的。请注意,此通信必须安全。另一种方法是从某个集中的密钥注册表中获取密钥。有一个特殊属性
kid
,其中列出了名称。有关更多详细信息,请参见jws附录: