1. 令牌基础概念:什么是用户令牌、令牌的作用、令牌与 Session 的区别、令牌的生命周期

各位同学好,我是老周。咱们这门课讲的是令牌安全,但一开始我得先问个问题:你天天跟令牌打交道,真的搞清楚它是什么了吗?

我见过不少团队,令牌出了问题才回头补基础。说实话,基础不牢,后面谈安全全是空中楼阁。今天这一章,咱们就把令牌的底裤扒干净。

1.1 什么是用户令牌

用户令牌,说白了就是一张数字通行证。你登录系统后,服务器给你发个凭证,你拿着它去访问资源,服务器一看令牌有效,就放行。

举个例子。你进公司大楼,前台给你一张访客卡。这张卡就是令牌。卡上印着你的照片、姓名、有效期。保安看到卡,就知道你是谁、能去几楼、什么时候过期。

在技术世界里,令牌通常是一串结构化的字符串。最常见的是 JWT(JSON Web Token),长这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuW8oOS4iSIsImlhdCI6MTUxNjIzOTAyMn0.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

看着乱码对吧?其实它分三段:头部、载荷、签名。头部告诉你怎么加密的,载荷存用户信息,签名保证没人篡改。

核心要点:令牌是服务端签发的、客户端持有的、用于证明身份的凭证。它不依赖服务端存储,这是它和 Session 最大的区别。

1.2 令牌的作用

令牌到底解决什么问题?我总结了三件事:

  • 身份认证:证明“我是谁”。登录后拿到令牌,后续请求带上它,服务器就知道是你。
  • 授权控制:证明“我能干什么”。令牌里可以存角色、权限,服务器根据令牌内容决定是否放行。
  • 无状态通信:服务器不需要存你的登录状态。所有信息都在令牌里,拿到就能验证。

我记得之前帮一家电商公司做架构改造。他们原来的系统用 Session,每次请求都要查 Redis。高峰期 Redis 扛不住,接口响应慢得像蜗牛。换成 JWT 令牌后,服务器不再查存储,压力直接降了 60%。

当然,无状态不是银弹。后面我会讲它的坑,这里先记住:令牌的核心价值,就是让认证过程轻量化、去中心化。

1.3 令牌与 Session 的区别

很多新手搞混这两个概念。我直接画个表,一目了然:

对比维度 Session 令牌(Token)
存储位置 服务端存储 Session 数据 客户端持有令牌,服务端不存储
状态性 有状态,服务端维护会话 无状态,令牌自包含信息
扩展性 水平扩展需共享 Session 天然支持分布式,无需共享
安全性 依赖 Cookie,易受 CSRF 攻击 可自定义传输方式,防 CSRF 更好
吊销机制 直接删除服务端 Session 即可 需配合黑名单或短有效期
典型场景 传统 Web 应用,服务端渲染 API 服务、移动端、单页应用

你想想看,Session 就像你去银行办业务,柜员把你的信息记在本子上。下次你来,柜员翻本子找到你。令牌呢,就像你办了一张会员卡,卡上印着你的信息,柜员扫一眼就知道你是谁。

哪种好? 没有绝对。Session 吊销方便,令牌扩展性好。我个人的习惯是:内部管理系统用 Session,对外 API 用令牌。

小提示:如果你用 Session,记得配置安全 Cookie 属性(HttpOnly、Secure、SameSite)。如果你用令牌,一定要设置合理的过期时间,别让令牌永久有效。

1.4 令牌的生命周期

令牌不是永生的。它从出生到死亡,经历四个阶段:

  1. 签发:用户登录成功,服务端生成令牌并返回给客户端。
  2. 传输:客户端在后续请求中携带令牌(通常放在 Authorization 头里)。
  3. 验证:服务端收到请求,验证令牌的签名、有效期、权限。
  4. 过期/吊销:令牌到期或被主动吊销,客户端需重新获取。

下面这张图,把整个流程串起来了:

令牌生命周期流程图 1. 用户登录 2. 服务端签发 3. 返回令牌 4. 请求携带令牌 5. 服务端验证 6. 返回资源/拒绝 7. 令牌过期/吊销 虚线表示令牌过期或吊销后,客户端需重新登录,回到步骤 1

这里有个关键点:令牌的过期时间。我见过有人把令牌有效期设成 30 天,甚至一年。你想想看,如果令牌泄露了,攻击者能拿它干一个月的坏事。

警告:令牌有效期越短越安全。一般建议 Access Token 15-30 分钟,Refresh Token 7 天。别图省事设成永久有效,那是给自己埋雷。

我曾经帮一个客户做安全审计,发现他们的令牌有效期是 365 天。我问为什么,对方说“用户嫌频繁登录麻烦”。我说那你可以用 Refresh Token 啊,用户无感刷新,安全性和体验两不误。后来他们改了,再也没出过令牌泄露导致的大规模账号被盗事件。

1.5 令牌的类型

令牌不是只有一种。常见的分两类:

  • 透明令牌:比如 JWT,信息直接写在令牌里,服务端解码就能用。优点是自包含,缺点是令牌体积大,敏感信息不能放进去。
  • 不透明令牌:比如随机字符串,服务端收到后去数据库查对应的用户信息。优点是体积小、可吊销,缺点是每次都要查存储。

怎么选?我个人的经验是:对内服务用 JWT,对外 API 用不透明令牌。为什么?JWT 泄露了,别人能直接看到你的用户 ID、角色。不透明令牌只是一串乱码,泄露了也白搭。

1.6 本章小结

好了,这一章的内容就这些。咱们把令牌的底子打牢了,后面讲安全漏洞和防护,你才能听得懂、用得上。

记住三句话:

  • 令牌是数字通行证,核心是无状态认证。
  • 令牌和 Session 各有优劣,场景决定选择。
  • 令牌有生命周期,过期时间越短越安全。