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 的安全性和可靠性。

标签列表