JWT认证原理、整合springboot实战应用
JWT认证原理、整合springboot实战应用
- 1、什么是JWT
- 2、JWT能做什么
- 3、与传统的session认证做对比
- 4、JWT结构
- 5、JWT的封装方法
1、什么是JWT
JWT(Json Web Token),是为了网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519),该token被设计为紧凑且安全的。特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务者间传递被认证的用户身份信息,以便于从资源服务器获取资源信,也可以增加一些额外的其他业务逻辑所必须的声明信息,该token也可以直接被用于认证,也可被加密。
2、JWT能做什么
- 授权
这是JWT最常见的方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中使用。
- 信息交换
JWT是在各方之间安全的传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确保发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否遭到篡改。
3、与传统的session认证做对比
- session认证的流程及缺点
①、第一对服务器的压力大:因为每个用户经过服务器认证之后,服务器都要做一次记录,通常这些记录都是保存在内存中,而随着认证用户的增多,服务器开销会明显增大。
②、第二程序扩展性变差:用户认证后,服务器做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须在这台服务器上才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力,也就意味着限制了扩展的能力。
③、第三安全性偏低:因为是基于cookie来进行用户识别的,cookie如果被截获,用户就会很容易受到跨站请求伪造(CSRF)的攻击。
④、基于token的认证:近些年来基于token的认证开始成为主流,比较简单的token就是使用一个唯一的字符串用来标识是哪个用户,然后把这个字符串token存在Redis中,每次请求的时候拦截,判断Redis中是否有这个token,并做一些处理。
- JWT认证流程
4、JWT结构
- 令牌组成
① 标头(header):标头通常由两部分组成,即令牌类型和签名方法
②有效载荷(Payload):其中包含声明。声明是有关实体和其他数据的声明。
③签名(Signature):使用base64编码后的header、payload以及秘钥组成
- 签名目的
签名是对头部和负载内容签名,防止内容被篡改。
5、JWT的封装方法
- maven依赖
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.4.1</version></dependency>
- 生成token
//盐private static final String SIGN = "!@DFSWKJHY~!";/*** 获取token* @param map* @return*/public static String getToken(Map<String,String> map){Calendar calendar = Calendar.getInstance();//默认7天过期calendar.add(Calendar.DATE,7);//创建JWT builderJWTCreator.Builder builder = JWT.create();//Payloadmap.forEach((k,v)->{builder.withClaim(k,v);});String token = builder//指定令牌过期时间.withExpiresAt(calendar.getTime())//签名.sign(Algorithm.HMAC256(SIGN));return token;}
- 校验token
/*** 校验token* @param token*/public static void verify(String token){JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);}
- 获取token信息方法
/*** 获取token信息方法* @param token* @return*/public static DecodedJWT getTokenInfo(String token){return JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);}
JWT认证原理、整合springboot实战应用相关推荐
- RabbitMq(二)一文彻底弄懂RabbitMq的四种交换机原理及springboot实战应用
四大交换机工作原理及实战应用 交换机概念 direct 直连交换机 工作模式图解 springboot代码 Fanout扇出交换机 工作模式图解 springboot代码 Topic主题交换机 工作模 ...
- elasticsearch整合springBoot
elasticsearch的安装请参考:https://blog.csdn.net/qq_42410605/article/details/97884456 elasticsearch插件head的安 ...
- SpringBoot实战之整合WebSocket之群聊
SpringBoot实战之整合WebSocket 文章目录 SpringBoot实战之整合WebSocket 前言 一.WebSocket简介 二.WebSocket原理 三.WebSocket特点 ...
- SpringBoot 实战 (九) | 整合 Mybatis
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 如题,今天介绍 SpringBoot 与 Mybatis 的整合以及 Mybatis 的使用,本文通过注解的形式实 ...
- Spring Security 实战:使用 JWT 认证访问接口
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 欢迎阅读Spring Security 实战 ...
- 32位数据源中没有mysql_[SpringBoot实战]快速配置多数据源(整合MyBatis)
前言 由于业务需求,需要同时在SpringBoot中配置两套数据源(连接两个数据库),要求能做到service层在调用各数据库表的mapper时能够自动切换数据源,也就是mapper自动访问正确的数据 ...
- SpringBoot整合kafka实战之带回调的生产者
本文来说下SpringBoot整合kafka部分知识内容 文章目录 带回调的生产者 方式一 方式二 本文小结 带回调的生产者 前面我们说了简单的生产和消费,本文说下带回调的生产者.kafkaTempl ...
- Shiro教程,整合SpringBoot项目实战(笔记)
1.shiro 1.1什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己 ...
- JWT整合springboot 自定义定时更换秘钥
JWT整合springboot 自定义定时更换秘钥 jwt概要: JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体 ...
最新文章
- 3.db2性能和优化
- DrawerLayout + Toolbar + ViewPager
- Xamarin Android 所见即所得问题
- python相关工作岗位_西安掌握Python有哪些工作岗位能够选择
- 2019年技术盘点云数据库篇(一):UCloud专家谈云数据库:千锤百炼 云之重器
- ASP.NET 动态加载WebService功能
- Android UI:机智的远程动态更新策略
- c语言酒店管理系统,C语言酒店管理系统.pdf
- 树莓派4B Ubuntu20.04 ROS2 DSO realsense d455
- 通过JavaScript脚本轻松实现视频通话
- 微信小程序实现canvas画圆形微信头像
- 2022茶艺师(中级)国家题库模拟考试平台操作
- 计算机毕业设计SSM餐厅管理系统【附源码数据库】
- mysql未开启binlog恢复数据_MYSQL bin_log 开启及数据恢复
- 人工智能时代对会计行业的改变与反思
- Android开发者账号申请注册及上传
- 使用js转换数据库时间类型
- 【2020年第二届“网鼎杯”网络安全大赛 青龙组】Web AreUSerialz
- 【ArcGIS】10 流域水系提取
- r语言三倍标准差法去除异常值,再计算平均值标准差
热门文章
- VS2010与Windows7共舞:对库进行编程
- vs2015企业版密钥
- CMS系统模板引擎设计(5):Label应用初探
- Windows 电源管理
- C/C++数组名与指针区别
- linux mysql 集群安装配置_linux下mysql集群的安装
- 基于顺序存储结构的图书信息表的新图书的入库(C++)
- matlab实现查值,[数学建模(六)]使用MATLAB实现插值
- c语言系统的通用数据结构,(转载)C语言实现通用数据结构的高效设计
- 下列类型不是mysql_下列( )类型不是MySQL中常用的的数据类型。