什么是JWT
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全传输信息。它是基于JSON的轻量级令牌,适合分布式系统和微服务架构。
核心思想
- 通过服务端生成令牌,有客户端储存并跟随请求发送(通常在请求头里),由服务端验证令牌的有效性。
- 无需在服务端存储会话信息(无状态)
结构
JWT由三部分组成,用.分隔:Header.Payload.Signature。
- Header(头部):
包含令牌类型(typ: "JWT")和签名算法(如alg: "HS256")。如:
{
"alg": "HS256",
"typ": "JWT"
}
- Payload(负载):
- 存放自定义的一些值,如userId、角色等。
- 一些声明、如:标准声明(iss【签发者】、exp【过期时间】、sub【主题】等)、公共声明、私有声明。
- Signature(签名):
- 对
Header和Payload的签名,防止数据篡改。 - 生成方式:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)。
- 对
值的⚠️注意的是,像Header、Payload里面只是简单的使用了Base64加密,所以它们是明文的,可以被解析和读取的,所以禁止存放敏感信息。
JWT的工作流程
- 用户登录:客户端发送凭据(如用户名/密码)到服务器。
- 生成JWT:服务器验证凭据,生成JWT并返回给客户端。
- 客户端存储:客户端(通常是浏览器)将JWT保存到
localStorage或Cookie中。 - 携带JWT请求:客户端在后续请求的
Authorization头中附加JWT(如Bearer <token>)。 - 服务器验证:服务器检查签名和声明(如过期时间),返回数据或拒绝请求。
JWT的优点与缺点
- 优点:
- 无状态,适合分布式系统。
- 跨域支持,适合前后端分离和微服务。
- 信息自包含,减少数据库查询。
- 缺点:
- 令牌一旦签发,无法中途废止(需结合黑名单或短有效期解决)。
- 负载过大可能影响性能(因需随请求发送)。
- 需妥善保管密钥,防止泄露。