JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。这种信息可以被验证和信任,因为它是数字签名的。
JWT由三部分组成,用点(.)分隔:头部(Header)、有效载荷(Payload)和签名(Signature)。头部指定签名算法,有效载荷包含声明,签名用于验证消息未被篡改。
认证(最常见的场景)、信息交换(JWT可以安全地传输信息,因为它们可以被签名)、授权(包含用户权限信息)以及单点登录实现。
JWT支持多种签名算法,主要分为两类:基于HMAC的对称算法(如HS256)和基于RSA/ECDSA的非对称算法(如RS256、ES256)。对称算法使用相同的密钥签名和验证,非对称算法使用私钥签名,公钥验证。
不要在JWT中存储敏感信息(如密码),因为JWT的有效载荷部分只是Base64编码,不是加密的。对于需要高安全性的应用,建议使用较短的过期时间并实施令牌轮换策略。
当JWT过期后,服务器会拒绝这个令牌。推荐的处理方式是实现刷新令牌(Refresh Token)机制,客户端使用刷新令牌获取新的访问令牌,而不必要求用户重新登录。刷新令牌通常有更长的有效期,但应该谨慎存储。
严格来说,JWT设计为无状态令牌,不能被真正撤销。但有几种常见解决方案:维护已撤销令牌的黑名单(可能会抵消JWT无状态的优势),使用较短的过期时间配合刷新令牌,或者在令牌中嵌入版本标识,服务器可以拒绝旧版本。
JWT是自包含的令牌,包含所有必要信息,适合分布式系统,不需要服务器存储会话状态。Session基于服务器端存储,需要维护会话状态,更适合单服务器架构。JWT对扩展更友好,但撤销复杂;Session易于撤销,但扩展性较差。