1、会话票据基础概念

聊会话票据之前,我先问大家一个问题:你每次登录一个网站,服务器是怎么记住「你是谁」的?

HTTP 协议本身是无状态的。说白了,服务器处理完你的请求就忘了你。那怎么让它记住呢?靠的就是会话票据。我做了这么多年系统,见过太多因为票据没管好导致线上事故的案例。今天咱们就把这个根基打牢。

什么是会话票据

会话票据,就是客户端和服务器之间用来维持登录状态的凭证。你登录成功后,服务器给你发一张「通行证」,后面每次请求带上它,服务器就知道是你来了。

我习惯把它比作酒店房卡。你办入住(登录),前台给你房卡(票据)。你拿着房卡开门、去健身房、吃早餐,服务员看到房卡就知道你是几号房的客人。不用每次都说一遍「我是张三,住888房」。

核心要点:会话票据的本质是「一次认证,多次使用」的凭证。它解决了 HTTP 无状态和业务需要状态之间的矛盾。

常见的票据形式有三种:

  • Session ID —— 传统服务端会话,ID 存在 Cookie 里,用户数据放服务端内存或 Redis
  • Token —— 自包含的令牌,比如 JWT,用户信息直接编码在令牌里
  • 混合模式 —— Session + Token 结合,比如用 Token 做身份,用 Session 存权限缓存

会话票据的生命周期

一张票据从生到死,经历四个阶段。我在项目中踩过不少坑,每个阶段都有要注意的地方。

阶段 说明 常见问题
签发 用户认证成功后,服务端生成票据并返回客户端 签名密钥泄露、票据包含敏感信息
传输 客户端每次请求携带票据,通常放在 Header 或 Cookie 明文传输被截获、CSRF 攻击
验证 服务端收到请求后校验票据的有效性 验证逻辑遗漏、过期票据未及时清理
销毁 用户登出或票据过期后,使其失效 服务端未清除、客户端残留

嗯,这里要注意。生命周期不是越长越好。我见过一个项目把 Token 有效期设成 30 天,结果泄露后被人用了整整一个月才发现。短一点,配合刷新机制,才是正解。

我的习惯:Access Token 有效期设 15-30 分钟,Refresh Token 设 7 天。既保证用户体验,又降低泄露风险。

票据的组成结构

咱们拿最流行的 JWT(JSON Web Token)来拆解。一个 JWT 长这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

看着像乱码?其实它由三部分组成,用点号分隔。我拆开给你看:

1. Header(头部)

声明令牌类型和签名算法。Base64 解码后:

{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload(载荷)

存放实际数据,也叫 Claims(声明)。分三类:

  • 注册声明:预定义字段,如 iss(签发者)、sub(主题)、exp(过期时间)、iat(签发时间)
  • 公共声明:自定义字段,但要在 IANA 注册或使用命名空间避免冲突
  • 私有声明:业务自定义字段,比如 userId、role、tenantId

举个例子:

{
  "sub": "user_10086",
  "name": "张三",
  "role": "admin",
  "iat": 1700000000,
  "exp": 1700001800
}

我曾经踩过的坑:有同事把用户密码哈希直接放进了 Payload。记住,Payload 只是 Base64 编码,不是加密!谁都能解码看到内容。敏感信息绝对不能放进去。

3. Signature(签名)

对前两部分做签名,防止篡改。生成逻辑:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

服务端用密钥验证签名。只要密钥不泄露,没人能伪造合法的票据。

Session ID vs Token:怎么选?

很多新手问我该用哪种。我直接给对比:

维度 Session ID Token(JWT)
存储位置 服务端(内存/Redis) 客户端(自包含)
扩展性 需要共享会话存储 天然支持分布式
实时吊销 直接删服务端记录 需要黑名单或短有效期
性能 每次查询存储 本地验证,无 I/O
安全 依赖 Cookie 安全 依赖签名和密钥管理

我个人建议:单体应用或中小项目用 Session ID 省事;微服务、前后端分离、移动端场景,Token 更合适。没有银弹,看场景选。

知识体系总览

下面这张图把本章的核心脉络串起来了。我画图有个习惯,喜欢把关键流程和风险点标清楚,方便后面查漏补缺。

会话票据知识体系 会话票据 什么是会话票据 生命周期 组成结构 Session ID Token 签发 传输 验证 Header Payload Signature 核心要点 票据是认证后的凭证,生命周期管理决定系统安全,组成结构决定验证方式

你看,会话票据看似简单,但每个环节都有门道。从选型到生命周期管理,再到结构设计,一步错就可能出大问题。后面几章我会带你深入每个细节,包括怎么安全存储、怎么高效刷新、怎么在分布式环境下保持一致性。

先把基础打牢,后面实战才不慌。