JSON Web Signature (JWS) 和 JSON Web Token (JWT) 有什么区别?

99

我一直在用Java编写一个 RESTful 服务。到目前为止,这是我所理解的:

使用 JSON Web Tokens (JWT) 进行令牌授权,其中包括三个部分:标头、负载和密钥(客户端和服务器之间共享)。

我理解了这个概念,并在阅读有关 JWT 的文章时遇到了 JSON Web Signature (JWS)。

JWS 也是一个类似于 JWT 的编码实体,具有标头、负载和共享密钥。

这两个概念之间有什么区别,即 JWT 和 JWS?如果它们在技术上相似,那么在它们的实现中有什么区别?

这是我第一次使用基于令牌的身份验证,因此我可能完全误解了这个概念。

P.S.:我在浏览此网站的示例时了解了 JWS:http://connect2id.com/products/nimbus-jose-jwt

3个回答

82

JSON Web Token (JWT) 是一种紧凑可 URL 安全传输的方法,用于在两个方之间传递声明信息。根据规范摘要

JWT 将声明编码为 JavaScript Object Notation (JSON) 对象,并将其作为 JSON Web Signature (JWS) 结构或 JSON Web Encryption (JWE) 结构的有效载荷,使得这些声明可以被数字签名、MAC 或加密。

因此,JWT 实际上是一个具有 JSON 对象有效载荷的 JWS 结构。还定义了一些可选的键(或声明),例如 issaudexp 等。

这也意味着,它的完整性保护不仅限于共享密钥,还可以使用公钥/私钥加密。


好的,那很有道理。所以如果有效载荷包含声明集,我的用户信息放在哪里?你能给我一个例子吗? - leo
1
请查看此处规范中附录A中的示例:https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32 - Hans Z.
这些声明将包含用户信息。以下是一个示例代码,通过注释讲述了正在发生的事情:https://bitbucket.org/b_c/jose4j/wiki/JWT%20Examples - Brian Campbell
@HansZ,附录A中的示例仅显示JWT。我有兴趣看到JWS的示例,以便了解JWT和JWS之间的区别。 - David Klempfner

23
简单来说,JWT(JSON Web Token)是一种将声明(即名称-值对)表示为JSON对象的方式。JWT规范定义了一组用于在两个方之间使用或传输的标准声明。
另一方面,JWS(JSON Web Signature)是一种在两个方之间传输JWT有效载荷并保证完整性的机制。JWS规范定义了多种签名方式(例如HMAC或数字签名)和多种序列化内容以跨网络传输的方式。

0
根据规范(RFC7519),JWT有多种变体:
- 未加密的JWT只有两部分(头部和声明),即省略了任何加密部分。头部包含"alg":"none"。 - 声明作为JWS的有效负载进行编码(即加密签名)。这是典型的三部分签名JWT。 - 声明作为JWE的明文进行编码(即加密)。这具有更多的组件(头部、加密密钥、随机化、密文、完整性等)。 - 嵌套的JWT...
因此,JWT可以是JWS或JWE,具体取决于用于保护声明完整性的加密形式。也就是说,JWT可以是签名的或加密的(或两者都有,或两者都没有);并非每个JWT都是JWS。
相反地(根据RFC7515),JWS可以用来保护任何二进制有效负载的完整性(不仅限于JSON格式的声明),所以并非每个JWS都是JWT。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接