JWT 跨域认证
· 3 min read
Session 认证
- 登录网站:服务器验证账号密码无误后,在服务器上创建一个 Session 档案,存储用户信息
- 只给一个”号码牌”:服务器不会把整个档案发给你,而是通过 Cookie,只把一个 Session ID 存到你的浏览器里
- 每次访问:浏览器自动将 Session ID 通过 Cookie 发送给服务器
- 服务器读取档案:服务器查找属于你的 Session 档案,然后返回私密内容
Session 认证的问题
如果是服务器集群或跨域服务架构,就要求 Session 数据在每台服务器间共享。
解决方案:
- 方案一 — Session 数据持久化:写入数据库或持久层,各服务请求持久层获取数据。架构清晰,但工程量大。
- 方案二 — 无状态认证:服务器不再保存 Session 数据,所有数据保存在客户端,每次请求发回服务器。Token 认证就是代表。
Token 认证
Token 是服务端生成的一串字符串,是客户端访问 API 时的资源凭证。流程如下:
- 客户端使用用户名和密码请求登录
- 服务端验证用户名与密码
- 验证成功后,服务端签发 Token 并发送给客户端
- 客户端存储 Token(Cookie 或 localStorage)
- 客户端每次请求资源时携带 Token
- 服务端验证 Token,验证成功则返回请求的数据
Token 认证特点
- 服务端无状态,不用存放 Token 数据
- 用解析 Token 的计算时间换取 Session 的存储空间,减轻服务器压力,避免频繁查询数据库
- Token 完全由应用管理,可避开同源策略
JWT(JSON Web Token)
JWT 是基于 Token 认证的一种具体实现方案:
- 登录:将账号密码发给服务器
- 服务器签发令牌:验证通过后,服务器直接生成一个 JWT(包含用户信息和有效期),不存储任何东西
- 保管令牌:Token 存在浏览器(Local Storage 或 Cookie)
- 出示令牌:每次请求在请求头中携带
Authorization: Bearer <token> - 服务器验签:服务器用密钥校验签名。若有效,直接从 Token 读出用户信息,无需查数据库或 Session 档案