JWT令牌详细解析

JWT令牌

  • 前言
  • 一、JWT是什么?
  • 二、JWT与传统Cookie+Session的对比
  • 三、JWT
    • 1. JWT的功能
    • 2. JWT的结构
    • 3. JWT的使用


前言

主要介绍了SpringBoot集成JWT令牌详细说明,JWT方式校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录,验证token更为简单。


一、JWT是什么?

JWT简称JSON、Web、Token,也就是通过JSON形式作为web与应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中还可以完成数据加密、签名等相关处理。
JSON、Web、Token是一个开放标准,它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全的传输信息。此信息可以验证和信任,因为它是数字签名的,JWT可以使用秘密或使用RSA或ECDSA的公钥/私钥对进行签名。
官网:http://jwt.io/introduction/

二、JWT与传统Cookie+Session的对比

  1. 在传统的用户登录认证中,因为http是无状态的,所以都是采用session方式。用户登录成功,服务端会保证一个session,当然会给客户端一个sessionId,客户端会把sessionId保存在cookie中,每次请求都会携带这个sessionId。

传统Cookie+ Session认证

在这里插入图片描述

  1. cookie+session这种模式通常是保存在内存中,而且服务从单服务到多服务会面临的session共享问题,随着用户量的增多,开销就会越大。而JWT不是这样的,只需要服务端生成token,客户端保存这个token,每次请求携带这个token,服务端认证解析就可。

  2. JWT方式校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录,验证token更为简单。

JWT 认证
用户进行认证,向服务器发送请求,服务器响应请求并进行认证,认证通过后生成JWT即token,响应给前端;后面的每次请求都携带JWT,服务器拦截请求验证token的有效性,正确的token执行业务逻辑响应数据,错误的token返回错误信息给前端,前端展示相应的的信息。

在这里插入图片描述

三、JWT

1. JWT的功能

JWT主要的功能有授权信息交互两种
授权: 用户的授权,一旦用户登录后获得了token,后续一些需要用户权限的请求就不会拒绝请求。
信息交互: JSON Web Token是在各方之间安全传输信息的好方法。因为可以对JWT进行签名(例如:使用公钥/私钥对),所以可以确保发送方信息,由于签名是使用标头和有效负载计算的,因此可以验证内容是否遭到篡改,保证信息的完整性。

2. JWT的结构

本质是一个字符串,token ====> header.payload.singnature
令牌的组成: 标头(header) 、有效负荷(payload) 、签名(singnature)
JWT通常所示:xxxxxx.yyyyyy.zzzzzz

  • header: 标头通常由两部分组成即令牌的类型(JWT)和使用的算法类型。【通常使用Base64编码组成JWT结构的第一部分】
{"alg":"HS256","typ":"JWT"
}
  • payload: 有效负载,存储用户的相关的信息和其他数据的声明。【通常使用Base64编码组成JWT结构的第二部分】
{"username":"qiumin","password":"123456"
}
  • singnature: 签名,与前面两个部分生成JWT,该签名不能让其他人知道,是保证token不被串改,保证信息的安全。【通常使用Base64编码组成JWT结构的第二部分】
header+"."+payload+"."+singnature ---> 组成唯一的token

3. JWT的使用

  1. 导入JWT依赖
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version>
</dependency>
  1. 生成token
@Testpublic void contentLoad(){HashMap<String,Object> map = new HashMap<>();Calendar instance = Calendar.getInstance();instance.add(Calendar.SECOND,180);String token = JWT.create().withHeader(map)  //header.withClaim("username", "qiumin") //payload.withClaim("password", "123456") //payload.withExpiresAt(instance.getTime()).sign(Algorithm.HMAC256("!FhSD!#VDZF%#FDBD"));//签名System.out.println(token);}
  1. 验证解析token
 @Testpublic void Auth(){JWTVerifier verifier = JWT.require(Algorithm.HMAC256("!FhSD!#VDZF%#FDBD")).build();DecodedJWT verify = verifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsImV4cCI6MTY1NzQzODUxNSwidXNlcm5hbWUiOiJxaXVtaW4ifQ.1TIUuWP1d1-vHc71oTw2pH5LAxtCehiiRnaK3tIZob8");System.out.println(verify.getHeader());System.out.println("payload: "+verify.getClaim("username").asString());System.out.println("payload: "+verify.getClaim("password").asString());System.out.println("过期时间: "+verify.getExpiresAt());}
  1. 常见的JWT异常,封装成工具类JwtUtils
    SignatureVerificationException: 无效签名。
    TokenExpiredException: token过期。
    AlgorithmMismatchException: token算法不一致。
    InvalidClaimException: 失效payload异常。
package com.qiumin.utils;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;import java.util.Calendar;
import java.util.Map;/*** @author qiumin* @classname JWTUtils* @Description love code* @date 2022-07-10 15:33*/public class JwtUtils {private static final String SING = "!FhSD!#VhDZF%#FDBD";/*** 获得Token* @param map1 header* @param map2 payload* */public static String getToken(Map<String,Object> map1, Map<String,String> map2){Calendar instance = Calendar.getInstance();instance.add(Calendar.SECOND,180); //过期时间JWTCreator.Builder builder = JWT.create();builder.withHeader(map1); //headermap2.forEach((k,v)->{builder.withClaim(k,v);}); //payloadbuilder.withExpiresAt(instance.getTime()); //过期时间String token = builder.sign(Algorithm.HMAC256(SING));//签名return token;}/*** 验证token* @param token 令牌* */public static void verify(String token){JWTVerifier build = JWT.require(Algorithm.HMAC256(SING)).build();build.verify(token);}/*** 获取token中的信息* @param token 令牌* */public static DecodedJWT analysis(String token){return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);}}
  1. 拦截器配置验证token
    创建拦截器的类,配置WebMvcConfigurer,将自己的自定义拦截器装配到容器中
package com.qiumin.interceptor;import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qiumin.utils.JwtUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;/*** JwtInterceptor拦截器类** @author qiumin* @classname JwtInterceptor* @Description love code* @date 2022-07-14 13:14*/public class JwtInterceptor implements HandlerInterceptor {/*** 拦截器* @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("token");HashMap<String, Object> map = new HashMap<>();JwtUtils jwtUtils = new JwtUtils();try {jwtUtils.verify(token);return true;}catch (SignatureVerificationException e){e.printStackTrace();map.put("msg","无效签名!");}catch (TokenExpiredException e){e.printStackTrace();map.put("msg","token过期!");}catch (AlgorithmMismatchException e){e.printStackTrace();map.put("msg","token算法不一致!");}catch (Exception e){e.printStackTrace();map.put("msg","token无效!");}map.put("state",false);response.setContentType("application/json;charset=UTF-8");//响应给前端response.getWriter().println(new ObjectMapper().writeValueAsString(map));return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

配置拦截器

package com.qiumin.config;import com.qiumin.interceptor.JwtInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author qiumin* @classname InterceptorConfig* @Description love code* @date 2022-07-14 13:37*/@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new JwtInterceptor()).addPathPatterns("/user/test2")  //拦截的路径请求.excludePathPatterns("/user/login");  //放行的请求路径}
}

参考文章:https://blog.csdn.net/m0_57752520/article/details/125785908
如有问题可联系博主

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3245762.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

解决C#读取US7ASCII字符集oracle数据库的中文乱码

&#x1f468; 作者简介&#xff1a;大家好&#xff0c;我是Taro&#xff0c;全栈领域创作者 ✒️ 个人主页&#xff1a;唐璜Taro &#x1f680; 支持我&#xff1a;点赞&#x1f44d;&#x1f4dd; 评论 ⭐️收藏 文章目录 前言一、解决方法二、安装System.Data.OleDb连接库三…

隐藏需求缺失的4种解决技巧

在需求分析过程中&#xff0c;隐藏需求的缺失往往会造成项目范围扩张、成本增加&#xff0c;造成延期交付和风险增加等问题&#xff0c;直接影响客户满意度。而隐藏需求的挖掘和确认&#xff0c;有利于优化项目范围&#xff0c;提升产品质量&#xff0c;增强团队信心。 因此&am…

录屏工具哪款好用?精选3款,宝藏分享

“想问一下大家平时都是用哪一款录屏软件啊&#xff1f;感觉现在市面上的录屏软件特别多&#xff0c;但是却一直找不到适合自己的&#xff0c;想看一下大家的宝藏录屏工具都有哪些&#xff0c;求推荐&#xff01;” 在数字化时代的浪潮中&#xff0c;录屏工具如同一把神奇的画…

【机器学习】Scoring Model Scores: 理解、设计与优化评分模型

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Scoring Model Scores: 理解、设计与优化评分模型引言1. 评分模型的定义与重要性…

什么是大数据信用?它的作用有哪些?怎么查询大数据?

在金融行业中&#xff0c;风险管理是至关重要的一环。传统的信用评估方法主要基于借款人的财务状况和信用历史&#xff0c;但这些信息往往无法全面反映借款人的信用状况。大数据信用的出现为金融风控提供了新的解决方案。 首先&#xff0c;大数据信用可以为金融机构提供更全面的…

ns3-gym入门(三):在opengym基础上实现一个小小的demo

因为官方给的"opengym""opengym-2"这两个例子都很简单&#xff0c;所以自己改了一个demo&#xff0c;把reward-action-state相互影响的关系表现出来 一、准备工作 在ns3.35/scratch目录下创建一个文件夹&#xff1a; &#xff08;后续的运行指令后面都需要…

Excel办公技巧:制作二级联动下拉菜单

分享制作二级联动下拉菜单的方法&#xff0c;即使数据有增删&#xff0c;菜单也能自动更新&#xff01; 可以通过先定义名称&#xff0c;再结合数据验证&#xff0c;来做二级联动下拉菜单。 1. 准备数据 首先&#xff0c;我们需要准备好要进行二级联动下拉菜单的数据&#xff…

【单目3D检测】smoke(1):模型解析

SMOKE是纵目科技在2020年提出的单目3D检测新方法&#xff0c;论文展示了一种新的3D目标检测方法&#xff0c;该方法通过将单个关键点估计与回归3D变量相结合来预测每个检测到的目标3D bounding box。SMOKE延续了centernet的key-point做法&#xff0c;认为2d检测模块是多余的&am…

【经验分享】关于静态分析工具排查 Bug 的方法

文章目录 编译器的静态分析cppcheck安装 cppcheck运行 cppcheck 程序员的日常工作&#xff0c;不是摸鱼扯皮&#xff0c;就是在写 Bug。虽然这是一个梗&#xff0c;但也可以看出&#xff0c;程序员的日常一定绕不开 Bug。而花更少的时间修复软件中的 Bug&#xff0c;且不引入新…

Spring Web MVC入门(2)(请求2)

目录 1.传递JSON数据 传递JSON对象 2.获取URL中的参数PathVariable 3.上传文件RequestPart 4.获取Cookie/Session (1)获取Cookie 简洁获取Cookie (2)获取Session Sesson读取 简洁获取Session(1) 简洁获取Session(2) 5.获取Header 简洁获取Header 1.传递JSON数据 J…

Python中的数据结构:五彩斑斓的糖果盒

在Python编程的世界里&#xff0c;数据结构就像是一个个五彩斑斓的糖果盒&#xff0c;每一种糖果都有其独特的味道和形状。这些多姿多彩&#xff0c;形状和味道各异的糖果盒子包括了&#xff1a;List&#xff08;列表&#xff09;、Tuple&#xff08;元组&#xff09;、Diction…

深度学习落地实战:识别火车票信息

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

本地多模态看图说话-llava

其中图片为bast64转码&#xff0c;方便json序列化。 其中模型llava为本地ollama运行的模型&#xff0c;如&#xff1a;ollama run llava 还有其它的模型如&#xff1a;llava-phi3&#xff0c;通过phi3微调过的版本。 实际测试下来&#xff0c;发现本地多模型的性能不佳&…

【数智化案例展】某省会城市——轨道交通线网云平台建设

‍ 逸迅科技案例 本项目案例由逸迅科技投递并参与数据猿与上海大数据联盟联合推出的《2024中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 本项目将打造一个先进的线网指挥中心大数据平台&#xff0c;它将作为这座城市轨道…

钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦合器

BL20X系列耦合器是钡铼技术开发的一款用于分布式I/O系统的设备&#xff0c;专为工业环境下的高速数据传输和远程设备控制而设计&#xff0c;支持多种工业以太网协议&#xff0c;包括Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP和OPC UA等。如果您正在考虑部署BL20X系列耦合…

如何制定高效的媒体公关解决方案

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体公关解决方案是指企业或组织为提升品牌形象、塑造公众认知、应对危机事件等目的&#xff0c;通过媒体渠道制定并实施的一系列公关策略和行动计划。这一解决方案旨在通过有效的媒体沟…

4. JavaSE ——【移位运算符】

&#x1f4d6; 开场白 亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&…

智慧煤矿:AI视频智能监管解决方案引领行业新变革

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到各个行业&#xff0c;为传统产业的转型升级提供了强大的动力。在煤矿行业中&#xff0c;安全监管一直是一个重要的议题。为了提高煤矿的安全生产水平&#xff0c;降低事故发生率&#xff0c;智…

6 款 SD 卡数据恢复软件,助您恢复丢失的文件

如果您经常使用摄像机、相机或某种类型的手机&#xff0c;您会发现您的数据和文件存储在 SD 卡上。这使得它成为设备中非常重要的一部分。但是&#xff0c;SD 卡相对容易损坏&#xff0c;这可能会导致您的文件和数据意外丢失。 此时&#xff0c;您需要采取一些措施来帮助您恢复…

springboot项目 导入 maven坐标 错误 Could not transfer artifact XXX

1.报错原因 当时导入的是 redis坐标 &#xff0c;导入jar 包报错&#xff08;当时是网速太慢了&#xff0c;一直卡着不动 就关了 idea 重新下载&#xff09;结果报错 之前的redis 项目都可以的&#xff0c;网上找了一下 都没解决 2.解决办法 既然说不能传输&#xff0c; 就说…