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中的信息,进行相应的操作,如验证身份、授权等。
如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~
相关推荐
极客先躯14 分钟前
中级java每日一道面试题-2024年7月3日
java·开发语言·java每日一道面试题
AskHarries30 分钟前
Spring Boot集成geode快速入门Demo
java·spring boot·后端·geode
小哇66643 分钟前
SpringBoot整合Minio
java·spring boot·spring
Tech Synapse1 小时前
Java循环创建对象内存溢出怎么解决
java·开发语言·jvm
IT·陈寒1 小时前
Kotlin vs Java:深入解析两者之间的最新差异与优劣(全面指南)
java·python·kotlin
行动π技术博客1 小时前
spring中IOC相关介绍
java·spring·rpc
吃青椒的小新1 小时前
独一无二的设计模式——单例模式(Java实现)
java·后端·单例模式·设计模式
天才梦浪1 小时前
开源租房项目
java·项目
杰哥在此2 小时前
Java面试题:解释跨站脚本攻击(XSS)的原理,并讨论如何防范
java·开发语言·面试·编程·xss
Czi橙2 小时前
玩玩快速冥(LeetCode50题与70题以及联系斐波那契)
java·算法·快速幂·斐波那契