小白也能懂!JWT Token和普通Token的核心差别
你有没有过这样的经历?打开手机APP,登录一次之后,好几天不用再输密码就能直接用;或者在网站上购物,结算时不用反复验证身份。这些“免密”操作的背后,都藏着“Token”的功劳。但你可能听过“普通Token”和“JWT Token”这两个词,它们到底是啥?又有什么不一样?今天咱们用大白话+生活例子,把这事说透。
先搞懂基础:什么是“普通Token”?—— 像张“无信息门禁卡”
Token翻译过来叫“令牌”,本质就是一串由服务器生成的、独一无二的随机字符串。它的作用很简单:证明“你是你”,是服务器给用户的“身份凭证”。
普通Token的工作逻辑:“服务器记笔记”模式
咱们拿“小区门禁”举个例子。假设你是小区业主,第一次去物业登记(相当于“用户第一次登录”):
- 登记拿卡:你给物业看身份证(相当于“输入账号密码”),物业确认你是业主后,给你一张没有任何文字图案的空白门禁卡(这就是“普通Token”)。
- 物业记笔记:物业不会在卡上写东西,但会自己建一个“台账”,上面写着“卡号001 → 对应业主张三,住3号楼2单元”(相当于“服务器把Token和用户信息绑定,存到自己的数据库/缓存里”)。
- 刷卡通行:你下次进小区刷这张卡(相当于“请求接口时带上Token”),门禁系统会把卡号传给物业的台账系统(服务器),服务器查台账:“哦,001是张三,合法”,然后放行(返回请求结果)。
总结一下普通Token的特点:它本身就是一串“无意义的随机码”,所有和用户相关的信息都存在服务器里,每次验证都要服务器“查台账”才能确认身份。
再看进阶:什么是“JWT Token”?—— 像张“自带身份信息的智能卡”
JWT是“JSON Web Token”的缩写,翻译过来是“JSON格式的网络令牌”。它也是Token的一种,但比普通Token“聪明”—— 它自己就带着用户的关键信息,不用服务器再“查台账”。
JWT的工作逻辑:“卡片自带说明书”模式
还是用小区门禁的例子,但这次物业升级了门禁卡(换成JWT Token):
- 登记拿“智能卡” :你照样给物业看身份证,物业确认后,给你一张印着信息的卡,上面写着“姓名:张三;住址:3号楼2单元;有效期:2025年12月-2026年12月”(这就是JWT里的“用户信息”),而且卡的右下角还有物业的盖章(这是JWT的“签名”,防止篡改)。
- 物业不记详细台账:物业不用再记“卡号对应谁”,只需要保存“盖章的防伪规则”(相当于服务器保存“密钥”)。
- 刷卡快速验证:你进小区刷这张卡,门禁系统直接看卡上的信息(“张三,3号楼业主”),再核对盖章是不是真的(用服务器的密钥验证签名)。只要信息没被改、盖章有效,直接放行,不用再找物业查台账。
JWT的小结构:3部分组成的“智能卡”
JWT看起来是一长串字符,其实是用“.”分成了3部分,比如这样:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsIm5hbWUiOiLlvKDkuIkifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
咱们不用记复杂概念,知道每部分作用就行:
- 第一部分(头部) :告诉服务器“我用什么方式防伪”(比如上面的“HS256”加密算法),相当于卡上写着“防伪方式:物业专用盖章”。
- 第二部分(载荷) :存用户的关键信息(比如用户ID、姓名、有效期),就是卡上印的“张三,3号楼”这些内容。
- 第三部分(签名) :服务器用自己的“密钥”(相当于物业的“专属印章”)对前两部分加密生成的。这是JWT的核心,只要密钥不泄露,别人改了卡上的信息,签名就会失效,服务器一眼就能看出来。
核心差别:一张表看懂“普通Token”和“JWT”
光说概念不够直观,咱们用“购物APP登录”的场景,对比两者的核心区别:
| 对比维度 | 普通Token | JWT Token |
|---|---|---|
| 自身是否带信息 | 不带,就是随机字符串(比如“a1b2c3d4”) | 带,包含用户ID、有效期等关键信息 |
| 服务器是否要存信息 | 必须存!要把Token和用户信息绑在一起(存数据库/Redis) | 不用存!只需要保存“密钥”,验证时解密即可 |
| 验证流程(购物APP下单) | 1. 你下单时带Token“a1b2c3d4”;2. 服务器查数据库:“a1b2c3d4对应用户李四,余额足够”;3. 允许下单 | 1. 你下单时带JWT;2. 服务器用密钥解密JWT,直接拿到“用户李四,余额1000元”;3. 验证签名有效,允许下单 |
| 速度和性能 | 慢!每次都要查数据库/缓存,数据多了会卡顿 | 快!不用查存储,解密验证就行,压力小 |
| 跨服务使用(比如APP+小程序+网页) | 麻烦!每个服务都要连同一个数据库查Token,跨公司更难 | 方便!只要各服务有相同密钥,就能解密JWT,适合跨平台、跨公司合作 |
| 安全性(防篡改) | 依赖服务器存储安全,Token本身无法验证是否被改 | 自带签名,改了信息签名就失效,安全性更高 |
| 注销/失效难度 | 简单!直接在服务器删除对应的Token记录就行(比如踢下线) | 麻烦!JWT一旦生成没法修改,只能等过期,或者用“黑名单”辅助 |
小白总结:什么时候用哪个?
不用记复杂理论,记住两个场景就行:
- 用普通Token的情况:小项目、单一服务(比如一个简单的博客网站),需要频繁“踢用户下线”(比如管理员强制注销违规账号),这时普通Token操作简单,更合适。
- 用JWT的情况:大项目、多平台(APP+小程序+网页)、跨公司合作(比如你的APP要接入微信登录),需要快速验证、减少服务器压力,这时JWT的优势就很明显。
最后补个小提醒:JWT虽然方便,但因为它一旦生成就没法修改,所以别在里面存密码、手机号这些敏感信息哦!只存用户ID、昵称这种非敏感数据就好~
看到这,你应该明白两者的差别了吧?简单说,普通Token是“靠服务器记笔记”的笨办法,JWT是“自带说明书”的聪明办法,它们都是为了帮你“一次登录,轻松使用”,只是适用的场景不同而已。下次再听到这两个词,就不会一脸懵啦!