返回正文
Are you an LLM? You can read better optimized documentation at /zh-CN/blog/2025-09/jwt-detail.md for this page in Markdown format
JWT 鉴权:小白友好版讲解 + 图形化拆解
JWT(JSON Web Token)是一种无状态的身份认证技术,核心作用是 “让服务器确认‘你是谁’”,常用于前后端分离、APP 登录等场景。下面用 “大白话 + 图形 + 思维导图”,从 “是什么→怎么用→核心逻辑” 一步步讲明白,小白也能轻松理解。
一、先搞懂:JWT 解决了什么问题?(先看痛点)
在 JWT 出现前,很多系统用 “Session 认证”,但有个明显缺点:
比如你用手机登录某 APP,每次点新页面,APP 都要给服务器发请求,服务器得查 “我之前是不是认证过这个用户”—— 这就需要服务器存一份 “用户登录记录”(即 Session),如果有 100 万用户登录,服务器要存 100 万条记录,压力很大。
而 JWT 的核心优势是 “服务器不用存记录”:用户登录后,服务器给用户发一个 “加密的身份卡片”(JWT),后续用户再发请求时,只要带上这张 “卡片”,服务器只要验证 “卡片是真的、没过期”,就知道 “你是谁”,不用再查数据库。
二、JWT 长什么样?3 部分组成(图形化拆解)
JWT 本质是一串 “用点(.)连接的字符串”,共分 3 段,每段都有明确作用,就像 “身份证的 3 个区域”:
txt
# JWT 结构:头部.Header + 载荷.Payload + 签名.Signature eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsInVzZXJOYW1lIjoi5byg5LiJIiwiZXhwIjoxNzE2MjM5MjAwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1
用表格和图形帮你看懂每一段:
组成部分 | 大白话作用 | 核心内容(小白能懂版) | 是否加密? |
---|---|---|---|
| 告诉服务器 “这张卡片用什么方式加密” |
| 不加密,只是 Base64 编码(能解密看到内容) |
| 存放 “用户的核心身份信息”(比如你是谁) |
| 不加密,只是 Base64 编码(能解密看到内容,别存密码! ) |
| 防止 “卡片被篡改”(最关键的安全保障) |
| 加密,不可逆(用户无法伪造) |
用 “身份证类比” 理解
- Header = 身份证上的 “签发机关”(告诉别人这张证是谁发的、用什么标准做的)
- PPayload = 身份证上的 “姓名、性别、生日”(你的核心信息,别人能看到)
- Signature = 身份证上的 “防伪水印”(只有发证机关能做,别人改不了,改了就失效)
三、JWT 鉴权完整流程(一步一图)
JWT 工作分 “登录签发 Token” 和 “后续请求验证 Token” 两步,用流程图能直观看到每一步的交互:
关键验证步骤(小白必记)
- 验签名:服务器会用自己的密钥重新算一遍签名,如果和用户带的签名不一样,说明 JWT 被篡改过,直接拒绝。
- 验过期:看 Payload 里的过期时间(exp),如果当前时间超过这个值,说明 JWT 失效,让用户重新登录。
四、JWT 配置 / 使用思维导图(小白可落地)
下面拆解 “从准备到实际使用” 的全流程,每个步骤都有具体操作说明:
JWT 前期准备(服务器端配置)
选工具/库(不用自己写加密)
- 后端是 Java:用 JJWT 库(常用)
- 后端是 Python:用 PyJWT 库
- 后端是 Node.js:用 jsonwebtoken 库
- 小白重点:不用懂底层加密,调用库的现成方法即可
配置“服务器密钥”(核心安全项)
- 要求:长一点、复杂一点(比如“a1b2c3d4e5!@#$%^&*”)
- 注意:密钥只存在服务器,绝对不能发给用户/前端!(泄露了别人就能伪造 JWT)
配置“过期时间”(Payload 里的 exp)
- 短期场景(比如APP):设 2小时(过期后让用户重新登录,更安全)
- 长期场景(比如后台管理系统):设 8 小时(和上班时间匹配)
- 避免:设太长(比如1年),万一 JWT 丢了,别人能冒用很久
JWT 核心流程:登录签发 Token
接收用户登录信息
- 前端传“用户名+密码”(用 HTTPS 传输,防密码被偷)
- 服务器验证“用户名密码是否正确”(查数据库)
生成 JWT(调用工具库)
- 组装 Header:{"alg":"HS256","typ":"JWT"}(HS256是常用对称算法)
- 组装 Payload:{"userId":123,"userName":"张三","exp":1716239200}(exp是过期时间的时间戳)
- 生成 Signature:用“服务器密钥”+ HS256 算法,对 Header+Payload 加密
- 拼接成 JWT:Header编码.Base64 + "." + Payload编码.Base64 + "." + Signature
返回 JWT 给前端
- 前端存 JWT:APP 存到本地存储,网页存到 localStorage/sessionStorage
JWT 核心流程:请求验证 Token
前端携带 JWT 发请求
- 在请求头里加“Authorization: Bearer JWT字符串”(固定格式)
- 例:Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
服务器验证 JWT(调用工具库)
- 步骤1:拆分 JWT 为 Header、Payload、Signature
- 步骤2:验证 Signature:用服务器密钥重新计算,对比是否一致(不一致则拒绝)
- 步骤3:验证过期时间:看 Payload 的 exp,过期则返回“请重新登录”
- 步骤4:验证通过:从 Payload 里取用户ID(比如 userId:123),查询用户数据,返回请求结果
JWT 注意事项(小白避坑)
安全问题
- 别在 Payload 里存敏感信息(比如密码、手机号),因为 Payload 只是 Base64 编码,能解密看到
- 必须用 HTTPS 传输 JWT,防止传输过程中被偷
- 服务器密钥要定期更换,防止密钥泄露
过期问题
- JWT 一旦签发,服务器没法主动“作废”(比如用户注销登录),只能等过期
- 解决办法:重要场景(比如支付),可以在服务器存“黑名单”,注销的 JWT 加入黑名单,验证时查黑名单
性能问题
- JWT 字符串别太长(比如 Payload 别塞太多信息),否则每次请求都要传一大串字符,影响速度
VN/A |
本站访客数
--次 本站总访问量
--人次