Web认证机制演进
文章目录
在构建Web应用时,如何识别“你是谁”永远是核心问题。很多初学者在面对 Session、分布式 Session 和 JWT(JSON Web Token)时经常一头雾水。今天我们就拆解一下由于 架构演进而逼出来的认证技术变迁史。
一、背景知识:什么是单体与分布式?
在聊认证之前,我们得先搞清楚两代系统架构的区别。
什么是单体架构?(Monolith)
- 概念:所有的业务功能(比如用户系统、商品系统、订单系统)全部写在同一个代码工程里,并最终打包部署在同一台服务器上。
- 通俗比喻:单体架构就像是一家全能的“杂货店”。老板一个人既当收银员,又当理货员,还兼职打扫卫生。
- 特点:开发和部署极其简单。但如果某一天系统某个功能崩溃或内存溢出,整家店就得被迫暂停营业(整个网站宕机)。
什么是分布式架构?(Distributed)
- 概念:当业务庞大到一台服务器装不下时,我们将一个庞大的单体系统拆分成多个独立的、小巧的子系统(微服务)。这些服务部署在不同的机器上,通过网络进行通信和协作。
- 通俗比喻:分布式架构就像是一家大型的“现代化超级市场”。有专门的收银组、安保组、理货组、仓储组。
- 带来的挑战:既然大家分工在不同的岗位(不同的机器),那么“安保组(中间件)”怎么知道进店的顾客是不是已经去“办卡处”登记过了? 这就引发了我们下面的故事。
二、演变过程
1. 经典开局:Session 机制(单机时代)

在早期单体架构下,最常见的做法是使用 Session(会话)。
- 工作原理:用户登录成功后,服务器在内存里开辟一块空间记录用户信息,并给浏览器发一个叫
SessionID的 Cookie。以后浏览器每次请求都带上这个 ID,服务er器去内存里查一下session。
2. 遭遇瓶颈:单点故障与单独机器管理
当网站流量变大,单台服务器扛不住了,我们搞了多台机器做负载均衡。这时候,经典的 Session 机制就崩了:
用户在 A 机器登录了,第二次请求被分流到了 B 机器,B 机器的内存里根本没有这个 Session,结果用户发现自己莫名其妙被登出了。
为了解决这个问题,大家想到了一个办法:单独用一台机器管理 Session(比如用一台专用的 Tomcat 来统一存放所有 Session)。
然而,这种设计很快迎来了新的噩梦:单点故障 (SPOF - Single Point of Failure)。
如果这台专门管理 Session 的机器由于硬件故障、网络波动或者内存撑爆而宕机,整个系统的登录功能全部瘫痪,所有在线用户瞬间被迫下线。
3. 进阶演进:分布式环境单独用 Redis 集群
有人会说:“单点故障好办啊!我们把单独的 Session 机器搞成集群(比如 Redis 集群),做高可用不就行了?”
确实,分布式环境单独用 Redis 集群管理 Session(即“Session 集中化管理”)是目前很多中大型系统的标配。它通过主从复制或分片,让某一台 Redis 宕机时,备用节点能自动顶上。
方案 A 架构图:Redis 集群管理 Session
Code snippet
为什么传统的 Session 管理在分布式下还是有问题?
随着微服务架构的进一步普及,Redis 集群方案依然存在以下痛点:
- 网络开销与延迟:每次业务微服务(可能多达几十个)在处理请求前,
Controller / 认证中间件都必须跨网络去远程读取一次 Redis。在高并发下,这笔网络 I/O 开销和延迟不容小觑。 - 强耦合性:所有的微服务都必须依赖同一个缓存集群。一旦缓存集群出现严重的网络分区或性能瓶颈,会波及所有业务。
4. 终极救场:分布式环境使用 Token (JWT)
为了彻底摆脱“服务器必须存数据”的紧箍咒,JWT (JSON Web Token) 应运而生。它直接颠覆了传统的认证逻辑:服务器不再保存任何会话数据,改由客户端自己保存。
- 工作原理:用户登录成功后,服务器把用户信息(比如用户 ID)写进一个 JSON 对象里,用只有服务器知道的“密钥”对其进行数字签名,然后把这个带有签名的 Token 发给浏览器。
- 如何校验:以后浏览器每次请求都把 Token 放在 HTTP Header 里传过来。
Controller / 认证中间件拿到后,不需要查 Redis,直接用自己的密钥在本地进行 CPU 验签。只要签名对得上且没过期,就证明身份合法。
方案 B 架构图:分布式环境使用 Token (JWT)
Code snippet
三、总结:两者的核心差异
| 特性 | 集中式 Session (如 Redis 集群) | JWT (Token 机制) |
|---|---|---|
| 状态存储 | 有状态(Stateful),数据存在服务器端 | 无状态(Stateless),数据存在客户端 |
| 服务器内存 | 随用户量增长而膨胀(需额外机器维护) | 几乎不占服务器内存 |
| 网络开销 | 中间件每次校验都需要跨网络请求一次 Redis | 纯本地 CPU 运算验签,无额外网络开销 |
| 退出登录 | 极其简单,直接从 Redis 删掉即可 | 较麻烦,因为 Token 发出去就失控了(通常需配合黑名单) |
结语:
没有绝对完美的架构,只有最适合业务的选择。如果你的系统是中小型单体应用,集中式 Session 简单好用;但如果你面对的是追求高并发、高可用、去中心化的分布式微服务架构,那么使用 JWT(Token)无疑是更优雅、更具扩展性的现代化解决方案。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)