背景

系统学习 Token 的背景、作用、使用时机、再生成时机,并结合生产系统案例说明其机制。

一、什么是 Token?

Token(令牌)是一种身份验证和授权机制中用于识别用户身份的信息片段,常用于用户登录认证之后,服务端颁发给客户端的字符串。它的主要作用是:代表用户身份,替代传统的 Session

二、为什么需要 Token?

传统的登录系统依赖 Session + Cookie,在单体应用中问题不大,但在分布式架构、移动端、多端共享、微服务中就出现诸多痛点:

问题 描述
Session 状态依赖服务器内存 不利于横向扩展
多端共享难 App、Web、小程序等无法共享浏览器 Cookie
微服务架构下需要跨服务认证 Session 很难传递

Token 的优势:

  • 无状态(Stateless):服务端不存储用户状态,Token 自包含。
  • 易扩展:适用于分布式、微服务、移动端等系统。
  • 安全传输:Token 可设置过期时间、防篡改机制等。

三、常见的 Token 实现方式

1. JWT(JSON Web Token)

JWT 是最常见的 Token 格式,结构如下:

xxxxx.yyyyy.zzzzz

由三部分组成:

  1. Header:声明签名算法,如 HMAC、RSA
  2. Payload:用户信息(如 sub=用户名exp=过期时间
  3. Signature:签名,防止篡改

举个例子:

1
2
3
4
5
{
  "sub": "testuser",
  "iat": 1710000000,
  "exp": 1710003600
}

经过签名后生成一串字符串,在前后端之间传递。

四、Token 在生产系统中的应用场景

场景一:用户登录(淘宝、微信、知乎等)

用户输入账号密码,后端验证成功后返回 JWT Token,浏览器/App 保存。

特点:

  • 请求头中带上 Authorization: Bearer <token>
  • 无需服务端维护状态
  • 支持多端共享(Web、App)

场景二:API 网关 + 微服务认证

API Gateway 会校验 Token 是否有效,识别用户身份,再把请求转发到微服务。

例如:

  • 用户访问 /user/info,Token 中识别为 userId=1001
  • 网关将 userId 注入到请求上下文中

五、什么时候生成 Token?

  • 用户登录成功后
  • 用户注册成功后(自动登录)
  • 使用验证码/第三方认证成功后(微信、GitHub 授权)

六、什么时候需要重新生成 Token?

  • Token 即将过期或已过期

    • 一般 Token 有效期为 30 分钟~2 小时
    • 配合 Refresh Token 策略延长登录态
  • 用户修改敏感信息(如密码)

    • 防止老 Token 被继续使用
  • 用户手动退出登录,再次登录

七、进阶机制:Refresh Token

为避免用户频繁登录,系统通常设计 双 Token 策略

类型 用途 存储位置 有效期
Access Token 每次请求都使用 客户端内存/本地存储 短(30min)
Refresh Token 用来刷新 Access Token HttpOnly Cookie 长(7天或更长)

示例流程:

  1. 用户登录,返回 Access Token(5~30 分钟) + Refresh Token(7 天)
  2. Access Token 过期,客户端自动调用 /auth/refresh 把 Refresh Token 发给服务端
  3. 服务端校验 Refresh Token,合法、没过期 → 签发新的 Access Token(甚至新的 Refresh Token)

示例接口设计:

1
2
3
4
POST /auth/login        返回 Access + Refresh Token
GET  /api/user/profile   Access Token 调用受保护接口
POST /auth/refresh       Refresh Token 换新 Access Token
POST /auth/logout       清除 Refresh Token登出用户

八、真实系统参考

平台 Token 使用场景
GitHub API OAuth2 认证后返回 access_token
微信开放平台 登录换取 access_token + openid
京东、淘宝 登录后服务端签发 JWT,前端保存
阿里云微服务架构 网关验证 Token,下游服务通过网关传递的用户信息进行处理

九、最佳实践总结

  • Token 签发后建议短期有效,配合 Refresh Token 做自动续签
  • Token 内不要存敏感信息(如密码),仅放 userId、权限等
  • 使用 HTTPS 防止 Token 被窃取
  • 支持服务端主动使 Token 失效(如加入黑名单 Redis)

十、结语

Token 并不是单一的解决方案,而是一套身份识别机制的核心组件,一种认证体系。理解它的使用背景、生命周期以及扩展策略,才能在复杂系统中设计出安全、稳定的认证体系。微服务系统,一般在 auth-service 中生成 JWT Token,在 gateway-service 中统一认证与校验,是生产系统设计的基础能力。