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. 举例使用流程:
- 用户使用用户名和密码登录。
- 系统验证用户身份后,生成一个包含用户信息和其他必要数据的JWT。
- 系统将JWT发送给用户。
- 用户在随后的每个请求中将JWT放在HTTP头部或URL中发送给服务器。
- 服务器接收到JWT后,首先验证其签名,然后解析JWT以获取用户信息。
PS:因为jwt可能很长, 前端项目的话得存到LocalStorage/SessionStorage中,cookies和header有大小限制,都不太合适。
3. 优缺点:
优点:
- 无状态和可扩展:服务器不需要存储会话信息,JWT自身包含了所有必要的信息。
- 安全性:JWT可以被签名,确保数据在传输过程中不被篡改。
- 跨域认证:由于JWT是自包含的,它可以在不同的服务和域之间安全地传递。
缺点:
- 性能:JWT通常比传统的会话存储机制要大,可能会增加网络传输的开销。
- 存储:由于JWT通常包含敏感信息,需要在客户端安全存储。
- 过期:JWT可以设置过期时间,但过期后的处理需要额外的逻辑。
发表回复