JSON Web Token (JWT) 详解:由来、原理与应用实践
1. JWT的由来与发展背景
1.1 HTTP无状态性带来的挑战
HTTP协议本质上是无状态的,这意味着服务器不会记住之前的请求信息。在早期的Web应用中,用户每次访问受保护资源都需要重新登录,这显然不是良好的用户体验。为解决这一问题,开发者引入了Cookie技术,通过在请求和响应报文中写入Cookie信息来控制客户端状态。
1.2 Session认证机制的局限性
传统的基于Session的身份认证机制虽然解决了HTTP无状态的问题,但随着互联网应用的发展,逐渐暴露出几个关键问题:
1.服务器压力增大:每个认证用户都需要在服务端保存Session数据,随着用户量增长,服务器内存消耗显著增加。
2.扩展性问题:在分布式系统或集群环境下,Session数据通常存储在单台服务器内存中,当用户请求被负载均衡到不同服务器时,会出现Session不一致的问题。
3.CSRF攻击风险:Session机制依赖Cookie,容易受到跨站请求伪造(CSRF)攻击。
4.移动端适配困难:移动应用对Cookie的支持不如浏览器完善,使得基于Session的认证在移动端表现不佳。
1.3 JWT的诞生
为解决上述问题,JSON Web Token(JWT)应运而生。JWT是一种开放标准(RFC 7519),定义了一种紧凑且自包含的方式,用于在各方之间安全地传输JSON格式的信息。JWT的设计理念是将用户认证信息直接包含在Token中,而不是存储在服务器端,从而实现了无状态认证。
2. JWT的核心结构与工作原理
2.1 JWT的组成结构
JWT由三部分组成,使用点号(.)连接:`Header.Payload.Signature`
2.1.1 Header(头部)
头部通常包含两部分信息:
typ:令牌类型,固定为"JWT"
alg:签名算法,如HS256(HMAC SHA-256)或RS256(RSA SHA-256)
示例:
json
{
"alg": "HS256",
"typ": "JWT"
}
头部经过Base64Url编码后形成JWT的第一部分。
2.1.2 Payload(负载)
负载包含声明(claims),即关于实体(通常是用户)和其他元数据的声明。声明分为三种类型:
1. 注册声明(Registered claims):预定义的声明,建议但不强制使用:
- iss (issuer):签发者
- exp (expiration time):过期时间
- sub (subject):主题(用户ID)
- aud (audience):接收方
- iat (issued at):签发时间
- nbf (not before):生效时间
- jti (JWT ID):唯一标识
2. 公共声明(Public claims):可以自定义的公开字段,应避免冲突
3. 私有声明(Private claims):提供者和消费者共同定义的声明
示例: