JSON Web Token (JWT) 是一个开放标准 (RFC 7519),它定义了一种紧凑(compact)且自包含(self-contained)的方式,用于在各方之间以JSON 对象方式安全地传输信息

1. jwt结构:

header.payload.sign

header

header 通常由两部分组成:令牌的类型,即 JWT,以及正在使用的签名算法,例如 HMAC SHA256 或 RSA。然后,这个 JSON 被 Base64Url 编码以形成 JWT 的第一部分。

payload(业务信息)

例:

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

对有效负载进行 Base64Url 编码以形成 JSON Web 令牌的第二部分

Signature

必须获取已编码的标头(header)、编码的有效负载(payload)、密钥、header中指定的算法,并对其进行签名。

例:

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

2. 举例使用流程:

  1. 用户使用用户名和密码登录。
  2. 系统验证用户身份后,生成一个包含用户信息和其他必要数据的JWT。
  3. 系统将JWT发送给用户。
  4. 用户在随后的每个请求中将JWT放在HTTP头部或URL中发送给服务器。
  5. 服务器接收到JWT后,首先验证其签名,然后解析JWT以获取用户信息。

PS:因为jwt可能很长, 前端项目的话得存到LocalStorage/SessionStorage中,cookies和header有大小限制,都不太合适。

3. 优缺点:

优点:

  • 无状态和可扩展:服务器不需要存储会话信息,JWT自身包含了所有必要的信息。
  • 安全性:JWT可以被签名,确保数据在传输过程中不被篡改。
  • 跨域认证:由于JWT是自包含的,它可以在不同的服务和域之间安全地传递。

缺点:

  • 性能:JWT通常比传统的会话存储机制要大,可能会增加网络传输的开销。
  • 存储:由于JWT通常包含敏感信息,需要在客户端安全存储。
  • 过期:JWT可以设置过期时间,但过期后的处理需要额外的逻辑。

Comments

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注