从 Session 到 JWT:Web 认证系统的发展与 JWT 原理详解

从 Session 到 JWT:Web 认证系统的发展与 JWT 原理详解 文章目录前言一、Web 认证系统的发展史1.第一代认证方案Cookie Session2.Session 方案的问题开始出现1. Session 存储压力大2. 分布式系统难处理3. 移动端时代到来二、JWT 是什么三、JWT 的结构到底长什么样1.第一部分Header头部2.第二部分Payload载荷3.第三部分Signature签名四、JWT 的完整认证流程五、为什么 JWT 会这么流行1. 无状态2. 天然适合前后端分离3. 微服务友好六、JWT 的缺点1. Token 无法主动失效2. Token 泄露风险3. JWT 不适合存太多数据七、JWT 为什么成为现代 Web 主流前言在 Web 开发中“认证”是一个绕不开的话题。简单来说认证系统解决的问题其实只有一个“服务器怎么知道你是谁”比如你登录了一个音乐平台、电商网站或者后台管理系统之后你刷新页面、切换功能、甚至第二天再回来系统依然知道你是哪个用户。这背后依赖的就是 Web 认证系统。很多初学者第一次接触认证时会觉得 JWT、Session、Token 这些概念特别绕。但实际上只要理解它们的发展过程你会发现 JWT 的出现其实非常自然。一、Web 认证系统的发展史HTTP 协议有一个天然特点每一次请求都是独立的。服务器不会记住你之前做过什么。举个例子你第一次请求POST /login服务器知道你登录了。但第二次请求GET /user/info服务器其实已经“不认识你了”。因此Web 认证系统本质上就是想办法让服务器持续记住用户身份。1.第一代认证方案Cookie Session早期互联网最经典的方案就是Cookie Session它的工作流程其实不复杂。用户登录用户名 密码 ↓ 服务器验证成功 ↓ 服务器创建 Session ↓ 生成 SessionID ↓ 把 SessionID 返回给浏览器 Cookie之后浏览器每次请求Cookie: sessionidxxxx服务器就能根据 SessionID 找到对应用户。整个过程如下浏览器 ↓ 携带 SessionID 服务器 ↓ 查询 Session 找到用户信息这个方案统治了 Web 很多年。因为它简单、稳定而且容易理解。2.Session 方案的问题开始出现随着互联网规模越来越大Session 的问题也逐渐暴露。比如1. Session 存储压力大Session 通常保存在服务器内存中。如果有几十万用户在线服务器需要保存几十万个 Session内存压力会非常大。2. 分布式系统难处理后来网站开始变成负载均衡 ↓ 多台服务器问题来了用户第一次登录在 A 服务器。第二次请求被转发到了 B 服务器。但B 服务器没有这个 Session用户就会掉登录状态。于是开发者不得不引入RedisSession 共享Session 同步系统复杂度迅速上升。3. 移动端时代到来Session 更适合传统浏览器。但后来AndroidiOS小程序前后端分离微服务越来越普及。这时候大家开始需要一种更轻量、更独立的认证方案JWT 就是在这种背景下出现的。二、JWT 是什么JWT 全称JSON Web Token它本质上是一个经过签名的字符串。服务器把用户信息直接放进 Token 中。之后客户端自己保存 Token每次请求时Authorization: Bearer xxxxx服务器只需要验证 Token 是否合法即可。不再需要保存 Session。这就是 JWT 最大的特点无状态认证三、JWT 的结构到底长什么样JWT 通常由三部分组成Header.Payload.Signature例如xxxxx.yyyyy.zzzzz三部分之间用.分隔。1.第一部分Header头部Header 记录Token 类型加密算法例如{alg:HS256,typ:JWT}意思是使用 HS256 算法 Token 类型是 JWT2.第二部分Payload载荷Payload 存放用户信息。例如{id:1,username:admin,role:super_admin}这里通常会保存用户ID用户名权限信息过期时间比如{exp:1710000000}表示 Token 什么时候失效。需要注意Payload 只是 Base64 编码并不是加密。因此不要在 JWT 里存密码3.第三部分Signature签名Signature 是 JWT 最核心的部分。服务器会使用Header Payload 密钥生成签名。例如HMACSHA256( base64(Header) . base64(Payload), secret )这样可以保证Token 不会被篡改因为攻击者没有服务器密钥。四、JWT 的完整认证流程JWT 的登录流程其实非常清晰在前后端分离项目中经常会这样传递Authorization: Bearer token后端拿到 Token 后验证签名 验证是否过期 解析 Payload 获取用户信息整个过程不需要查询 Session。五、为什么 JWT 会这么流行JWT 在现代 Web 开发里几乎随处可见。尤其是FastAPISpringBootNode.js微服务前后端分离项目原因主要有几个。1. 无状态服务器不保存 Session。系统扩展更容易。非常适合分布式系统2. 天然适合前后端分离前端只需要保存 Token。请求时自动携带即可。移动端、小程序也很方便。3. 微服务友好多个服务都可以验证 JWT。不需要共享 Session。例如用户服务 订单服务 支付服务都可以识别同一个 Token。六、JWT 的缺点JWT 并不是完美方案。它也有明显缺点。1. Token 无法主动失效Session 可以服务器直接删除用户立刻下线。但 JWT 已经发给客户端后服务器无法直接收回除非设置短期过期时间加黑名单配合 Redis2. Token 泄露风险如果 JWT 被盗别人就能直接伪装用户因此必须使用 HTTPS不要乱存 Token注意 XSS 攻击3. JWT 不适合存太多数据因为每次请求都会携带 JWT如果 Payload 太大请求体会变大影响性能。七、JWT 为什么成为现代 Web 主流实际上JWT 的流行并不是因为它“高级”。而是因为现代互联网架构变了从单体网站变成前后端分离 微服务 移动端 云原生 分布式系统传统 Session 越来越难适应。而 JWT 的“无状态”特性刚好解决了这些问题。因此JWT 成为了现代 Web 认证的重要方案当然在真实项目里很多大型系统其实是 Session JWT 混合使用。因为没有任何认证方案是绝对完美的。技术的发展本质上一直都是不断在“安全性、性能、复杂度”之间做平衡而 JWT就是现代 Web 在这个平衡中的一个重要选择。