基础版比喻 (跨域)
-
sso.com= 小区门卫室 -
sso.com 的 Cookie = 门卫手里登记你的身份的本子(只在门卫室)
-
双 Token = 大楼内部自己的门禁卡,A 楼门禁卡不能去 B 楼用。
-
你去 A 楼:没门禁 → 跑门卫室登记,门卫写一张放行条,A 楼凭放行条给你 A 楼门禁卡。
-
你再去 B 楼:没 B 楼门禁 → 再跑门卫室,门卫本子已经有你登记信息,直接再开一张放行条,B 楼给你 B 楼门禁卡。
A 楼门禁卡不能进 B 楼;但是门卫室的登记本子是共用的。
Access‑Token:短期,一般放到 Authorization头鉴权
升级版比喻
- 大院通行卡:同主域共享 Session‑Cookie,大院内部所有楼通用
- ticket(code)= 一次性放行条,大院外面的楼才需要
- 双 Token = 外部楼房自己做的门禁卡,楼与楼之间不能通用
- 大院里面自家楼,域名都属于 *.qq.com
不用放行条。门卫翻看登记本确认身份,直接发大院通行卡,
Session‑Cookie院内所有楼都可刷。
只要在大院地块,就共用通行卡。
- 大院外面的楼(真正第三方,a.com / b.com,不属于qq.com) 去 A 楼:没门禁 → 去门卫室。登记本已有记录,开一张放行条 ticket。A 楼核验放行条,发给你A 楼专属门禁卡(双 Token)。 去 B 楼:没门禁 → 再跑门卫室,新开一张放行条,拿到B 楼专属门禁卡。
A、B 门禁互不通用,只有门卫登记本全局共用。
- 登出
- 退出单栋楼:只收走这栋楼的卡,登记本不动,其他楼仍可登录。
- 全局登出:回门卫室撕掉登记本,全部权限作废。
映射对照
- 门卫登记本:认证中心 Session+Cookie
- 大院通行卡:同主域共享 SessionId Cookie
- 放行条 ticket:OAuth2 code
- 楼房门禁卡:业务侧 Access + Refresh 双 Token
完整登录‑刷新流程
- 用户账号密码登录
- 后端校验通过,返回:
access_token(短时效 JWT)refresh_token(长时效,后端数据库保存一份 refresh_token,绑定用户 ID、设备)
- 前端存储
access_token:存内存 /localStoragerefresh_token:优先放 HttpOnly Cookie(最安全,防止 XSS 盗取)
✨ 组合玩法:RefreshToken 走 HttpOnly Cookie;AccessToken 放内存,这是现在前端项目主流安全方案。
- 业务请求
带上
access_token请求接口。 - AccessToken 过期(401)
前端不弹登录页,自动调用
/refresh刷新接口:
- 浏览器自动携带 Cookie 里的 refresh_token
- 后端取出 refresh_token,查数据库校验是否合法、是否已经被拉黑注销
- 校验通过:生成新 access_token返回给前端;部分设计会同时下发新 refresh_token(轮换刷新 token,降低被盗风险)
- 校验失败:直接返回 401,跳登录页面
- 用户登出
- 前端清空本地 access_token
- 请求后端登出接口:后端把数据库里这条 refresh_token 标记失效拉黑
重点:refresh_token 在服务端有记录,所以可以主动作废;纯 JWT 无状态做不到主动登出。

