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)无疑是更优雅、更具扩展性的现代化解决方案。

相关推荐
天空属于哈夫克32 天前
企业微信二次开发:精准实现关键词自动回复
架构·企业微信
晨米酱3 天前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
moMo3 天前
从固定流程到问题路由:让 LangGraph RAG 按需检索
架构
白远山3 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
LorryJovens3 天前
【LAAP科研】双系统具身AGI范式研究——基于LAAP认知架构与Jev概率决策模型的系统性技术调研与范式验证
人工智能·gpt·安全·架构
JQweryuiop3 天前
中小型游戏陪练工作室数字化管理实践:基于七彩屋电竞护航小程序订单、履约与绩效系统的落地复盘
大数据·游戏·小程序·架构
LONGZETECH3 天前
一线职教实测:风光 580 汽车故障诊断仿真系统,破解实车实训四大核心痛点
人工智能·学习·安全·架构·汽车
萧瑟余晖3 天前
Netty 核心组件与 Reactor 模型详解
网络·架构