JWT令牌如何认证?

时间:2020-01-04 19:12:24

标签: node.js api security oauth jwt

这让我感到困惑:

  • 因此,当用户登录时,将为他们授予带有签名的JWT令牌。此签名发生在标头+有效负载+秘密

  • 现在,用户使用了令牌,他们可以访问受保护的资源。

  • JWT如何知道令牌有效?由于此流程中服务器上没有存储任何内容,因此如何再次比较签名?如果我使用JWT调试器,则可以创建一个同样有效的令牌。那那部分是如何工作的?

最后一点让我非常困惑。我到处都看到“检查签名”,但没有人详细解释。

3 个答案:

答案 0 :(得分:1)

JWT根据服务器拥有的密钥创建客户端令牌。 JWT的设计方式是,没有服务器拥有的密钥就无法生成那些客户令牌,因此每个密钥都是安全的,而秘密密钥始终是安全的。 服务器还使用密钥来验证客户端令牌是否有效,并且只有该密钥才能对其进行验证。

答案 1 :(得分:1)

JWT(JSON Web令牌)是一个自包含的访问令牌,这意味着它包含应用程序使用它所需的所有信息(例如,JWT Claims)以及服务器对其进行验证(即,JWT标头和JWT签名)。所有这些都在一个令牌中。

服务器通过询问这两个问题来验证JWT。

JWT是否已过期?
JWT有效载荷是否受到篡改?

第一个:服务器查看JWT有效负载以获取已注册声明(例如“ exp”(到期时间),“ iat”(发出))的声明,以确定JWT是否已过期。
有关完整注册的声明的列表,请参阅RFC 7519 here

第二个:服务器查看JWT标头以获取注册的声明“ alg”(算法),以了解JWT生成过程中使用了哪种哈希类型。它使用相同的算法(但是具有服务器自己的机密)来验证JWT有效负载在此过程中是否已被篡改。

希望如此。

欢呼声,
ram

答案 2 :(得分:0)

这里有很多相当普遍的问题,所以我将其细分了...

  1. JWT如何知道令牌是有效令牌而不是冒名顶替者令牌?

当您向服务器提交请求时,JWT将附加到该请求的标头。此JWT先前已由服务器提供(通过身份验证),通常存储在本地存储或cookie中,以保持会话。

然后可以使用“ jsonwebstoken”包(服务器端)来确定针对特定资源的令牌的有效性。 JWT软件包将解密令牌并比较其签名。这是通过比较绝不应该在客户端公开的密钥完成的。这是一个可能使令牌无效或有效的变量。另一个可能是令牌过期已超时。例如,如果攻击者窃取了其他人的令牌,则他们可能会尝试将该令牌发送到您的服务器并假冒其他人。因此,最好有一个15m-1h的短期限

  1. 令牌对特定路线如何有效?

好吧,这是变量无穷的地方。 JWT允许您将信息存储在令牌中。例如,如果您有两个不同的用户组,则将在令牌中存储一个值-最初对其进行签名时-说明用户是否属于特定用户组。例如userIsABuyer:false,或userIsASeller:true。一个好的做法是编写一些中间件来拦截每个传入的请求,并检查令牌是否有效。如果有效,则可以附加标题,例如“ authenticated:true”,并且为了进一步保护其他内部资源,可以附加任意数量的标题。例如,“ userIsABuyer:false”

https://www.youtube.com/watch?v=25GS0MLT8JU-这是一个非常不错的视频,深入了JWT。

https://blog.hasura.io/best-practices-of-using-jwt-with-graphql/-一种出色的资源,它还涉及在将令牌存储在内存中时解决前端应用程序中会话持续存在的问题