966 字
约 3 分钟
1
Session 有状态登录入门
Session 有状态登录入门
Session 是传统 Web 系统里非常常见的一种登录认证方式。
核心思想:
用户登录成功后,服务器保存一份登录状态,客户端只保存一个
sessionId,之后每次请求通过这个sessionId找到当前用户。
1. 为什么叫“有状态”?
用户登录:
用户名 + 密码
↓
Server
↓
验证成功
↓
创建 Session
服务器保存:
sessionId = abc123
userId = 1001
username = zhangsan
role = admin
客户端只拿到:
sessionId = abc123
以后请求:
Cookie:
JSESSIONID=abc123
服务器:
sessionId
↓
查询 Session
↓
找到 userId = 1001
↓
确认当前用户
因为服务器需要保存:
这个用户已经登录
所以称为:
Stateful Authentication
有状态认证
2. Session 登录流程
用户登录
↓
POST /login
↓
验证账号密码
↓
创建 Session
↓
生成 sessionId
↓
通过 Cookie 返回客户端
例如:
Set-Cookie:
JSESSIONID=abc123
浏览器后续会自动携带:
Cookie:
JSESSIONID=abc123
服务器根据这个 ID 获取登录用户。
3. Session 数据存在哪里?
最简单的方式:
Spring Boot JVM 内存
例如:
Server
abc123 → User 1001
xyz789 → User 1002
但是如果部署多个服务实例:
Server A
Server B
Server C
就可能出现问题。
例如:
登录请求
↓
Server A
↓
Session 保存在 A
下一次请求:
用户请求
↓
Server B
Server B:
找不到这个 Session
于是生产环境通常会使用:
Redis Session
架构变成:
Server A ──┐
Server B ──┼── Redis
Server C ──┘
所有服务器共享同一份登录状态。
4. Session 怎么退出登录?
Session 的优势之一就是:
容易主动失效
用户退出:
POST /logout
服务器:
找到 Session
↓
删除 Session
↓
sessionId 失效
例如:
abc123 → User 1001
删除以后:
abc123 → 不存在
用户再次请求:
JSESSIONID=abc123
服务器发现:
Session 不存在
直接要求重新登录。
5. Session 和 JWT 的区别
| Session | JWT |
|---|---|
| 有状态 | 通常无状态 |
| 登录状态保存在服务器 | Token 保存在客户端 |
| 客户端保存 sessionId | 客户端保存 JWT |
| 服务端需要查 Session | 服务端验证 Token |
| 主动踢下线简单 | Token 主动失效相对复杂 |
| 单体 Web 很常见 | API、微服务很常见 |
最核心的区别就是:
Session:
服务器记住你是谁
而:
JWT:
客户端每次主动告诉服务器自己是谁
6. Session 什么时候使用?
Session 很适合:
传统 Web 项目
后台管理系统
单体应用
服务端渲染项目
需要方便踢用户下线的系统
例如:
Spring MVC
+
Thymeleaf
+
Session
就是非常经典的组合。
7. 总结
Session 登录可以简单理解成:
用户登录
↓
服务器创建 Session
↓
返回 sessionId
↓
客户端保存 Cookie
↓
每次请求携带 sessionId
↓
服务器查询 Session
↓
确认当前用户
一句话总结:
Session 有状态登录,就是把用户的登录状态保存在服务器,客户端只携带一个 sessionId,服务器通过 sessionId 找到当前用户。
也可以直接记:
Session
=
服务器保存登录状态
JWT
=
客户端携带登录凭证
评论
0 条
还没有评论,先写一条吧。