知行手记首页

单点登录流程

分类技术笔记
单点登录 的两种认证方式 Session‑Cookie 和 双token
单点登录流程

基础版比喻 (跨域)

  • sso.com = 小区门卫室

  • sso.com 的 Cookie = 门卫手里登记你的身份的本子(只在门卫室)

  • ticket = 一次性放行条,每个大楼(a.comb.com)各要一张新条子

  • 双 Token = 大楼内部自己的门禁卡,A 楼门禁卡不能去 B 楼用。

  • 你去 A 楼:没门禁 → 跑门卫室登记,门卫写一张放行条,A 楼凭放行条给你 A 楼门禁卡。

  • 你再去 B 楼:没 B 楼门禁 → 再跑门卫室,门卫本子已经有你登记信息,直接再开一张放行条,B 楼给你 B 楼门禁卡。

A 楼门禁卡不能进 B 楼;但是门卫室的登记本子是共用的。

Access‑Token:短期,一般放到 Authorization头鉴权


升级版比喻

  • 大院通行卡:同主域共享 Session‑Cookie,大院内部所有楼通用

  • ticket(code)= 一次性放行条,大院外面的楼才需要
  • 双 Token = 外部楼房自己做的门禁卡,楼与楼之间不能通用

  1. 大院里面自家楼,域名都属于 *.qq.com 不用放行条。门卫翻看登记本确认身份,直接发大院通行卡Session‑Cookie院内所有楼都可刷。

只要在大院地块,就共用通行卡。

  1. 大院外面的楼(真正第三方,a.com / b.com,不属于qq.com 去 A 楼:没门禁 → 去门卫室。登记本已有记录,开一张放行条 ticket。A 楼核验放行条,发给你A 楼专属门禁卡(双 Token)。 去 B 楼:没门禁 → 再跑门卫室,新开一张放行条,拿到B 楼专属门禁卡

A、B 门禁互不通用,只有门卫登记本全局共用。

  1. 登出
  • 退出单栋楼:只收走这栋楼的卡,登记本不动,其他楼仍可登录。
  • 全局登出:回门卫室撕掉登记本,全部权限作废。

映射对照

  • 门卫登记本:认证中心 Session+Cookie
  • 大院通行卡:同主域共享 SessionId Cookie
  • 放行条 ticket:OAuth2 code
  • 楼房门禁卡:业务侧 Access + Refresh 双 Token

完整登录‑刷新流程

  1. 用户账号密码登录
  2. 后端校验通过,返回:
    • access_token(短时效 JWT)
    • refresh_token(长时效,后端数据库保存一份 refresh_token,绑定用户 ID、设备
  3. 前端存储
    • access_token:存内存 /localStorage
    • refresh_token优先放 HttpOnly Cookie(最安全,防止 XSS 盗取)

✨ 组合玩法:RefreshToken 走 HttpOnly Cookie;AccessToken 放内存,这是现在前端项目主流安全方案。

  1. 业务请求 带上 access_token 请求接口。
  2. AccessToken 过期(401) 前端不弹登录页,自动调用 /refresh 刷新接口:
  • 浏览器自动携带 Cookie 里的 refresh_token
  • 后端取出 refresh_token,查数据库校验是否合法、是否已经被拉黑注销
  • 校验通过:生成新 access_token返回给前端;部分设计会同时下发新 refresh_token(轮换刷新 token,降低被盗风险)
  • 校验失败:直接返回 401,跳登录页面
  1. 用户登出
  • 前端清空本地 access_token
  • 请求后端登出接口:后端把数据库里这条 refresh_token 标记失效拉黑

重点:refresh_token 在服务端有记录,所以可以主动作废;纯 JWT 无状态做不到主动登出。

全文完

评论0

还没有评论,来抢沙发~

发表评论

请友善发言,谢谢配合

以文字记录成长,以良知安顿内心

© 2026 知行手记