一、透过现象看本质:服务器如何识别用户?

HTTP 是无状态协议
也就是说:

服务器不知道你是谁

例如:

请求1:登录
请求2:查看订单

服务器其实无法知道:

这两个请求是不是同一个人

所以必须有一种机制:

让服务器识别用户身份

这就是:

登录态(Login State)

而 Session 和 JWT,本质上都是解决:

如何在多次请求中识别用户

二、Session 登录机制

传统的方式:Session
Session 登录流程

第一步:用户登录
客户端发送:

POST /login
username
password

服务器验证成功。

第二步:服务器创建 Session
服务器会生成一个:

sessionId
例如:

abc123xyz

然后服务器保存:

sessionId → 用户信息

存在:

服务器内存
Redis
数据库

例如:

abc123xyz → userId=1001

第三步:返回 Cookie
服务器返回:

Set-Cookie: sessionId=abc123xyz

浏览器自动保存。

第四步:后续请求
之后所有请求都会带上:

Cookie: sessionId=abc123xyz

服务器收到请求后:

查询 sessionId

找到:

userId=1001

于是知道:

这个用户是谁

Session 结构

本质是:

客户端

│ sessionId

服务器

└ sessionId → 用户信息

核心特点:

用户信息存服务器

所以:

Session = 有状态认证

三、Session 的问题

Session 在 单机系统很好用

但在互联网架构里会出现问题。

假设有三个服务器:

用户


负载均衡
├─ server1
├─ server2
└─ server3

问题来了:

Session 在 server1

下一次请求可能到:

server2

server2 没有 Session。

用户就会:

登录失效

解决方案

有两个方案:

方案1:Session复制

server1 → server2 → server3

同步 Session。

缺点:

性能差
复杂

方案2:Session集中存储
例如使用:

:contentReference[oaicite:0]{index=0}

结构:

server → Redis → session

这样所有服务器都能访问 Session。

但问题是:

服务器仍然需要存状态

这就是:

Session 的核心问题

四、JWT 登录机制

JWT 的设计理念是:

服务器不要存登录状态

所以叫:

无状态认证

JWT 全称:

JSON Web Token

JWT 登录流程

第一步:用户登录
客户端发送:

username
password

服务器验证成功。

第二步:服务器生成 JWT
服务器生成一个 Token:

header.payload.signature

例如:

xxxxx.yyyyy.zzzzz

payload 里面直接包含:

userId
username
expireTime

例如:

{
userId:1001,
exp:1700000000
}

然后服务器用 密钥签名(HS256和RS256)
如下超链接是HS256和RS256的区分。
签名算法HS256和RS256

第三步:返回 Token
服务器返回:

token

客户端保存。

通常放在:

localStorage

或者:

Authorization header

第四步:后续请求
客户端请求:

Authorization: Bearer token

服务器收到后:

解析 token
验证签名

如果合法:

直接获取 userId

不需要查数据库。

五、JWT 的结构
JWT 结构:

客户端

│ token

服务器

解析token

核心特点:

用户信息存在 Token 里

服务器:

不存任何登录状态

所以:

JWT = 无状态认证

六、Session vs JWT 核心区别

特点 Session JWT
状态 有状态 无状态
数据存储 服务器 Token
扩展性 一般 非常好
服务端存储 需要 不需要
安全控制 容易 较复杂
失效控制 可以立即失效 较难

七、JWT 最大的问题

JWT 最大的问题是:

无法主动失效

例如:

用户退出登录

Session:

删除 session

JWT:

token 仍然有效

除非:

等待 token 过期

所以很多系统会使用:

JWT + Redis 黑名单

八、业务场景真实方案

很多大厂使用的是:

JWT + Redis

结构:

登录 → 返回JWT

Redis存token

验证流程:

1 验证JWT签名
2 查询Redis是否存在

这样可以实现:

可扩展 + 可注销

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐