使用JWT

时间:2015-08-22 16:45:39

标签: jwt

我是JWT的新手。我对JWT进行了一些研究,并了解它被设为“header.claims.signature”。

考虑一个简单的场景如下:

  • 客户获得身份验证
  • 客户可能拥有(一个或多个)admin,member,registered,guest
  • 的角色
  • 服务器不维护任何会话(并且仅依赖于JWT进行身份验证/授权)

一旦通过身份验证,服务器就会找到客户的类型,我假设customerId和角色将成为JWT中“声明”的一部分。如果我的假设不正确(或违反标准),请告诉我。

JWT的“声明”部分未加密(仅编码)。这暴露了一个简单的安全漏洞,其中(服务)消费者可以简单地修改JWT的“声明”部分,并用更多角色(客户/消费者未被授权)重新发送它。

如果我的理解/假设不正确,我们如何实现目标?

3 个答案:

答案 0 :(得分:28)

使用JWS(header.claims.signature)时,JWT的“声明”部分受签名的完整性保护。因此,如果JWT的“声明”或任何其他部分被没有正确密钥的人修改,则JWT上的签名验证将失败并且令牌应被拒绝。

答案 1 :(得分:8)

可以验证JWT的claims部分,但是当您更改用户角色时,在向claims添加角色等内容时会出现另一个问题,但旧令牌仍包含分配给以前的角色用户。所以要小心。 您可以简单地将用户标识符保留在令牌中,并根据您的持久性机制(数据库或其他任何内容)检索与用户关联的任何其他信息。

答案 2 :(得分:3)

另一种选择是在身份验证期间根据令牌中包含的用户标识符在数据库中查找用户,以验证JWT中未包含的角色或其身份的其他方面。

但是,JWT中包含的任何信息都通过如前所述的签名进行验证,因此如果需要,您还可以依赖JWT中的内容。