JWT:一文搞懂现代身份验证的 "数字护照"
myzbx 2025-07-06 15:14 3 浏览
什么是 JWT?先看一个生活比喻
假设你去图书馆借书,管理员给你一张带盖章的借阅证,上面写着你的姓名、借阅权限和有效期。每次借书时,你只需出示这张证,管理员核对盖章无误就会放行 —— 这就是 JWT(JSON Web Token)的核心逻辑。
JWT 的正式定义:
一种紧凑、自包含的 JSON 格式令牌,用于在客户端和服务器之间安全传输身份信息,无需服务器存储会话数据,是现代 Web 应用中最主流的身份验证方案之一。
JWT 的三大核心组件:拆解 "数字护照" 的结构
一个标准的 JWT 由三段字符串组成,用点号(.)分隔,形如:header.payload.signature。我们以一个实际示例来拆解:
1 头部(Header):令牌的 "身份标签"
作用:声明令牌类型和加密算法。
示例内容(JSON 格式):
{
"alg": "HS256", // 加密算法为HMAC SHA-256
"typ": "JWT" // 令牌类型
}
编码后(Base64Url 编码):
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
2 有效载荷(Payload):存储的 "身份信息"
作用:存放用户标识、权限、过期时间等数据。
注意:不加密但可解码,绝不能存密码等敏感信息!
示例内容(JSON 格式):
{
"sub": "123456", // 用户ID
"username": "user123", // 用户名
"role": "admin", // 角色
"exp": 1698563200 // 过期时间(Unix时间戳)
}
编码后(Base64Url 编码):
eyJzdWIiOiIxMjM0NTYiLCJ1c2VybmFtZSI6InVzZXIxMjMiLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE2OTg1NjMyMDB9
3 签名(Signature):防篡改的 "数字盖章"
作用:用服务器私有的密钥对头部和 payload 进行加密,确保令牌未被篡改。
生成方式:
// 伪代码:HMACSHA256(
// base64UrlEncode(header) + "." + base64UrlEncode(payload),
// "服务器私有密钥"
// )
示例签名:
Xf23Jsl56y7aBx12C5z7D9kL3mN4p8Q7rT9y6W2s5j9D1z0A4c7v2M8b9n0
JWT 工作流程:从登录到 API 请求的全链路
以 "用户登录电商 APP" 为例,看 JWT 如何工作:
步骤 1:用户登录,服务器发放 JWT
- 用户输入账号密码,向服务器发送登录请求。
- 服务器验证通过后,生成包含用户信息的 JWT,例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYiLCJ1c2VybmFtZSI6InVzZXIxMjMiLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE2OTg1NjMyMDB9.Xf23Jsl56y7aBx12C5z7D9kL3mN4p8Q7rT9y6W2s5j9D1z0A4c7v2M8b9n0
步骤 2:客户端存储 JWT
- 浏览器 / APP 将 JWT 存储在localStorage或sessionStorage中。
步骤 3:每次请求携带 JWT
- 用户浏览商品时,APP 向 API 发送请求,在 HTTP 头部添加 JWT:
- http
- Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
步骤 4:服务器验证 JWT
- 服务器提取 JWT,用私有密钥验证签名是否有效。
- 解析 payload,获取用户权限(如 "admin"),决定是否允许访问商品详情 API。
实战示例:用 Node.js 生成和验证 JWT
1. 安装依赖
npm install jsonwebtoken
2. 生成 JWT 的代码(服务器端)
const jwt = require('jsonwebtoken');
// 生成JWT的函数
function generateJWT(user) {
const payload = {
sub: user.id,
username: user.name,
role: user.role,
exp: Math.floor(Date.now() / 1000) + (24 * 60 * 60) // 24小时后过期
};
// 密钥需保密,建议从环境变量获取
const secretKey = 'your-secret-key-should-be-very-secure';
// 生成JWT
const token = jwt.sign(payload, secretKey, { algorithm: 'HS256' });
return token;
}
// 示例:生成用户令牌
const user = { id: '123456', name: 'user123', role: 'user' };
const token = generateJWT(user);
console.log('生成的JWT:', token);
3. 验证 JWT 的代码(服务器端)
function verifyJWT(token) {
const secretKey = 'your-secret-key-should-be-very-secure';
try {
// 验证JWT并解析payload
const decoded = jwt.verify(token, secretKey);
return { valid: true, data: decoded };
} catch (error) {
return { valid: false, error: error.message };
}
}
// 示例:验证令牌
const result = verifyJWT(token);
if (result.valid) {
console.log('用户信息:', result.data);
// 根据role字段判断权限,如允许访问管理员接口:
if (result.data.role === 'admin') {
console.log('允许访问管理员API');
}
} else {
console.log('令牌无效:', result.error);
}
JWT 的优缺点与安全建议
优点
- 无状态:服务器不存储会话,轻松应对高并发;
- 跨域友好:可在多个服务间共享,适合微服务架构;
- 紧凑便携:体积小,传输效率高。
缺点与安全隐患
- ** payload 非加密 **:敏感信息(如身份证号)绝不能存入;
- 令牌被盗风险:需配合 HTTPS 传输,避免使用localStorage(可被 XSS 攻击窃取),推荐用HttpOnly Cookie存储;
- 过期机制限制:无法主动让令牌提前失效,需配合黑名单机制。
总结:JWT 为何是现代 Web 的 "基础设施"?
从社交媒体登录到 API 接口保护,JWT 以 "无状态 + 自验证" 的特性,成为了前后端分离时代的身份验证标配。理解它的原理,就像掌握了一把解读现代 Web 安全机制的钥匙 —— 下次登录 APP 时,不妨想想你手机里存储的那串 JWT 令牌,正在如何为你保驾护航~
相关推荐
- 26岁中科大教授攻克世界数学难题(中科大26岁数学家)
-
硬核研究世界顶尖数学期刊发表其研究论文“陈杲特任教授年仅26岁。他2008年入读中科大少年班,2012年赴纽约州立大学石溪分校,师从陈秀雄教授攻读博士。2017年博士毕业后历任普林斯顿高等研究院博士...
- CSP-J/S倒计时 如何做好充足准备?
-
CSP-J/S计算机软件能力认证作为信奥系列赛的首场测试,重要性也就不言而喻了。初试的题目往往是被忽略的环节,但初试是进入复试必须经过之路,成绩低的话无法晋级复试,就更别提复试奖项或者晋级NOIP...
- 信息学竞赛CSP- J/S满分小学生是怎么养成的
-
2024年四川省CSP-J的复赛中,一共有11名选手拿到400分满分,其中有一名小学生,让所有人惊讶又惊喜——嘉祥成华小学六年级学生邱明夷。大家都亲切的叫他小邱邱,因为他刚来新易元学信奥的时候是小学四...
- CSP-J/S什么情况容易得零分(csp-j/s是什么意思)
-
信息學奥赛CSP复赛啊,有这几个点不注意就很容易得0分,第一点呢就是复赛采用的是oi赛制,就是说如果结束后提交代码就无法在比赛的过程中,测试你的代码是否正确,只要有一点点错误就可能会导致0分,一定要严...
- 素数分布的解析理论:π(x)、Li(x)和J(x)的严格数学框架
-
本文从解析数论视角严格阐述素数计数函数π(x)、对数积分Li(x)及黎曼素数函数J(x)之间的数学关系。通过引入黎曼ζ函数的零点分布理论,构建了素数定理的精确表达式,并给出误差项的解析结构。一、基本定...
- 陈杲一本书三年读了三遍(陈红看一本书,三天看完)
-
【陈杲一本书三年读了三遍】14岁读大学、23岁获博士学位、26岁解出J方程和超临界厄米特—杨振宁—米尔斯方程的变形这一世界难题,用数学在相对论与量子力学间架起“新桥”。“天才”陈杲说自己“天赋是有一点...
- 数学不好能学信奥吗?要提前学数学吗?一文读懂数学与信奥的关系
-
在信奥的征途上,数学不仅是基石,更是推动孩子们不断前行的动力。然而,对于小学和初中阶段的孩子来说,如何提前布局数学学习,如何平衡数学与信奥的关系,成为了家长们普遍关心的问题。本文将从实际出发,探讨信奥...
- 手术机器人如何既准确又正确(手术机器人如何既准确又正确使用)
-
日前,北京积水潭医院矫形骨科周一新教授团队提出“臼杯矢状面角度的数学转换公式”,填补了该领域的国际空白,据此揭示了统治髋关节重建领域近50年的传统安全区(Lewinek安全区)不能成立之数学原理,并进...
- 天塌了,原来无痕内衣都是用胶粘出来的?
-
无痕内衣和轻薄贴身的夏装十分相配,它平整柔软的边缘也减少了摩擦皮肤的不适感。然而,这种内衣也有一些令人担忧的传闻。有人说无痕内衣都是用“胶水”粘出来的,有人说它稍有不慎就会开胶,甚至走在路上还会突然解...
- COD 消解器回流仪操作指南:3 步完成精准水质检测
-
化学需氧量(COD)检测是水质监测的核心指标,COD消解器回流仪作为实验室标配设备,其操作规范直接决定数据准确性。本文基于2025年最新版《水质检测设备操作规范》(HJ/T399-2025),...
- 产品图多导致页面变慢?WordPress外贸站“懒加载+CDN”一做
-
“哥,我这首页产品图很多,有灯具细节、展示效果、客户实拍,一开页面就卡得一批…”一个做户外照明出口的客户说。我看了下他站,确实首页就塞了20多张大图,图又是PNG原图,有的1MB一张我用C...
- JWT:一文搞懂现代身份验证的 "数字护照"
-
什么是JWT?先看一个生活比喻假设你去图书馆借书,管理员给你一张带盖章的借阅证,上面写着你的姓名、借阅权限和有效期。每次借书时,你只需出示这张证,管理员核对盖章无误就会放行——这就是JWT(...
- JS setTimeout 的另类用法(js中settime)
-
众所周知,JS中不消耗时间的函数一般是同步的,消耗时间的函数(比如:文件操作,网络操作)一般是异步的。JS默认是单线程的,异步是通过EventLoop来完成任务列表里的任务。当你的主线程中同步过程太...
- JVM GC诡异问题排查,k8s差点害死我……
-
前言本文将通过一个真实的生产环境案例,详细展示如何系统性地排查和解决JVM垃圾收集问题。这个案例涵盖了从问题发现、分析诊断到最终解决的完整过程,对于理解JVM调优实战具有重要的参考价值。系统背景我们的...
- 任天堂Switch 2首发评测:DLSS 3.5画质提升与Joy-Con摇杆耐久测试
-
任天堂Switch2终于来了!作为老玩家,我第一时间拿到机器,重点测试了两个大家最关心的点:DLSS3.5技术对画面的增强效果,以及Joy-Con摇杆的耐用性改进。下面用大白话聊聊实测体验,帮你避...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)