大家平时在开发中,应该都见过:

Authorization: Bearer xxx

也经常听到:

  • JWT
  • AccessToken
  • RefreshToken
  • OAuth2
  • Spring Security

但很多人其实并没有真正理解:

为什么企业一定要搞“双 Token”?

为什么:

  • AccessToken 要短期有效?
  • RefreshToken 还会过期?
  • 为什么很多公司 RefreshToken 不用 JWT?
  • 为什么 APP 会“突然掉登录”?
  • 为什么有些系统支持“踢下线”?

这篇文章,我们从:

工程视角

彻底讲透企业级认证体系。


一、传统 Session 为什么不够用了

最早 Web 系统:

浏览器
   ↓
Cookie(JSESSIONID)
   ↓
Tomcat Session

服务端:

Map<sessionId, User>

保存用户登录状态。

这种模式:

Session 模式


Session 模式的问题

1. 服务端有状态

每个用户:

都需要:保存 Session

用户一多:

服务器内存压力巨大。


2. 集群麻烦

比如:

用户登录到:服务器A

Session 保存在:A机器

结果下一次请求:

负载均衡到了:服务器B

B 根本找不到 Session。

于是开始出现:

  • Session 同步
  • Redis Session
  • Sticky Session(粘性会话)

架构开始变复杂。


3. APP / IoT 不适合

移动端:

  • Android
  • iOS
  • IoT设备
  • 小程序

并不是浏览器。

Cookie 体系并不友好。

于是:

Token 模式开始流行


二、Token 模式核心思想

核心理念:

服务端不保存登录状态

客户端 自己携带身份。

类似:身份证


登录成功后:

服务端:生成 Token

客户端:保存 Token

以后请求:

Authorization: Bearer accessToken

服务端:

校验 Token


三、为什么 AccessToken 要短期有效

因为:

Token 一旦泄露,非常危险

泄露来源:

  • 抓包
  • 日志泄露
  • XSS
  • 手机 Root
  • 逆向
  • 中间人攻击

黑客拿到:

AccessToken

就能直接调用接口。

所以:

AccessToken 生命周期必须短

例如:

系统 AccessToken 有效期
银行系统 5~30分钟
电商系统 2小时
管理后台 1小时
IoT设备 30分钟

四、为什么又需要 RefreshToken

如果:AccessToken = 30分钟

那么用户 每30分钟:重新登录  体验直接爆炸。

于是: 引入 RefreshToken

作用:自动刷新 AccessToken

用户:完全无感


五、双 Token 的真正本质

其实可以这样理解:

Token 本质
AccessToken 临时身份证
RefreshToken 长期续签资格

所以:

RefreshToken 权限更大

因为:

它可以不断生成新的:AccessToken

因此:

RefreshToken 必须更加安全


六、为什么 RefreshToken 也必须过期

很多人会问:RefreshToken 不就是长期登录么?

注意:

长期 ≠ 永久

因为:

如果黑客拿到:RefreshToken

就能:无限续命

相当于:永久登录权限 风险极大。

所以:

RefreshToken 也必须有生命周期

例如:

类型 有效期
AccessToken 30分钟
RefreshToken 7天

当:RefreshToken 过期

用户必须: 重新登录


七、企业真实实现:JWT + Redis

很多人一提 Token:

就只知道:

JWT JWT JWT

实际上 企业里通常:

Token 存储方式
AccessToken JWT
RefreshToken Redis / DB

因为:

JWT 无法主动撤销

JWT 特点:

  • 只要没过期
  • 就一直有效

服务端:无法主动干掉

危险。


而 RefreshToken:

企业通常会:Redis 存储

例如:

refresh_token:uuid
→ userId/deviceId/expire

这样服务端就能:

  • 主动踢下线
  • 单设备登录
  • 注销立即失效
  • 黑名单控制
  • 风险设备拦截

八、Refresh Token Rotation(企业高频方案)

这是很多大厂都会做的。


普通方案:

一个 RefreshToken 一直用

风险:

如果被偷:可长期刷新


于是:

引入 Rotation(轮换机制)

流程:

RT-1
 ↓ 刷新
RT-2(RT-1失效)
 ↓ 刷新
RT-3(RT-2失效)

即:

每刷新一次,就废弃旧 RefreshToken


这样即使 旧 Token 泄露:也无法继续刷新

安全性大幅提升。


九、Android 真实实现流程(高频面试)

Android 开发其实非常常见。


1. 请求接口

Authorization: Bearer accessToken

2. AccessToken 过期

服务端返回:

401 Unauthorized

3. OkHttp 拦截器自动刷新

客户端:

自动调用:

POST /refresh

携带:

refreshToken

获取:

newAccessToken

4. 自动重放请求

重新请求原接口:

用户完全无感

这就是:

自动续签机制


十、为什么很多 APP 会“突然掉登录”

很多时候:不是 Bug。

而是:RefreshToken 到期了

例如:

APP 登录周期
微信 很长
GitHub 30天
企业OA 7天
银行APP 更短

超过:RefreshToken 生命周期 ,就必须 重新登录


十一、双 Token 背后的完整安全体系

实际上:双 Token 只是入口。

后面会延伸出:

技术 作用
JWT Token 格式
OAuth2 授权体系
Spring Security 安全框架
Gateway 鉴权 网关统一认证
SSO 单点登录
RBAC 权限模型
HTTPS/TLS 传输加密
API签名 防篡改
零信任 企业安全体系

这些:

本质上都是“认证与会话管理”

的延伸。


十二、最终核心理解(非常重要)

企业认证真正解决的:

不是:登录一下

而是:“会话生命周期管理”

包括:

  • 登录
  • Token签发
  • 自动续签
  • Token失效
  • 主动撤销
  • 踢下线
  • 多端控制
  • 风险控制
  • 权限控制
  • 设备绑定

这才是真正的:

企业级认证体系


结尾

很多开发:学安全的时候,容易陷入:

背 JWT
背 OAuth2
背 Spring Security

但真正重要的:不是框架。

而是:先理解企业为什么要这样设计

当你真正理解:

  • 为什么 Token 要短期有效
  • 为什么需要 RefreshToken
  • 为什么 RefreshToken 还会过期
  • 为什么 Redis 比 JWT 更适合 RefreshToken

你会发现 后面的:

  • OAuth2
  • Spring Security
  • Gateway
  • SSO

其实都只是: 工程化实现而已。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐