文章目录
-
- 一、背景知识:什么是单体与分布式?
- 二、演变过程
-
- [1. 经典开局:Session 机制(单机时代)](#1. 经典开局:Session 机制(单机时代))
- [2. 遭遇瓶颈:单点故障与单独机器管理](#2. 遭遇瓶颈:单点故障与单独机器管理)
- [3. 进阶演进:分布式环境单独用 Redis 集群](#3. 进阶演进:分布式环境单独用 Redis 集群)
-
- [方案 A 架构图:Redis 集群管理 Session](#方案 A 架构图:Redis 集群管理 Session)
- [为什么传统的 Session 管理在分布式下还是有问题?](#为什么传统的 Session 管理在分布式下还是有问题?)
- [4. 终极救场:分布式环境使用 Token (JWT)](#4. 终极救场:分布式环境使用 Token (JWT))
-
- [方案 B 架构图:分布式环境使用 Token (JWT)](#方案 B 架构图:分布式环境使用 Token (JWT))
- 三、总结:两者的核心差异
在构建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
分布式微服务集群
- 带着 SessionID 请求
- 跨网络查询 Session 状态
- 返回用户 Session 数据
- 校验通过, 分发请求
- 校验通过, 分发请求
User / 客户端
Controller / 认证中间件
Redis 集群 / 分布式Session库
Order Service / 业务服务A
Inventory Service / 业务服务B
为什么传统的 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
分布式微服务集群
- 带着 JWT Token 请求
- 本地通过密钥校验/解密 JWT
- 提取出用户数据, 直接转发
- 提取出用户数据, 直接转发
去中心化: 无需访问 Session 库
User / 客户端
Controller / 认证中间件
Order Service / 业务服务A
Inventory Service / 业务服务B
分布式数据源
三、总结:两者的核心差异
| 特性 | 集中式 Session (如 Redis 集群) | JWT (Token 机制) |
|---|---|---|
| 状态存储 | 有状态(Stateful),数据存在服务器端 | 无状态(Stateless),数据存在客户端 |
| 服务器内存 | 随用户量增长而膨胀(需额外机器维护) | 几乎不占服务器内存 |
| 网络开销 | 中间件每次校验都需要跨网络请求一次 Redis | 纯本地 CPU 运算验签,无额外网络开销 |
| 退出登录 | 极其简单,直接从 Redis 删掉即可 | 较麻烦,因为 Token 发出去就失控了(通常需配合黑名单) |
结语:
没有绝对完美的架构,只有最适合业务的选择。如果你的系统是中小型单体应用,集中式 Session 简单好用;但如果你面对的是追求高并发、高可用、去中心化的分布式微服务架构,那么使用 JWT(Token)无疑是更优雅、更具扩展性的现代化解决方案。