title | date |
---|---|
JWT |
2020-06-10 09:01:15 -0700 |
Header.Payload.Signature
- Header: 头部通常由两部分组成,即令牌的类型(typ)和所使用的算法(alg)。例如,一个头部可能是 {"alg": "HS256", "typ": "JWT"},表示使用 HMAC SHA-256 算法对令牌进行签名。
- Payload: 载荷包含了 JWT 的声明信息,用于描述令牌的相关内容。比如可以存储一些用户的基本信息。
- Signature: 签名用于验证令牌的完整性和真实性。签名通常由头部、载荷和密钥一起计算而得。
JWT 的优点
- 无状态性:JWT 是无状态的,服务器不需要在后端存储会话信息,减轻了服务器负担。
- 安全性:JWT 使用签名来验证令牌的真实性,防止了篡改和伪造。
- 可扩展性:JWT 可以通过在 Payload 中添加自定义的声明来传递任意数据,实现了更多的功能。
- 跨语言:JWT 是一种跨语言的标准,因为它使用 JSON 格式作为数据载体,并且它的标准规范是语言无关的。这意味着无论使用哪种编程语言编写的应用程序,都可以轻松地生成和解析 JWT。
JWT 的缺点
- 无法撤销令牌:一旦颁发了 JWT,就无法在令牌的有效期内撤销它。即使用户的权限发生变化或者令牌被泄露,令牌也仍然有效,直到过期时间到期为止。
- 安全性依赖于签名算法:JWT 的安全性取决于签名算法的强度。如果使用了弱算法或者密钥管理不当,可能会导致签名被破解,从而使得 JWT 变得不安全。
- 无法处理令牌刷新:JWT 本身不提供令牌刷新功能,需要额外的机制来实现。这使得在令牌到期后,客户端需要重新进行身份验证,可能会增加一定的复杂性。
- 不适合存储敏感信息:JWT 虽然可以对 Payload 进行加密,但是加密后的 Payload 仍然可以被解析出来。因此,不建议在 JWT 中存储敏感信息,如密码等。
通常和后端协同 RefreshToken 来主动刷新令牌权限