我一直在用 Java 编写一个 RESTful 服务。这是我到目前为止所理解的:
令牌授权是使用 JSON Web 令牌 (JWT) 完成的,它由三部分组成:标头、有效负载和密钥(在客户端和服务器之间共享)。
我理解了这个概念,并在阅读 JWT 时偶然发现了 JSON Web 签名 (JWS)。
JWS 也是一个类似于 JWT 的编码实体,具有标头、有效负载和共享密钥。
JWT 和 JWS 这两个概念有什么区别?如果它们在技术上相似,那么它们的实现有什么区别?
这是我第一次使用基于令牌的身份验证,因此我可能完全误解了这个概念。
P.S.:我在浏览此网站上的示例时了解了 JWS。
JWT 实际上使用JWS 作为其签名。来自规范的摘要:
JSON Web Token (JWT) 是一种紧凑、URL 安全的表示方式 债权在两方之间转让。 JWT 中的声明是 编码为 JavaScript 对象表示法 (JSON) 对象,用作 JSON Web 签名 (JWS) 结构的有效负载或作为 JSON Web 加密 (JWE) 结构的明文,使得 声称经过数字签名或 MAC 处理和/或加密。
因此,JWT 是一个以 JSON 对象作为负载的 JWS 结构。已经定义了一些可选键(或声明),例如
iss
、aud
、exp
等。
这也意味着它的完整性保护不仅仅限于共享秘密,还可以使用公钥/私钥加密。
根据规范(RFC7519),JWT 有多种类型:
"alg":"none"
。因此,JWT 可以是JWS 或JWE,具体取决于使用哪种加密形式来保护声明的完整性。也就是说,JWT 可以进行签名或加密(或两者都进行,或两者都不进行);并非每个 JWT 都是 JWS。
相反(通过RFC7515),JWS 可用于保护任何二进制有效负载(不仅是 JSON 格式的声明)的完整性,因此并非每个 JWS 都是 JWT。