JWT—是什么?如何实现用户登录验证?

jwt是什么?

全称:Java Web Token

是一种标准,一般用来在登录用户和身份信息验证之间进行信息认证。这个token可以用于认证。JWT是基于Json的一个公开规范,它允许我们在用户和服务器之间传递安全可靠的信息

官网:JSON Web Tokens - jwt.io

JWT的使用流程是什么?

JWT的具体使用方式是,服务端根据规范生成一个令牌(token),并发放给客户端。此时,客户端在请求服务端时可以携带这个令牌,以证明自己的身份信息。因此,可以说JWT是Token的一种具体实现形式,它遵循特定的标准和格式。

jwt解决了什么问题?为什么要使用jwt?

传统---Session认证

用户认证通过之后服务端会创建对应的session并存储,会生成一个唯一的session_id并返回给客户端,客户端在浏览器的Cookie中或其他方式(内存,但服务器重启后会丢失;数据库持久化)进行存储。下次再访问的时候携带者session_id,服务端根据session_id就可以验证是谁发送的请求,进行身份验证等等

Session存储了什么?

缺点:Session保存在服务器中,如果是是分布式应用的话Session无法共享(因为每次请求不一定会在哪台机器上),不便于维护

jwt的组成有哪些?

header,头部分。它是一个描述 JWT 元数据的 Json 对象

alg 属性表示签名使用的算法,默认为 HMAC SHA256(写为HS256),typ 属性表示令牌的类型,JWT 令牌统一写为JWT

Payload,也是一个 Json 对象

组成:传递的信息+默认字段信息

iss (issuer):签发人/发行人

sub (subject):主题

aud (audience):用户

exp (expiration time):过期时间

nbf (Not Before):生效时间,在此之前是无效的

iat (Issued At):签发时间

jti (JWT ID):用于标识该 JWT

注意:JSON 对象也使用 Base64 URL 算法转换为字符串后保存,是可以反向反编码回原样的

Signature,签名。

需要指定一个 secret,该 secret 仅仅保存在服务器中,保证不能让其他用户知道。这个部分需要 base64URL 加密后的 header 和 base64URL 加密后的 payload 使用 . 连接组成的字符串,然后通过header 中声明的加密算法 进行加secret组合加密,然后就得出一个签名哈希,也就是Signature,且无法反向解密。

注意:JWT对三个部分都使用的是Base64进行编码,但是Base64是可逆的,所以注意在Payload部分不要携带敏感信息。

比方说我们有上图这样一个token,我们就可以通过JWT官网提供的工具进行解密。解密之后会自动拆分成对应的三部分

但是要注意,签名部分的文本框中要填写你在项目中配置的secret,否则会出现下面这种验证失败的问题:

项目中jwt的使用场景是什么?

用户登录身份验证

项目中如何使用jwt的?

流程图

代码实现

加密

  1. 选择算法:在创建JWT时,选择合适的算法(如HMAC、RSA等)来生成数字签名。
  2. 创建Payload:将要传递的信息(称为Payload)以JSON格式编码,并将其与头部(Header)一起组成JWT的第二部分。
  3. 创建Header:Header包含了描述JWT的元数据和指定所用算法的信息,也以JSON格式编码。
  4. 生成签名:使用所选的算法、密钥和Header与Payload的组合来生成数字签名。
  5. 创建JWT:将Header、Payload和签名组合在一起,用.分隔,形成最终的JWT。

解码

  1. 分割JWT:将JWT按.分割成Header、Payload和签名三部分。
  2. 验证签名:使用相同的算法、密钥和Header与Payload的组合来验证签名的有效性,确保JWT在传输过程中未被篡改。
  3. 解码Payload:将Payload部分进行Base64解码,得到原始的JSON格式数据,包含了传递的信息。
  4. 使用信息:根据Payload中的信息,进行相应的操作,如验证身份、授权等。
如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~
相关推荐
Mr. zhihao6 分钟前
享元模式在 JDK 中的应用解析
java·享元模式
茶馆大橘10 分钟前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
wrx繁星点点10 分钟前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
真的想不出名儿13 分钟前
Java基础——反射
java·开发语言
鱼跃鹰飞15 分钟前
大厂面试真题-简单说说线程池接到新任务之后的操作流程
java·jvm·面试
菜菜-plus23 分钟前
java设计模式之策略模式
java·设计模式·策略模式
努力编程的阿伟32 分钟前
【Java SE语法】抽象类(abstract class)和接口(interface)有什么异同?
java·开发语言
程序员阿龙1 小时前
基于SpringBoot的医疗陪护系统设计与实现(源码+定制+开发)
java·spring boot·后端·医疗陪护管理平台·患者护理服务平台·医疗信息管理系统·患者陪护服务平台
前 方2 小时前
若依入门案例
java·spring boot·maven
funnyZpC2 小时前
quartz集群增强版🎉
java·分布式·开源·集群·定时任务