jsonweb(jsonwebtoken)
## JSON Web Token (JWT)
简介
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。该信息可以被验证和信任,因为它是经过数字签名的。JWT 可以使用秘密(使用
HMAC
算法)或使用
RSA
或
ECDSA
的公钥/私钥对进行签名。
一、 JWT 的结构
JWT 由三部分组成,用点 (`.`) 分隔:1.
Header (头部):
包含令牌的元数据,通常是令牌的类型(`typ`)和使用的哈希算法(`alg`)。例如:```json {"alg": "HS256","typ": "JWT" } ```2.
Payload (有效载荷):
包含声明(Claims)。声明是关于实体(通常是用户)和其他数据的语句。有三种类型的声明:
Registered claims (注册声明):
一组预定义的声明,例如 `iss` (issuer 发行者), `exp` (expiration time 过期时间), `sub` (subject 主题), `aud` (audience 受众) 等。这些声明不是强制性的,但建议使用以提供一组有用的、可互操作的声明。
Public claims (公共声明):
由使用 JWT 的各方定义的自定义声明。
Private claims (私有声明):
在同意使用它们的各方之间定义的自定义声明,用于共享双方之间的信息,而不是注册或公共声明。例如:```json {"sub": "1234567890","name": "John Doe","admin": true } ```3.
Signature (签名):
用于验证消息在传输过程中没有被篡改。它是通过对头部和有效载荷的 Base64Url 编码后的字符串,使用头部中指定的算法和密钥进行签名生成的。例如,如果使用 HMAC SHA256 (HS256) 算法,则签名将如下所示:``` HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret ) ```
二、 JWT 的使用场景
JWT 广泛应用于各种场景,包括但不限于:
授权:
这是 JWT 最常见的用法。一旦用户登录,服务器将创建一个 JWT 并将其发送给客户端。客户端可以在后续请求中使用该令牌来访问需要授权的资源。
信息交换:
JWT 可以在各方之间安全地传输信息。因为 JWT 可以被签名,所以接收方可以验证信息的完整性和来源。
单点登录 (SSO):
JWT 可以用于在多个应用程序之间实现单点登录。
三、 JWT 的优势
自包含:
JWT 包含验证和授权所需的所有信息,减少了服务器端数据库查询的需求。
跨平台:
JWT 基于 JSON,可以在不同的编程语言和平台上轻松使用。
紧凑:
JWT 的体积小,可以轻松地在 HTTP 标头或 URL 参数中传输。
可扩展性:
JWT 可以与各种签名算法一起使用,可以根据需要选择合适的算法。
四、 JWT 的安全性考虑
密钥管理:
JWT 的安全性依赖于密钥的安全性。必须妥善保管密钥,防止泄露。
过期时间:
设置合适的过期时间可以限制令牌的有效期,降低安全风险。
存储:
客户端通常将 JWT 存储在 `localStorage` 或 `sessionStorage` 中。需要注意的是,这些存储机制存在一定的安全风险,例如 XSS 攻击。建议使用 `HttpOnly` cookies 来存储敏感信息。
None 算法:
避免使用 `none` 算法,因为它会禁用签名,使 JWT 容易受到攻击。
五、 总结
JWT 是一种强大且灵活的用于在各方之间安全地传输信息的机制。 理解其结构、用法和安全注意事项对于正确地实现和使用 JWT 至关重要。 选择正确的库和工具,并遵循最佳实践,可以确保 JWT 的安全性和可靠性。
JSON Web Token (JWT)**简介**JSON Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。该信息可以被验证和信任,因为它是经过数字签名的。JWT 可以使用秘密(使用 **HMAC** 算法)或使用 **RSA** 或 **ECDSA** 的公钥/私钥对进行签名。**一、 JWT 的结构**JWT 由三部分组成,用点 (`.`) 分隔:1. **Header (头部):** 包含令牌的元数据,通常是令牌的类型(`typ`)和使用的哈希算法(`alg`)。例如:```json {"alg": "HS256","typ": "JWT" } ```2. **Payload (有效载荷):** 包含声明(Claims)。声明是关于实体(通常是用户)和其他数据的语句。有三种类型的声明:* **Registered claims (注册声明):** 一组预定义的声明,例如 `iss` (issuer 发行者), `exp` (expiration time 过期时间), `sub` (subject 主题), `aud` (audience 受众) 等。这些声明不是强制性的,但建议使用以提供一组有用的、可互操作的声明。* **Public claims (公共声明):** 由使用 JWT 的各方定义的自定义声明。* **Private claims (私有声明):** 在同意使用它们的各方之间定义的自定义声明,用于共享双方之间的信息,而不是注册或公共声明。例如:```json {"sub": "1234567890","name": "John Doe","admin": true } ```3. **Signature (签名):** 用于验证消息在传输过程中没有被篡改。它是通过对头部和有效载荷的 Base64Url 编码后的字符串,使用头部中指定的算法和密钥进行签名生成的。例如,如果使用 HMAC SHA256 (HS256) 算法,则签名将如下所示:``` HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret ) ```**二、 JWT 的使用场景**JWT 广泛应用于各种场景,包括但不限于:* **授权:** 这是 JWT 最常见的用法。一旦用户登录,服务器将创建一个 JWT 并将其发送给客户端。客户端可以在后续请求中使用该令牌来访问需要授权的资源。 * **信息交换:** JWT 可以在各方之间安全地传输信息。因为 JWT 可以被签名,所以接收方可以验证信息的完整性和来源。 * **单点登录 (SSO):** JWT 可以用于在多个应用程序之间实现单点登录。**三、 JWT 的优势*** **自包含:** JWT 包含验证和授权所需的所有信息,减少了服务器端数据库查询的需求。 * **跨平台:** JWT 基于 JSON,可以在不同的编程语言和平台上轻松使用。 * **紧凑:** JWT 的体积小,可以轻松地在 HTTP 标头或 URL 参数中传输。 * **可扩展性:** JWT 可以与各种签名算法一起使用,可以根据需要选择合适的算法。**四、 JWT 的安全性考虑*** **密钥管理:** JWT 的安全性依赖于密钥的安全性。必须妥善保管密钥,防止泄露。 * **过期时间:** 设置合适的过期时间可以限制令牌的有效期,降低安全风险。 * **存储:** 客户端通常将 JWT 存储在 `localStorage` 或 `sessionStorage` 中。需要注意的是,这些存储机制存在一定的安全风险,例如 XSS 攻击。建议使用 `HttpOnly` cookies 来存储敏感信息。 * **None 算法:** 避免使用 `none` 算法,因为它会禁用签名,使 JWT 容易受到攻击。**五、 总结**JWT 是一种强大且灵活的用于在各方之间安全地传输信息的机制。 理解其结构、用法和安全注意事项对于正确地实现和使用 JWT 至关重要。 选择正确的库和工具,并遵循最佳实践,可以确保 JWT 的安全性和可靠性。