Web认证机制演进

文章目录

    • 一、背景知识:什么是单体与分布式?
    • 二、演变过程
      • [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
分布式微服务集群

  1. 带着 SessionID 请求
  2. 跨网络查询 Session 状态
  3. 返回用户 Session 数据
  4. 校验通过, 分发请求
  5. 校验通过, 分发请求
    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
分布式微服务集群

  1. 带着 JWT Token 请求
  2. 本地通过密钥校验/解密 JWT
  3. 提取出用户数据, 直接转发
  4. 提取出用户数据, 直接转发
    去中心化: 无需访问 Session 库
    User / 客户端
    Controller / 认证中间件
    Order Service / 业务服务A
    Inventory Service / 业务服务B
    分布式数据源

三、总结:两者的核心差异

特性 集中式 Session (如 Redis 集群) JWT (Token 机制)
状态存储 有状态(Stateful),数据存在服务器端 无状态(Stateless),数据存在客户端
服务器内存 随用户量增长而膨胀(需额外机器维护) 几乎不占服务器内存
网络开销 中间件每次校验都需要跨网络请求一次 Redis 纯本地 CPU 运算验签,无额外网络开销
退出登录 极其简单,直接从 Redis 删掉即可 较麻烦,因为 Token 发出去就失控了(通常需配合黑名单)

结语

没有绝对完美的架构,只有最适合业务的选择。如果你的系统是中小型单体应用,集中式 Session 简单好用;但如果你面对的是追求高并发、高可用、去中心化的分布式微服务架构,那么使用 JWT(Token)无疑是更优雅、更具扩展性的现代化解决方案。

相关推荐
Donk_677 小时前
ELK+Redis架构搭建
redis·elk·架构
龙佚7 小时前
RTC语音质量优化实战:搭建完整语音系统
算法·架构
泥秋哥8 小时前
微前端-Module Federation运行时工具
前端·架构
国科安芯8 小时前
ASM232S抗辐照RS-232收发器的技术架构与空间环境适应性研究
单片机·嵌入式硬件·安全·架构·安全性测试
心中有国也有家8 小时前
PaddlePaddle 适配 NPU 的技术全解析——从算子接入到端到端性能优化
人工智能·分布式·算法·性能优化·架构·paddlepaddle
GISer_Jing8 小时前
Three.js渲染架构:从WebGL到WebGPU的演进
javascript·架构·webgl
SuniaWang9 小时前
《Agentx专栏》03-架构设计:AgentX的六层架构是如何生长出来的
java·数据库·redis·docker·ai·架构
anyup9 小时前
uni-app X 全屏引导页组件,一套支持 App、H5、小程序多端引导
前端·架构·uni-app
郑寿昌10 小时前
2026脑机接口与大模型融合架构解析
大数据·人工智能·架构