什么是 JSON Web令牌?
JSON Web令牌是一种紧凑的、URL 安全的方式,用于在两方之间传递声明。JWT 中的声明被编码为 JSON 对象,并使用加密算法进行数字签名。
快速了解
| 全称 | JSON Web Token(JSON 网络令牌) |
|---|---|
| 创建时间 | 2010 年(2015 年在 RFC 7519 中标准化) |
| 规范文档 | 官方规范 |
工作原理
JWT 由三部分组成,用点号分隔:头部(Header)、载荷(Payload)和签名(Signature)。头部通常包含令牌类型(JWT)和签名算法(如 HS256、RS256)。载荷包含声明 - 关于用户和附加元数据的陈述。签名是通过编码头部和载荷,然后用密钥签名创建的。JWT 是自包含的,意味着所有必要信息都在令牌本身中,无需在验证时查询数据库。
主要特点
- 自包含 - 令牌内携带所有必要信息
- 紧凑 - 可通过 URL、POST 参数或 HTTP 头发送
- 无状态认证 - 服务器无需存储会话数据
- 数字签名 - 可验证完整性
- 可加密(JWE)以保护机密性
- 有过期时间(exp 声明)以确保安全
常见用途
- Web 和移动应用中的用户认证
- 跨多个域的单点登录(SSO)
- API 授权和访问控制
- 服务之间的信息交换
- 无状态会话管理
示例
Loading code...常见问题
JWT 安全吗?任何人都可以解码吗?
JWT 载荷是 Base64 编码的,不是加密的,所以任何人都可以解码并读取内容。签名确保令牌没有被篡改,但不会隐藏数据。永远不要在 JWT 载荷中存储敏感信息如密码。对于机密数据,请使用 JWE(JSON Web 加密)。
JWT 过期后会发生什么?
当 JWT 过期(基于 'exp' 声明)时,它将变为无效,服务器应拒绝该令牌。用户需要获取新令牌,通常通过重新认证或使用刷新令牌。使用短过期时间配合刷新令牌是安全最佳实践。
在 Web 应用中应该将 JWT 令牌存储在哪里?
最安全的选择是 HttpOnly cookie,它可以防止 JavaScript 访问并防御 XSS 攻击。避免使用 localStorage,因为它容易受到 XSS 攻击。如果必须使用 localStorage,请实施额外的安全措施,如令牌指纹和短过期时间。
HS256 和 RS256 算法有什么区别?
HS256 是对称算法,使用单个密钥进行签名和验证,适用于同一方签名和验证的场景。RS256 是非对称算法,使用私钥签名,公钥验证,适合分布式系统,多个服务需要在不知道签名密钥的情况下验证令牌。
如何在 JWT 过期前使其失效或撤销?
JWT 设计上是无状态的,这使得立即撤销具有挑战性。常见方法包括:在数据库或缓存(如 Redis)中维护令牌黑名单、使用可撤销的刷新令牌配合短过期时间的访问令牌,或在用户级别实现令牌版本控制。