一、概述
JWT是一种开放标准(RFC 7519),用于在网络上安全地传输信息。它以JSON格式为载体,通过数字签名来保证信息的完整性和真实性。JWT常用于身份认证和授权,但也可以用于信息交换等其他场景。
二、组成部分
-
Header(头部)
- 描述JWT的基本信息,如类型和签名算法。
- 示例:{
"alg": "HS256",
"typ": "JWT"
} 对头部进行Base64编码,得到第一部分。
-
Payload(负载)
包含一系列声明(claims),这些声明是关于实体(通常是用户)和附加数据的声明。
声明分为三类:
注册声明:预定义的声明,如iss(发行者)、sub(主题)、exp(过期时间)、iat(发行时间)等。
公共声明:自定义的声明,但应避免与注册声明冲突。
私有声明:特定场景下使用的声明,同样应避免与注册声明冲突。
示例:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
对负载进行Base64编码,得到第二部分。
Signature(签名)
用于验证JWT的完整性,确保在传输过程中未被篡改。
签名计算公式:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
其中,secret是用于签名的密钥,可以是共享密钥或私钥。
对签名进行Base64编码,得到第三部分。
三、签名算法JWT支持多种签名算法,包括:
对称加密算法:如HS256、HS384、HS512,使用同一个密钥进行签名和验证。
非对称加密算法:如RS256、RS384、RS512,使用公钥和私钥对,私钥签名,公钥验证。
四、使用场景身份认证:用户登录后,服务器生成JWT并返回给客户端,客户端后续请求时携带JWT,服务器验证JWT以确认用户身份。
信息交换:在多个系统间安全地传输信息,确保信息未被篡改。
授权:用于验证用户是否有权限执行某项操作,如API访问控制。
五、优点紧凑:JWT体积小,便于传输,特别适合移动应用和分布式系统。
自包含:JWT包含所有必要的信息,减少了对服务器的查询,提高了性能。
安全:通过签名确保了JWT的完整性,部分算法还提供了加密功能以保护隐私。
六、安全考虑密钥管理:确保密钥的安全存储和传输,避免密钥泄露。
过期时间:设置合理的过期时间,避免JWT被长时间使用,减少安全风险。
防止重放攻击:可以引入nonce(一次性数字)或时间戳来防止重放攻击。
敏感信息:避免在JWT中传输敏感信息,除非进行了加密。即使进行了加密,也应谨慎处理。
七、与其他认证方式的比较与Session相比:
JWT无状态,不依赖服务器存储,适用于分布式系统;而Session需要服务器存储会话信息,不适合分布式系统。
JWT可以跨域使用,而Session通常受限于单个域名。
与OAuth相比:
JWT更简单,适用于单点登录等场景;而OAuth是一种更复杂的授权框架,适用于更复杂的授权场景。
八、实现与工具Java:可以使用jjwt库。
Python:可以使用pyjwt库。
JavaScript:可以使用jsonwebtoken库。
在线工具:如jwt.io,可以用于解码、编码和验证JWT。
九、JWT的使用流程用户登录:用户提交用户名和密码等身份信息。
服务器验证:服务器验证用户身份信息,如成功,则生成JWT。
返回JWT:服务器将生成的JWT返回给客户端。
客户端存储JWT:客户端将JWT存储在本地,如Cookie或LocalStorage。
客户端请求:客户端在后续请求时携带JWT。
服务器验证JWT:服务器验证JWT的有效性,如有效,则处理请求。
十、JWT的局限性无法撤销:一旦JWT生成并发放给客户端,除非过期,否则无法主动撤销。
性能开销:对于大量用户和频繁请求的场景,验证JWT可能会带来一定的性能开销。
敏感信息泄露风险:如果JWT中包含敏感信息且未进行加密,存在泄露风险