我读到有一个JWT系统与一个简单的基于令牌的系统eliminates token lookups in a database。但我不明白这是怎么回事。如果它使用HMAC作为签名,服务器是否需要为每个客户端查找密钥以验证其签名?或者所有客户端使用相同的密钥? (听起来很不安全)。如果它使用非对称算法,是否仍然需要查找其中一个密钥来验证签名?
答案 0 :(得分:1)
在通常情况下,服务器需要凭证来验证用户(即用户和密码)。如果身份验证成功,服务器会发出一个JWT,该JWT使用服务器的私钥签名,而不是由客户端签名。。
签名保护内容并识别签名者。验证签名的服务器可以检测到对有效负载或签名的任何更改,并拒绝JWT。因此,服务器可以依赖JWT中包含的数据
服务器可以在有效负载中包含身份验证所需的声明,例如用户ID sub
,exp
以及其他感兴趣的声明,例如username
,email
或授权roles
。见What to store in a JWT?。
{
"sub": "joe",
"iat": 1300819370,
"exp": 1300819380,
"email": "joe@stackoverflow.com",
"roles":["admin","finaluser"]
}
验证签名后,服务器可以直接使用所包含的声明,而不是查询数据库。
使用对称密钥(HMAC),签名和验证使用相同的密钥完成。非对称密钥对(RSA)由私钥和公钥组成。使用私钥进行签名并与公众进行验证。当您需要客户端验证JWT时,请使用非对称密钥。
答案 1 :(得分:1)
JWT主要用于授权。只要用户使用其密码成功进行身份验证(需要数据库查找),就会创建JWT。该JWT将包含有效载荷,该有效载荷将主要包含UserIdentification。因此,每当用户向服务器发送子序列请求时,他都会将此JWT附加到报头。使用此JWT,服务器将发现此用户已通过身份验证。但是仍然存在授权。假设用户已请求服务A。现在我们知道该用户已通过身份验证,因此我们可以转到访问控制表并查看该用户是否有资格进行此服务调用。或者,如果我们在身份验证步骤中将用户授权的服务详细信息添加到JWT有效负载中,那么现在我们可以使用有效负载信息来做出授权决策,而不必查找数据库。这取决于开发人员。您可以使用两种方式来授权用户。
答案 2 :(得分:0)
您可以为每个客户端使用相同的密钥。而且它很安全!客户端永远不会看到您的密钥。 JWT允许您做的是验证有效负载是否使用密钥签名,只要它保持 secret ,您就会知道只有您可以签署有效负载。