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 令牌的生命周期
令牌不是永生的。它从出生到死亡,经历四个阶段:
- 签发:用户登录成功,服务端生成令牌并返回给客户端。
- 传输:客户端在后续请求中携带令牌(通常放在 Authorization 头里)。
- 验证:服务端收到请求,验证令牌的签名、有效期、权限。
- 过期/吊销:令牌到期或被主动吊销,客户端需重新获取。
下面这张图,把整个流程串起来了:
这里有个关键点:令牌的过期时间。我见过有人把令牌有效期设成 30 天,甚至一年。你想想看,如果令牌泄露了,攻击者能拿它干一个月的坏事。
警告:令牌有效期越短越安全。一般建议 Access Token 15-30 分钟,Refresh Token 7 天。别图省事设成永久有效,那是给自己埋雷。
我曾经帮一个客户做安全审计,发现他们的令牌有效期是 365 天。我问为什么,对方说“用户嫌频繁登录麻烦”。我说那你可以用 Refresh Token 啊,用户无感刷新,安全性和体验两不误。后来他们改了,再也没出过令牌泄露导致的大规模账号被盗事件。
1.5 令牌的类型
令牌不是只有一种。常见的分两类:
- 透明令牌:比如 JWT,信息直接写在令牌里,服务端解码就能用。优点是自包含,缺点是令牌体积大,敏感信息不能放进去。
- 不透明令牌:比如随机字符串,服务端收到后去数据库查对应的用户信息。优点是体积小、可吊销,缺点是每次都要查存储。
怎么选?我个人的经验是:对内服务用 JWT,对外 API 用不透明令牌。为什么?JWT 泄露了,别人能直接看到你的用户 ID、角色。不透明令牌只是一串乱码,泄露了也白搭。
1.6 本章小结
好了,这一章的内容就这些。咱们把令牌的底子打牢了,后面讲安全漏洞和防护,你才能听得懂、用得上。
记住三句话:
- 令牌是数字通行证,核心是无状态认证。
- 令牌和 Session 各有优劣,场景决定选择。
- 令牌有生命周期,过期时间越短越安全。