所有文章 > 日积月累 > JSON Web Token 是什么
JSON Web Token 是什么

JSON Web Token 是什么

JSON Web Token(JWT)是一种广泛应用于跨域认证的解决方案。近年来,随着互联网服务的迅猛发展,安全性和扩展性成为用户认证中急需解决的问题。JWT 恰好为此提供了一种便捷而高效的实现方式。

JWT原理示意图

JWT 在跨域认证中的应用

用户认证的传统方法

传统的用户认证方法通常依赖于服务器端会话(session)。流程如下:

  1. 用户向服务器发送用户名和密码。
  2. 服务器验证成功后,保存用户的会话信息。
  3. 服务器返回一个 session_id,存储在用户的 Cookie 中。
  4. 用户每次请求都会将 session_id 通过 Cookie 发送给服务器。
  5. 服务器根据 session_id 识别用户身份。

这种方式的问题在于扩展性差,尤其是在服务器集群和跨域服务中,需要共享 session 数据。

JWT 的解决方案

JWT 的出现为跨域认证带来了新的解决方案。JWT 由服务器生成并返回给客户端,之后每次请求都附带此令牌,服务器通过解析 JWT 确认用户身份。JWT 的无状态特性使其可以在多台服务器间轻松扩展,无需共享 session 数据。

JWT 的结构和组成

JWT 的基本组成

JWT 是一个由三部分组成的字符串:

  • Header(头部):包含令牌类型和加密算法。
  • Payload(负载):包含实际传递的数据,如用户名、角色等。
  • Signature(签名):用于验证数据的完整性。
Header.Payload.Signature

JWT结构示意图

Header 的结构

Header 是一个 JSON 对象,描述了令牌的元数据,通常包含以下信息:

{
  "alg": "HS256",
  "typ": "JWT"
}

其中 alg 表示使用的签名算法,typ 表示令牌类型。

Payload 的内容

Payload 中存放的是实际需要传递的数据,可以包含标准字段和自定义字段:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

注意,JWT 默认是不加密的,敏感信息不应放在 Payload 中。

Signature 的生成

Signature 是对 Header 和 Payload 的签名,确保数据未被篡改。生成方法涉及加密算法和服务器密钥:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)

JWT 的应用场景

跨域存储和传输

JWT 可以存储在浏览器的 Cookie 或 localStorage 中。每次请求时,客户端需将 JWT 附带在请求头中:

Authorization: Bearer 

安全性和限制

虽然 JWT 提供了一种无状态的认证方式,但其安全性依赖于签名和密钥的保护。为防止 JWT 被截获后滥用,应采用 HTTPS 传输,并设置较短的有效期。

JWT 的优缺点分析

优点

  • 无状态性:服务器无需保存会话信息,易于扩展。
  • 灵活性:不仅限于认证,也可用于信息交换。

缺点

  • 安全性:一旦 JWT 泄露,任何人都可获取令牌权限。
  • 不可撤销性:JWT 签发后无法轻易撤销或修改权限。

如何确保 JWT 的安全传输

使用 HTTPS

确保所有的 JWT 传输都通过 HTTPS 进行,防止令牌被窃取。

短时效性

设置较短的有效期,减少被盗用的风险。对于重要操作,应重新认证用户。

JWT 的实现示例

以下是一个简单的 JWT 生成和验证流程示例:

const jwt = require('jsonwebtoken');

// 生成 JWT
token = jwt.sign({ username: 'JohnDoe' }, 'your-256-bit-secret', { expiresIn: '1h' });

// 验证 JWT
try {
  const decoded = jwt.verify(token, 'your-256-bit-secret');
  console.log(decoded);
} catch (err) {
  console.error('Token invalid or expired');
}

FAQ

问:JWT 是什么?

答:JWT 是 JSON Web Token 的缩写,是一种轻量级的跨域认证方案。

问:JWT 如何保证安全性?

答:通过签名算法和密钥保证数据的完整性,通过 HTTPS 传输防止被截获。

问:JWT 可用于哪些场合?

答:JWT 可用于用户认证、信息交换、跨域通信等场合。

问:如何存储 JWT?

答:JWT 可以存储在浏览器的 Cookie 或 localStorage 中。

问:JWT 的有效期如何设置?

答:JWT 的有效期应设置得较短,以减少被盗用的风险。

#你可能也喜欢这些API文章!