JWT 跨域认证

· 3 min read

Session 认证

  1. 登录网站:服务器验证账号密码无误后,在服务器上创建一个 Session 档案,存储用户信息
  2. 只给一个”号码牌”:服务器不会把整个档案发给你,而是通过 Cookie,只把一个 Session ID 存到你的浏览器里
  3. 每次访问:浏览器自动将 Session ID 通过 Cookie 发送给服务器
  4. 服务器读取档案:服务器查找属于你的 Session 档案,然后返回私密内容

Session 认证的问题

如果是服务器集群或跨域服务架构,就要求 Session 数据在每台服务器间共享。

解决方案:

  • 方案一 — Session 数据持久化:写入数据库或持久层,各服务请求持久层获取数据。架构清晰,但工程量大。
  • 方案二 — 无状态认证:服务器不再保存 Session 数据,所有数据保存在客户端,每次请求发回服务器。Token 认证就是代表。

Token 认证

Token 是服务端生成的一串字符串,是客户端访问 API 时的资源凭证。流程如下:

  1. 客户端使用用户名和密码请求登录
  2. 服务端验证用户名与密码
  3. 验证成功后,服务端签发 Token 并发送给客户端
  4. 客户端存储 Token(Cookie 或 localStorage)
  5. 客户端每次请求资源时携带 Token
  6. 服务端验证 Token,验证成功则返回请求的数据

Token 认证特点

  • 服务端无状态,不用存放 Token 数据
  • 用解析 Token 的计算时间换取 Session 的存储空间,减轻服务器压力,避免频繁查询数据库
  • Token 完全由应用管理,可避开同源策略

JWT(JSON Web Token)

JWT 是基于 Token 认证的一种具体实现方案:

  1. 登录:将账号密码发给服务器
  2. 服务器签发令牌:验证通过后,服务器直接生成一个 JWT(包含用户信息和有效期),不存储任何东西
  3. 保管令牌:Token 存在浏览器(Local Storage 或 Cookie)
  4. 出示令牌:每次请求在请求头中携带 Authorization: Bearer <token>
  5. 服务器验签:服务器用密钥校验签名。若有效,直接从 Token 读出用户信息,无需查数据库或 Session 档案