什么是JWT ? JWT简易快速入门

JWT(JSON WEB TOKEN)详解 JWT(JSON WEB TOKEN),本文主要详细讲解了jwt,从其定义、token的理解、结构、使用等等帮助深刻理解jwt。 阅读详情
  • JWT介绍

  • JWT作用

    • 授权
    • 信息交换
  • 为何选择JWT ?

    • 基于传统的Session验证
    • 基于JWT验证
  • JWT结构

  • JWT+Spring Boot的使用

 

JWT介绍

以下是官网对于JWT的介绍

大概意思就是,Json Web Token(JWT)是一个开放标准,其定义了一个简洁且自包含的方式,以JSON对象的形式在各方之间安全的传递信息。传递的信息能被验证和信任,因为他是数字签名的。简单点说,即是通过JSON形式作为web应用中的令牌,用于在各方之间安全的将信息作为JSON对象进行传输。在数据传输过程中还可以完成数据加密,签名等相关处理。

 

JWT作用

授权

JWT使用最常见的方案。当用户登录后,后续该用户的每个请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。例:单点登录时当前广泛使用jwt的一项功能,因为其开销小而且可以在不同的域中使用。

信息交换

JWT是在各方面之间安全传输信息的好方法。因为可以对JWT进行签名(例如 : 使用公钥/私钥对),所以您可以确保发件人是真实的发件人。此外,由于签名是使用标头和有效负载计算的,因此还可以验证内容是否遭到篡改。

 

为何选择JWT ? 

要解决这个问题,首先要了解在传统Web开发中是如何使用Session来识别不同用户的。

基于传统的Session认证

-- 认证方式

http协议本身是一种无状态协议,这就意味着如果我们向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,为了让应用能识别出是哪个应用发起的请求,我们只能在服务器存储一份用户登录信息(session),并在相应时传递给浏览器(session id),在浏览器端保存(session id)到cookie中,以便下次请求时发送给我们应用(即下次请求从cookie中携带session id访问应用),这样应用就能识别请求来自哪个用户了。

 

-- 认证流程

首先,客户端会请求服务器,服务器校验成功后会将用户相关信息信息存储在服务端Session中,然后返回session id给客户端,存储在浏览器中的cookie,当该认证过的用户再次访问该服务器时就会携带cookie,服务端根据cookie中携带的session id查找与之匹配的session进行校验,从而完成认证。

 

-- 存在问题

1.每个用户经过应用认证之后,应用都需要在服务端做一次记录,以方便用户下次请求的鉴别。通常而言,session都是保存在内存中的,而随着认证用户的增多,服务端的开销会明显增大。

2.用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中,那就意味着用户下次请求还必须请求在这台服务器上,这样才能拿到授权的资源。这种方式在分布式应用中会相应的限制负载均衡器的能力,也意味着限制了应用的扩展能力。

3. 因为是基于cookie来进行用户识别的,假设cookie被截获,用户就会很容易遭受跨站请求伪造攻击。

4. 在前后端分离系统中缺点更大:前后端分离在应用解耦后增加了部署的复杂性。通常用户一次请求就要转发多次。如果用session,每次携带session id到服务器,服务器还要查询用户信息。同时,如果用户很多,这些信息存储在服务器内存中会给服务器增加负担;以及CSRF(跨站伪造请求攻击)问题,session是基于cookie进行用户识别的,cookie若被截获,用户很容易遭受CSRF攻击。同时,session id是一个特征值,表达的信息不够丰富,不容易扩展,且若应用为多节点部署,那么还需要实现session共享机制,不方便集群应用。

 

基于JWT的认证

-- 认证流程

1. 前端通过web表单将自己的用户名和密码发送到后端的接口。这一过程一般是一个HTTP POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息嗅探。

2. 后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT(Token)。形成的JWT形同一个xxxx.yyyy.zzzz的字符串。

3. 后端将JWT字符串作为登录成功的返回结果返回给前端。前端可以将返回的结果保存在localStorage或sessionStorage中,退出登录时前端删除保存的JWT即可。

4. 后端检查是否存在,以及验证JWT的有效性。例:检查签名是否正确、检查Token是否过期、检查Token接收方是否为自己(可选)。

5. 验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应结果。

 

-- 优势

1.简洁(compact):可以通过url,post参数或在HTTP header发送,因为数据量小,传输速度也很快。

2.自包含(Self-contained):负载中包含了许多用户所需要的信息,避免了多次查询数据库。

3.Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持。

4.不需要在服务端保存会话信息,特别适用于分布式微服务。

 

JWT结构

--令牌组成

标头Header:包含了令牌的类型以及其所使用的签名算法(例如HMAC SHA256或RSA),标头由着两部分组成,使用Base64编码组成JWT结构的第一部分。

 

有效载荷payload:包含声明。声明,即是有关实体(通常指用户)和其他数据的声明,同样使用Base64编码组成JWT的第二部分。

 

签名signature:前面两部分都是使用Base64进行编码,即前端可以解码从而获得编码后的信息,signature需要使用编码后的header和payload以及我们提供的一个秘钥,然后使用header中指定的算法进行签名,签名的作用是保证JWT没有被篡改过,这也是签名的目的,实际上签名是对header和payload进行签名,防止其中内容被篡改。假设有人对header或payload的内容编码后进行修改,再进行编码,最终加上之前的的其他部分组成新的JWT,发送到服务端,则服务端会判断出header和payload形成的签名和JWT携带过来的签名是否一致,在不知道服务器加密时使用的秘钥的话,得出来的签名也是不一样的。

例:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload) , secret)

 

附图:JWT格式

 

--关于信息安全问题

Base64严格来说不是加密,是可以被解码,是可逆的,故在使用JWT传输数据的时候尽量不要存储敏感信息。

 

JWT+Spring Boot的使用

使用IDEA创建一个Spring Boot项目,略。

引入所需要的jar包

<!--    引入JWT    -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.10.3</version>
        </dependency>

写一个生成token的测试方法,我们在payload中存储了username,userId以及department的信息。

//自己指定的秘钥
    private static final String SIGNATURE = "AlexZheng1997%^&*JGSJjsvjdjhkagjd";

    //生成token
    @Test
    void contextLoads() {
        //获取一个Calendar类实例
        Calendar instance = Calendar.getInstance();
        //设置时间单位和时间
        instance.add(Calendar.SECOND,500);
        //创建一个JWT Builder
        String token = JWT.create()
//                .withHeader() //一般header默认就好
                .withClaim("username","张三") //payload
                .withClaim("userId",0001)
                .withClaim("department","001")
                .withExpiresAt(instance.getTime())  //指定令牌过期时间
                .sign(Algorithm.HMAC256(SIGNATURE)); //使用指定秘钥和算法进行签名

        System.out.println(token); //此token返回给客户端
    }

运行代码后控制台出现token

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJkZXBhcnRtZW50IjoiMDAxIiwiZXhwIjoxNjAwNTA1NjgxLCJ1c2VySWQiOjEsInVzZXJuYW1lIjoi5byg5LiJIn0.pH9rgnj04jEBRBlxMHH3gzL6t4CPpnWMYoLlOz9ODy8

上面就是生成的token(JWT),有效期为指定的500秒。接下来我们写一个方法来模拟后端接受并验证token是否正确。

   //验证token
    //客户端发送请求到达服务端
    @Test
    public void test(){
        //创建JWTVerifier对象指定加密的算法和秘钥
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SIGNATURE)).build();
        //创建DecodeJWT获取JWTVerifier验证token后的结果,若验证失败则会报错
        DecodedJWT verify = jwtVerifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9." +
                "eyJkZXBhcnRtZW50IjoiMDAxIiwiZXhwIjoxNjAwNTA1NjgxLCJ1c2VySWQiOjEsInVzZXJuYW1lIjoi5byg5LiJIn0." +
                "pH9rgnj04jEBRBlxMHH3gzL6t4CPpnWMYoLlOz9ODy8");
        //前面存储的信息
        System.out.println(verify.getClaim("username").asString());
        System.out.println(verify.getClaim("userId").asInt());
        System.out.println(verify.getClaim("department").asString());
        System.out.println("过期时间:"+verify.getExpiresAt());
//        //other way
//        System.out.println(verify.getClaims().get("username").asString());
//        System.out.println(verify.getClaims().get("userId").asInt());
//        System.out.println(verify.getClaims().get("department").asString());
    }

验证成功。

如有什么地方写错了,恳请各位大佬帮忙指正。

 

 

JWT - 令牌认证(认证流程和原理、Jwt 工具类、搭配 Redis 使用) 1. 首先前端将用户名和密码发送给后端,后端对用户名和密码校验成功后,会将用户 id 和其他信息作为 payload ,然后将其分别进行 Base64 编码,拼接,最后再签名,形成一个 JWT(Token). 形成的 JWT 就形同 xxx.yyy.zzz 这种结构的字符串.http 协议是一种无状态的协议,也就意味着当用户第一次通过用户名和密码登录成功以后,下一次再请求的时候,用户还需要再进行登录才行,因为根据 http 协议,我们不能知道是哪个用户发出的请求. 阅读详情

相关推荐

JavaScript实现JWT鉴权(附完整源码)

JavaScript实现JWT鉴权(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 955

什么是JWT?(细致讲解)

什么是JWT?传统的session、token认证、JWT登录鉴权

Ethereal的博客 8万+

因果推断(二):因果推断涉及的ITE、ATE、CATE等效应

因果效应也称为**处理效应(Treatment effect)**是用于评判干预与否的结果差异的指标(处理变量对结果变量的影响)。比如在接受治疗组中,如果这些人不接受治疗,这组人接受治疗和不接受治疗的效应差异是多少。定义为实验组中每个个体的处理效应差异,比如一个个体在接收治疗和不接受治疗的两个处理方式的健康程度得分的差。但是一个人因为不可能。比如我们想探究接受治疗的男性用户和不接受治疗的男性用户的平均效果差异就是CATE。前面说ITE是无法观测的,是因为一个人不能同时接受治疗又不接受治疗,这里关键的就是。

Y1n的博客 3713

JWT简介、JWT优缺点、JWT使用方法、.NET6使用JWT示例、JWT与Session对比

JWT简介、JWT优缺点、JWT使用方法、.NET6使用JWT示例、JWT与Session对比

1万+

3DMax马克杯制作教程

01 在前视图创建一个【圆柱体】,设置参数,长度为32,高度为82;高度分段12、边数为16;如图所示。 02 点击鼠标右键,把圆柱体转换为可编辑多边形,如图所示。 03 在修改面板中,选择【多边形】层级,在视图中选择所示的面,使用缩放工具稍微缩小一点,如图所示。 04 点击【插入设置】,如图所示。 设置插入数量为2.5mm。 05 点击【挤出设置】,如图所示。 ...

youximoxingEDO的博客 3478

智能枕头

睡觉和吃饭是一样重要的,一个人想要健康的体魄,不仅要饮食得当,更需要有一个好的睡眠质量。随着人们生活品质的提高,人们对于睡眠的要求越来越高,那么就非常需要一款舒适的枕头。为了适应市场的需求,我爱物联网推出了智能枕头。因为智能枕头可以给头部及颈椎一个良好的承托力,舒适、柔软、放松,让人更好的进入睡眠。 目录 一、智能枕头方案介绍 二、智能枕头的优点 三、智能枕头功能介绍 四、智能枕头APP开发 五、...

6108我爱物联网方案开发优快云博客 3659

jwt超快速入门

为了防篡改用户的信息以及满足无状态的分布式系统开发,因为无需保存session了,因为用户登录后,后端就会生成一个令牌token,交给前端,以后前端发送给后端的每个请求都需要有该令牌,后端就会进行校验然后授权进行业务处理。jwt通过json、web、token的联合使用,设置header、载荷、签名加密了用户信息,避免使用session频繁访问服务器,以及防止篡改token,保证了用户的信息安全,但是要注意适用场景,后续的进阶知识后面补上,以项目促进学习。

2402_83663214的博客 1049

Linux内核4.14版本——drm框架分析(1)——drm简介

drm框架分析

yangguoyu8023的博客 1万+

JWT快速入门

jwt快速入门

qq_68512683的博客 233

AUTOSAR RTE配置实战:从ECU分区到Task映射的完整指南

本文提供了一份AUTOSAR RTE配置的完整实战指南。从创建ECU分区、定义OS任务,到实现Runnable Entity与Task的精确映射,详细解析了每一步的操作要点与常见陷阱。文章结合配置工具界面,旨在帮助开发者高效完成RTE配置,确保系统实时性与数据一致性,是掌握AUTOSAR核心开发流程的实用参考。

weixin_29228203的博客 484

通信算法之249: DJI波形物理层

D-J-I的Lightbridge波形、Ocusync1波形、Ocusync2波形、Ocusync3波形,

leegang12的专栏 1438

Spring Boot整合JWT快速入门教程

目录 前言 1. 什么是JWT 2. JWT解决的问题 3. JWT原理 4. 快速入门 1. jar包 2. JWT工具类 3. 自定义注解 4. 拦截器 5. controller层 6. 测试 6.1 直接访问 6.2 先登录,再访问 5. 总结 前言 小编通过网上的资源,自学spring boot整合JWT,但发现网上的大部分资源对新手入门都不是太友好~。所以本着复杂问题简单化的思想,写了这篇快速入门的文章,即是个人的学习笔记,又是帮助大家入门的...

weixin_50235024的博客 1774

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1904

SpringBoot集成JWT快速入门Demo

近年来,随着前后端分离、微服务等架构的兴起,传统的cookie+session身份验证模式已经逐渐被基于Token的身份验证模式取代。备注:将token或者一个唯一标识UUID=UUID.randomUUID().toString()存进Cookie中(别存在Http的header中了),设置路径为整个项目根路径/*;往往以这个唯一标识为key,用户信息为value缓存在服务器中,实现单点登录。

mickey2007的博客 1420

完整功能-《网络安全创新实践》:设计并实现一种基于Npcap的网络嗅探器(直接能运行cpp的MFC代码+实验报告)

《网络安全创新实践》:设计并实现一种基于Npcap的网络嗅探器。(直接能跑的MFC)监听所有数据包,以及监听指定IP地址的数据包;(2)能够显示完整的IP数据包首部信息,例如:版本、首部长度、数据包长度、数据包类型(协议字段)、TTL、源IP地址、目的IP地址等;(3)能够显示完整的TCP报文段信息,例如:源端口、目的端口、序号、确认号、数据部分等;(4)能够自动检测SQL注入攻击等Web攻击行为;(5)能够将监听到的数据包信息保存到文件中,以及从文件中读取并显示数据包信息;(6)具有图形化操作界面。

weixin_46531010的博客 660

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

基于Spring security + Spring Boot + JWT的封装框架快速入门指南

吐槽 近期做一个小玩意,打算实现前后端分离,那么就要用到符合REST协议的API接口了。如果使用纯API的话,就肯定不希望所有人都可以调用我的接口,所以对于API的安全就要重视了,对于我刚刚学习Spring Boot的人来说。第一就想到用Spring全家桶,百度一搜还真有:spring security就是这个安全组件,在配合JWT实现身份鉴定,这样做服务器就不用存session,也完美解决了分布...

Wyndem的博客 2310

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JWT技术快速入门

JSON Web token简称JWT, 是用于对应用程序上的用户进行身份验证的标记。也就是说, 使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性, 同时保证应用程序的安全;...

m0_72524605的博客 346

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JWT快速入门及所需依赖

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

hhhhhh的博客 6604

SpringSecurity+JWT快速入门

SpringSecurity+JWT快速入门

胡云峰的博客 5741

JWT令牌的快速入门

文章目录JWT一、JWT概述1. 简介2. 作用3. 传统Session认证的缺点二、JWT结构三、JWT认证流程及优势1. JWT认证流程文字概述2. JWT认证图示流程3. JWT优势 JWT 一、JWT概述 1. 简介 JWT简称JSON Web Token,也就是通过JSON形式作为Web应用中的令牌,用于在各方之间安 全的将信息作为JSON对象传输;在数据传输过程中还可以完成数据加密、签名等相关处理 2. 作用 (1) 授权 JWT的最常见方案;一旦用户登录,每个后续请求将包括JWT,从而允许用户

立志成为一个前端、后端、测试全方位发展的程序员 562
上一篇: 单例bean与原型bean的区别,以及Spring中的bean为何默认是单例模式
政晓橙
博客等级 码龄9年 15粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值