JWT
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为 JSON 对象传输。这种信息通常被称为“声明”,它们被封装在 JWT 中,可以在各方之间传递而不需要担心被篡改或阅读。
JWT 的基本结构
JWT 由三部分组成,分别是 Header(头部)、Payload(载荷)和 Signature(签名),这三部分用点号.连接在一起形成一个完整的 JWT 字符串。
Header:包含令牌的类型(即 JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。例如:
json{ "alg": "HS256", "typ": "JWT" }Payload:包含声明(claims)。声明是关于实体(通常是用户)和其他数据的声明。声明分为三种类型:注册声明、公共声明和私有声明。
- 注册声明:提供了一组预定义的声明,比如
iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等。 - 公共声明:可以随意定义,但为了避免冲突应遵循 IANA JSON Web Token Registry 的规定。
- 私有声明:双方同意定义的声明,既不是注册声明也不是公共声明。
示例 payload:
json{ "sub": "1234567890", "name": "John Doe", "admin": true }- 注册声明:提供了一组预定义的声明,比如
Signature:为了验证消息在传输过程中没有被更改,并且对于使用私钥签名的情况,还可以确保发送者就是声称的那个实体。签名是通过以下方式创建的:
plaintextHMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
使用场景
- 认证:这是最常见的用途之一。一旦用户登录,后续每个请求都会包含 JWT,允许用户访问该令牌允许的服务和资源。
- 信息交换:由于 JWT 可以被签名,例如使用公钥/私钥对,因此你可以确保发件人是他们所说的那个人。此外,由于签名是使用头和有效负载计算得出的,您还可以验证内容是否未被篡改。
JWT 的优点
- 自包含性:所有必要的信息都在令牌内,减少了数据库查询的需求。
- 跨域支持:非常适合单页应用程序(SPA)以及跨域资源共享(CORS)的问题。
- 效率高:由于其紧凑的结构,JWT 非常适合在 HTTP 头部进行传输。
安全注意事项
尽管 JWT 提供了多种安全特性,但在实际应用中仍需注意:
- 保护好密钥:如果使用的是对称加密,则必须严格保密密钥;如果是非对称加密,则需要妥善保管私钥。
- 设置合理的过期时间:避免长期有效的令牌,减少令牌泄露的风险。
- 不要在 JWT 中存储敏感信息:即使进行了加密处理,也尽量避免在 JWT 中直接存储敏感数据。
JWT 是一个强大的工具,可以帮助开发者构建更加安全和高效的 Web 服务。理解如何正确生成、验证和使用 JWT 对于开发高质量的应用程序至关重要。