JOSE 与 JWT 标准详解:从 RFC 7515 到 7519
如果您曾实现过现代 Web 身份验证,您很可能使用过 JSON Web Token (JWT)。但 JWT 只是被称为 JOSE (JSON Object Signing and Encryption) 的更大标准家族中的一员。了解这些标准之间的关系对于构建安全的应用程序至关重要。
在本指南中,我们将探讨构成 JOSE 栈的五个核心 RFC:
- RFC 7515: JWS (JSON Web Signature)
- RFC 7516: JWE (JSON Web Encryption)
- RFC 7517: JWK (JSON Web Key)
- RFC 7518: JWA (JSON Web Algorithms)
- RFC 7519: JWT (JSON Web Token)
1. RFC 7515: JSON Web Signature (JWS)
JWS 是 JWT 最常见的形式。它确保令牌的内容未被篡改。它提供完整性和真实性,但不提供机密性(内容对于看到令牌的任何人仍然可见)。
结构:
JWS 通常以紧凑序列化格式表示,由三个部分组成,中间用点分隔:
BASE64URL(Header) . BASE64URL(Payload) . BASE64URL(Signature)
- Header (首部):指定用于签名的算法(例如
{"alg": "HS256"})。 - Payload (负载):实际被签名的数据。
- Signature (签名):对首部和负载进行签名的结果。
2. RFC 7516: JSON Web Encryption (JWE)
虽然 JWS 提供完整性,但 JWE 提供机密性。它对负载进行加密,以便只有预期的接收者才能读取它。
结构:
JWE 紧凑序列化有五个部分:
BASE64URL(Header) . BASE64URL(Encrypted Key) . BASE64URL(Initialization Vector) . BASE64URL(Ciphertext) . BASE64URL(Authentication Tag)
当令牌包含敏感信息(如 PII,个人身份信息)且不应对客户端或中间代理可见时,通常使用 JWE。
3. RFC 7517: JSON Web Key (JWK)
JWK 是一种表示加密密钥的 JSON 数据结构。它用于以标准化的方式在服务器之间共享公钥。
示例:
{
"kty": "RSA",
"use": "sig",
"kid": "1b94c",
"n": "vXl...",
"e": "AQAB"
}
JWK 的集合称为 JWKS (JSON Web Key Set),通常位于 /.well-known/jwks.json 这样的端点。
4. RFC 7518: JSON Web Algorithms (JWA)
JWA 是 JOSE 栈的“字典”。它定义了用于签名 (JWS) 和加密 (JWE) 的具体算法。
常用算法:
- HS256:使用 SHA-256 的 HMAC(对称)。
- RS256:使用 SHA-256 的 RSASSA-PKCS1-v1_5(非对称)。
- ES256:使用 P-256 和 SHA-256 的 ECDSA(非对称)。
- A128GCM:使用 128 位密钥的 AES GCM(加密)。
5. RFC 7519: JSON Web Token (JWT)
JWT 是 JWS 或 JWE 的一种应用,其中的负载是一组 Claims (声明)。声明是关于某个实体(通常是用户)的信息片段。
标准声明:
iss: 发行者 (Issuer)sub: 主题 (Subject,通常是用户 ID)aud: 受众 (Audience)exp: 过期时间 (Expiration Time)iat: 签发时间 (Issued At)
总结对比
| 标准 | 用途 | 类比 |
|---|---|---|
| JWS | 完整性 | 一封签名的信 |
| JWE | 机密性 | 一个加密的信封 |
| JWK | 密钥表示 | 一个公钥文件 |
| JWA | 算法目录 | 一个加密算法列表 |
| JWT | 数据格式 | 实际的令牌 |
常见问题 FAQ
问:JWT 总是 JWS 吗? 答:不总是,但在 99% 的情况下是的。JWT 可以是 JWS(已签名)、JWE(已加密),甚至是无担保 JWT(无签名)。
问:我应该使用 RS256 还是 HS256? 答:通常首选 RS256(非对称),因为它允许客户端在无需私钥的情况下验证签名。HS256(对称)速度更快,但需要共享密钥。
问:我在哪里可以看到 JWT 内部的内容? 答:由于 JWS 负载仅经过 Base64 编码,您可以轻松解码它们。但是,除非您验证了签名,否则绝不应信任该数据。