JWT(1)介绍和原理

发布时间:2026/10/29 10:14:52

JWT(1)介绍和原理 目录一、介绍1、简介2、与session相对比较3、流程4、安全问题5、失效问题6、在线解析平台二、结构1、Header1.1、介绍1.2、组成2、Payload3、Signature3.1、介绍3.2、加密算法3.3、使用建议三、api操作1、sign生成2、verify验证3、获取payload一、介绍1、简介JWT无状态登录是token的一种。全称json web token轻量级的授权和身份认证规范。跨平台存在。结构是 JSON它是一个 JavaScript 对象表示法。它有各种部分标头、有效负载和签名部分。这些都被打包起来然后对 Base64 进行编码和签名以便它是 URL 安全的。2、与session相对比较1有状态登录sessiontomcat中把用户的登录信息保存在服务端的session中再给用户一个cookie值。记录对应的session值下次客户端带cookie来访问时再识别对应的session找到用户的信息。缺点服务器的负荷变大保存大量的session数据。2无状态登录jwt服务器不保存用户的登录信息由客户端请求携带自己的身份信息带入token来获取身份认证。服务器不再保存用户的登录信息多次请求不用访问回到同一台服务服务器可以弹性伸缩减小服务端压力缺点一旦JWT签发在有效期内这个token将会一直有效和服务是否重启无关而session有自己的会话周期。3、流程第一次请求访问时候由服务器对用户进行身份验证验证通过将身份信息加密进程token返回给客户端作为其访问其他服务器集群的身份凭证。每次请求携带token服务器对其进行解密判断有效性。4、安全问题token必须安全可靠推荐采用JWT RSA非对称加密另外JWT一旦签发在有效期内将会一直有效可以通过设置较短过期时间或在业务接口再次做判断、再加入拦截等方法来减小安全风险。1Base64编码方式是可逆的也就是透过编码后发放的Token内容是可以被解析的。一般而言我们都不建议在有效载荷内放敏感讯息比如使用者的密码。2JWT其中的一个组成内容为Signature可以防止通过Base64可逆方法回推有效载荷内容并将其修改。因为Signature是经由Header跟Payload一起Base64组成的。3 Cookie 被窃取了第三方可以做 CSRF 攻击Cookie丢失就表示身份就可以被伪造。故官方建议的使用方式是存放在LocalStorage中并放在请求头中发送。5、失效问题无状态JWT令牌Stateless JWT Token发放出去之后不能通过服务器端让令牌失效必须等到过期时间过才会失去效用。假设在这之间Token被拦截或者有权限管理身份的差异造成授权Scope修改都不能阻止发出去的Token失效并要求使用者重新请求新的Token。6、在线解析平台New tab (jwt.io)二、结构在紧凑的形式中JWT包含三个由点.分隔的部分它们分别是header、payload、sign。如我生成了一个jwt tokeneyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJ3ZWItZGVtbyIsImlzcyI6Ind0eXkiLCJ1c2VybmFtZTEiOiJscyIsImV4cCI6MTcyMDE2NjY4NCwidXNlcm5hbWUiOiJscyJ9.QZpJ0mMjm7PmXFb682Xnp5KhaUp8gQ50g-rOU8nvYow1、Header1.1、介绍第一部分是header。为base64编码可解码不要存放关键信息。如我这里解码得到或者通过jwt在线解析平台1.2、组成Header通常由两部分组成1令牌的类型即JWT2常用的加密算法见com.auth0.jwt.algorithms.Algorithm2、Payload第二部分是包含具体的身份信息和声明 (claims)的载荷。为base64编码可解码。放声明内容就是存放沟通讯息的地方在定义上有3种声明Claims1Registered claims注册声明:这些是一组预先定义的声明它们不是强制性的但推荐使用以提供一组有用的可互操作的声明。 其中一些是iss发行者exp到期时间sub主题aud受众等。#Registered Claim Names#2Public claims公开声明:这些可以由使用JWT的人员随意定义。 但为避免冲突应在IANA JSON Web令牌注册表中定义它们或将其定义为包含防冲突命名空间的URI。3Private claims私有声明:这些是为了同意使用它们但是既没有登记也没有公开声明的各方之间共享信息而创建的定制声明。如我这里解码得到通过jwt在线解析平台3、Signature3.1、介绍签名由前两部分加密形成用于验证 Token 的完整性和真实性不能base64解码。如我使用一个sign通过base64解码不了3.2、加密算法Signature不能被解密。因为 Signature 并不是加密的结果而是使用指定的加密算法如 HMAC、RSA 等基于 Header 和 Payload 计算出来的一个摘要或签名相当于先加密再hash。Signature 的作用是用于验证 JWT 是否被篡改过而不是用来获取原始数据或加密的数据。计算方法Signature是这么算出来的 var encodedString base64UrlEncode(header) . base64UrlEncode(payload); var signature HMACSHA256(encodedString, your_secret); 说明 1、header和payload先用base64加密用点链接起来再用header里alg所指定的算法计算摘要 2、your_secret 就是秘钥加密方和解密方共同知道的解密的时候要用如使用HMAC SHA256算法签名将按照以下方式创建HMACSHA256( base64UrlEncode(header) . base64UrlEncode(payload), secret)通过在线解析平台3.3、使用建议不要存放敏感信息在Token里。Payload中的exp时效不要设定太长。开启Only Http预防XSS攻击。如果担心重播攻击replay attacks 可以增加jtiJWT IDexp有效时间 Claim。在你的应用程序应用层中增加黑名单机制必要的时候可以进行Block做阻挡这是针对掉令牌被第三方使用窃取的手动防御。三、使用方法以常见的auth0和jjwt插件为例1、sign生成需要指定算法算法又依赖了secret所以需要保管好secret防止别人随意生成来攻击系统1auth0JWT.create() //iss签发方 .withIssuer(wtyy) //aud接收jwt的一方 .withAudience(web-demo) //expjwt的过期时间 //.withExpiresAt() //其他自定义通信信息 .withClaim(username, userEntity.getUsername()) .withClaim(age,userEntity.getAge()) .withExpiresAt(date) .sign(algorithm);2jjwt// 生成 JWT public static String generateToken(String key) { long expirationTime 1000 * 60 * 60; // 1小时 Date now new Date(); Date expiryDate new Date(now.getTime() expirationTime); return Jwts.builder() .setSubject(web) .setIssuer(wtyy) .setAudience(to_third_party) .setIssuedAt(now) .setExpiration(expiryDate) .signWith(SignatureAlgorithm.HS256, key) .claim(userName,wtyy) .claim(age,18) .compact(); }2、获取payload注意只要是一个jwt都可以解析出payload即使过期了也可以解析出payload因为过期是业务判断的。所以拿到一个jwt应该① 验证算法是否合法即是不是签发方生成的② 并且判断是不是已经过期了③ 最后再去获取payload④ 如果需要获取payload后还可以通过payload通信信息做进一步的校验从而判断token是否合法。1auth0对于第一步auth0提供了单独的 verify验证方法验证不通过会抛异常private static boolean verifyToken(String secret, String token) { Algorithm algorithm getCurrentAlgorithm(secret); try{ JWTVerifier verifier JWT.require(algorithm).build(); //验证不通过会抛异常 verifier.verify(token); return true; }catch (Exception e){ log.error(token非法); return false; } }完整的验证关键代码示例DecodedJWT jwt JWT.decode(token); //1、验证 是否过期 Date expireDate jwt.getExpiresAt(); if(expireDate.before(new Date())){ log.error(token已过期); } //2、verify验证 verify(); //3、获取通信字段 MapString, Claim claims jwt.getClaims(); String username claims.get(username).asString(); int age claims.get(age).asInt(); //4、根据通信字段进一步校验是否合法合法的存入全局变量做为当前调用方的凭证 ......2jjwtjjwt插件的API设计获取payload可传入密钥来验证算法验证不通过会抛异常验证成功返回payloadpackage org.es.demo.util; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import lombok.extern.slf4j.Slf4j; import java.util.Date; Slf4j public class JwtUtil { //private static final SecretKey SECRET_KEY Keys.secretKeyFor(SignatureAlgorithm.HS256); // 自动生成一个符合要求的密钥 // 生成 JWT public static String generateToken(String key) { long expirationTime 1000 * 60 * 60; // 1小时 Date now new Date(); Date expiryDate new Date(now.getTime() expirationTime); return Jwts.builder() .setSubject(web) .setIssuer(wtyy) .setAudience(to_third_party) .setIssuedAt(now) .setExpiration(expiryDate) .signWith(SignatureAlgorithm.HS256, key) .claim(userName,wtyy) .claim(age,18) .compact(); } private static String getUserNameByToken(String token, String key) { Claims claims; try{ claims Jwts.parser() .setSigningKey(key) // 设置签名密钥 .parseClaimsJws(token) .getBody(); // 获取 Claims 数据 }catch (Exception e){ log.error(token不合法); return null; } Date expirationDate claims.getExpiration(); boolean isExpired expirationDate.before(new Date()); if (isExpired) { log.error(token已过期); return null; } return (String) claims.get(userName); } public static void main(String[] args) { String key ******; String jwt generateToken(key); String userName getUserNameByToken(jwt,key); log.info(结果userName); } }
延伸阅读

更多相关文章

2026/10/29 10:14:52

安卓面试集总目录(编辑中)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 10:09:51

SAP电信行业解决方案:从计费合并到序列号管理的落地指南

简介:在通信与网络行业中,SAP电信行业解决方案的专题资料适合业务管理人员、IT规划人员及信息化决策者阅读。资源打包为单个PDF文件,大小43KB,篇幅精练但要点集中,适合快速通读后用于方案对比或内部培训参考。已有384人…

2026/10/29 10:09:51

李晓峰通信原理AM调制PPT:从公式到Python/MATLAB可执行仿真

简介:本资源是电子科技大学《通信原理》课程(李晓峰版)第3章“模拟传输”的配套教学课件,面向通信工程、电子信息类本科生及考研复习者,系统讲解模拟通信核心机制与工程实现要点。课件以PPT形式呈现,共1个文…

2026/10/29 11:20:08

KIMI API流式输出实战:Android端SSE解析与打字机效果实现

简介:面向Android开发者与AI应用集成者的Kimi API流式输出实战工程,聚焦大模型对话场景中逐字返回、实时渲染的接入难题,帮助读者理解流式响应在移动端的完整落地路径。压缩包共813个文件、约14.99MB,以flat、json、xml等配置与资…

2026/10/29 11:20:08

eNSP校园网仿真:从接入到出口的完整配置与排错指南

简介:这份资源面向网络工程、通信工程等专业的在校学生与备考华为认证的学习者,围绕校园网的整体规划与仿真验证展开,可用于课程设计、毕业设计选题参考以及HCNA/HCNP阶段的综合实验练习。压缩包共19个文件,约13.04MB,…

2026/10/29 11:20:08

豆瓣短评情感分析实战:SnowNLP重标定与中文清洗避坑指南

简介:本资源是一份面向Python初学者与数据挖掘入门者的实战教学包,聚焦豆瓣电影评论的情感分析与可视化实践,解决自然语言处理中情感倾向判断与关键词提取的实际问题。压缩包共10个文件,含8个Python脚本(覆盖文本清洗、…

2026/10/29 11:20:08

GPS轨迹噪点剔除API:分层算法与Python代码实现

简介:这份资源面向需要处理GPS轨迹数据的Python开发者与位置服务从业者,聚焦轨迹噪点剔除这一实际问题,提供可落地的降噪思路与代码参考。压缩包共3个文件,均为py脚本,整体约7KB,分别对应降噪算法实现以及高…

2026/10/29 11:20:08

GPS轨迹噪点剔除API:Python算法与工程实践

简介:这份资源面向需要处理GPS轨迹数据的Python开发者与位置服务从业者,聚焦轨迹噪点剔除这一实际问题,提供可落地的降噪思路与代码参考。压缩包共3个文件,均为py脚本,整体约7KB,分别对应降噪算法实现以及高…

2026/10/29 11:15:07

OpenDSS配电网仿真入门:元件优先、母线节点与命令语法

简介:OpenDSS资料中文手册是一份面向电力系统仿真初学者与工程技术人员的中文入门指导,对应 EPRI 推出的开源配电系统仿真软件 OpenDSS,帮助读者在短期内理解其电路模型、运行机制与基本操作流程。整份资料只含 1 个 PDF 文件,压缩…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑