JSON Web 签名 (JWS) 和 JSON Web 令牌 (JWT) 有什么区别?

问题描述 投票:0回答:3

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

令牌授权是使用 JSON Web 令牌 (JWT) 完成的,它由三部分组成:标头、有效负载和密钥(在客户端和服务器之间共享)。

我理解了这个概念,并在阅读 JWT 时偶然发现了 JSON Web 签名 (JWS)

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

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

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

P.S.:我在浏览此网站上的示例时了解了 JWS。

rest jwt restful-authentication http-token-authentication
3个回答
82
投票

JWT 实际上使用JWS 作为其签名。来自规范的摘要

JSON Web Token (JWT) 是一种紧凑、URL 安全的表示方式 债权在两方之间转让。 JWT 中的声明是 编码为 JavaScript 对象表示法 (JSON) 对象,用作 JSON Web 签名 (JWS) 结构的有效负载或作为 JSON Web 加密 (JWE) 结构的明文,使得 声称经过数字签名或 MAC 处理和/或加密。

因此,JWT 是一个以 JSON 对象作为负载的 JWS 结构。已经定义了一些可选键(或声明),例如

iss
aud
exp
等。

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


23
投票

简单来说,JWT(JSON Web Token)是一种将声明(名称-值对)表示为 JSON 对象的方式。 JWT 规范定义了一组在两方之间使用或转移的标准声明。

另一方面,JWS(JSON Web 签名)是一种在两方之间传输 JWT 有效负载并保证完整性的机制。 JWS 规范定义了对有效负载进行签名(例如,HMAC 或数字签名)的多种方式以及对内容进行序列化以通过网络传输的多种方式。


0
投票

根据规范(RFC7519),JWT 有多种类型:

  • 不安全的 JWT 只有两个部分(标头和声明),也就是说,它们省略了任何加密部分。标题包含
    "alg":"none"
  • 声明被编码为 JWS 的有效负载(即加密签名)。这是典型的三部分签名 JWT。
  • 声明被编码为 JWE 的明文(即加密)。它有更多组件(标头、加密密钥、随机化、密文、完整性......)。
  • 嵌套 JWT...

因此,JWT 可以是JWS JWE,具体取决于使用哪种加密形式来保护声明的完整性。也就是说,JWT 可以进行签名或加密(或两者都进行,或两者都不进行);并非每个 JWT 都是 JWS。

相反(通过

RFC7515),JWS 可用于保护任何二进制有效负载(不仅是 JSON 格式的声明)的完整性,因此并非每个 JWS 都是 JWT。

© www.soinside.com 2019 - 2024. All rights reserved.