SpringCloud 微服务 JSON Web 令牌 (JWT) 安全
SpringCloud Microservices JSON Web Token (JWT) Security
我有一个多微服务架构,我打算在其中应用安全性。
我对安全设计的看法:
身份验证将使用 LDAP 进行,当用户通过身份验证时,将使用 "secret key" 生成 JSON Web 令牌 (JWT),并且令牌将具有角色、过期时间等。每次调用微服务此令牌将在 Header 中传递以进行授权。在我看来,我只有一个验证用户身份并生成 JWT 的身份验证服务器。
我的疑问:
现在,当微服务收到一个调用(在 Header 中包含 JWT)时,它是否总是会访问 auth 服务器以验证令牌?
如果是,会不会导致对 auth 服务器的多次调用从而导致不好的做法?
如果没有,客户端将如何验证令牌以及授权服务器的范围是什么?
JWT 始终经过签名,因此您无需调用某些中央身份验证实例即可验证给定令牌。身份验证服务器知道签署令牌的秘密,所有想要验证令牌的服务也需要有一种方法来检查它。
有两种不同的签名方法:
- symmetric:在散列负载之前附加一个秘密值。消费服务也需要知道这个秘密,并且可以通过将秘密附加到接收到的有效负载并使用传输的哈希检查生成的哈希来进行验证。
- 非对称:通过使用一些 PKI signing/verification 可能只有 auth 服务器有私钥来签署令牌。所有消费服务只需要public部分进行验证。
我更喜欢第二种方式,因为它减少了钥匙被盗的可能性。如果其中一项消费服务被劫持,则不会丢失任何秘密,因此攻击者可以创建有效的令牌。使用这样的算法可能比对称方式中使用的简单哈希需要更多时间/cpu 周期来验证。
有关不同机制的示例,请参阅官方 JWT 页面:https://jwt.io/
我有一个多微服务架构,我打算在其中应用安全性。
我对安全设计的看法:
身份验证将使用 LDAP 进行,当用户通过身份验证时,将使用 "secret key" 生成 JSON Web 令牌 (JWT),并且令牌将具有角色、过期时间等。每次调用微服务此令牌将在 Header 中传递以进行授权。在我看来,我只有一个验证用户身份并生成 JWT 的身份验证服务器。
我的疑问:
现在,当微服务收到一个调用(在 Header 中包含 JWT)时,它是否总是会访问 auth 服务器以验证令牌?
如果是,会不会导致对 auth 服务器的多次调用从而导致不好的做法?
如果没有,客户端将如何验证令牌以及授权服务器的范围是什么?
JWT 始终经过签名,因此您无需调用某些中央身份验证实例即可验证给定令牌。身份验证服务器知道签署令牌的秘密,所有想要验证令牌的服务也需要有一种方法来检查它。
有两种不同的签名方法:
- symmetric:在散列负载之前附加一个秘密值。消费服务也需要知道这个秘密,并且可以通过将秘密附加到接收到的有效负载并使用传输的哈希检查生成的哈希来进行验证。
- 非对称:通过使用一些 PKI signing/verification 可能只有 auth 服务器有私钥来签署令牌。所有消费服务只需要public部分进行验证。
我更喜欢第二种方式,因为它减少了钥匙被盗的可能性。如果其中一项消费服务被劫持,则不会丢失任何秘密,因此攻击者可以创建有效的令牌。使用这样的算法可能比对称方式中使用的简单哈希需要更多时间/cpu 周期来验证。
有关不同机制的示例,请参阅官方 JWT 页面:https://jwt.io/