当前位置: 首页 > news >正文

JWT详解解读读

📑前言

本文主要是jwt解读文章,如果有什么需要改进的地方还请大佬指出⛺️

🎬作者简介:大家好,我是青衿🥇
☁️博客首页:CSDN主页放风讲故事
🌄每日一句:努力一点,优秀一点

在这里插入图片描述

目录

文章目录

  • 📑前言
  • **目录**
    • 1、什么是jwt及其用法?
    • 2. JWT 的数据结构
      • 2.1 Header
      • 2.2 Payload(负载)
      • 2.3 Signature(签名)
    • 3.基于Token的身份认证与基于服务器的身份认证
    • 4.实际开发中的应用
  • 📑文章末尾


1、什么是jwt及其用法?

什么是JWT?JWT,全称Json Web Token,是一种基于json的开发标准,是token的一种具体实现方式。本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。

JWT官网有一张图描述了JWT的认证过程:

在这里插入图片描述

2. JWT 的数据结构

JWT 的三个组成部分依次如下
· Header(头部)
· Payload(负载)
· Signature(签名)

2.1 Header

Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。
在这里插入图片描述

头部:表明是一个jwt类型的token,采取的加密方式是HS256

2.2 Payload(负载)

Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

2.3 Signature(签名)

签名哈希部分是对上面两部分数据签名,需要使用base64编码后的header和payload数据,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用header中指定的签名算法(默认情况下为HMACSHA256)根据以下公式生成签名

在这里插入图片描述

H M A C S H A 256 ( b a s e 64 U r l E n c o d e ( h e a d e r ) + " . " + b a s e 64 U r l E n c o d e ( p a y l o a d ) , s e c r e t ) HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)

在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用.分隔,就构成整个JWT对象

3.基于Token的身份认证与基于服务器的身份认证

在讨论基于Token的身份认证是如何工作的以及它的好处之前,我们先来看一下以前我们是怎么做的:
HTTP协议是无状态的,也就是说,如果我们已经认证了一个用户,那么他下一次请求的时候,服务器不知道我是谁,我们必须再次认证
传统的做法是将已经认证过的用户信息存储在服务器上,比如Session。用户下次请求的时候带着SessionID,然后服务器以此检查用户是否认证过。
使用 JWT 的优势:
你不需要向传统的 Web 应用那样将用户状态保存于 Session 中。

4.实际开发中的应用

在实际的SpringBoot项目中,一般我们可以用如下流程做登录:
1.在登录验证通过后,给用户生成一个对应的随机token(注意这个token不是指jwt,可以用uuid等算法生成),然后将这个token作为key的一部分,用户信息作为value存入Redis,并设置过期时间,这个过期时间就是登录失效的时间
2.将第1步中生成的随机token作为JWT的payload生成JWT字符串返回给前端
3.前端之后每次请求都在请求头中的Authorization字段中携带JWT字符串
4.后端定义一个拦截器,每次收到前端请求时,都先从请求头中的Authorization字段中取出JWT字符串并进行验证,验证通过后解析出payload中的随机token,然后再用这个随机token得到key,从Redis中获取用户信息,如果能获取到就说明用户已经登录

📑文章末尾

在这里插入图片描述

http://www.lryc.cn/news/211551.html

相关文章:

  • 一文详解如何从 Oracle 迁移数据到 DolphinDB
  • 负载均衡--Haproxy
  • 股票价格预测 | 融合CNN和Transformer以提升股票趋势预测准确度
  • QMI8658A_QMC5883L(9轴)-EVB 评估板
  • vue2+antd——实现动态菜单路由功能——基础积累
  • 代码随想录算法训练营第三十八天丨 动态规划part01
  • 关于集合遇到的坑
  • 需要下微信视频号视频的小伙伴们看过来~
  • 测试工具:hurl
  • RateLimiter限流
  • PMP适合哪些人去考?
  • 钡铼技术 工控机中的X86和ARM处理器:哪个更具可扩展性?
  • 软考 系统架构设计师系列知识点之软件构件(3)
  • 中科驭数亮相2023中国移动全球合作伙伴大会
  • WebGIS国产化(信创)研发流程一:数据库的调研与介绍
  • [Shell] ${} 的多种用法
  • 基于SpringBoot的社区医院管理系统设计与实现
  • Spring的执行流程与Bean的生命周期
  • 使用 SQL 的方式查询消息队列数据以及踩坑指南
  • 拿下国家级信创认证 中科驭数KPU SWIFT-2200N成为国内首款满足金融业严苛要求的DPU产品
  • centos怎么禁用和关闭selinux
  • 【LeetCode刷题日志】88.合并两个有序数组
  • 计算机考研 | 2013年 | 计算机组成原理真题
  • [Unity][VR]透视开发系列4-解决只看得到Passthrough但看不到Unity对象的问题
  • 电气工程 自动化 机械工科学生来看看
  • NewStarCTF2023week4-midsql(利用二分查找实现时间盲注攻击)
  • null,undefined的区别?
  • 2.flink编码第一步(maven工程创建)
  • Unit1_1:分治问题之时间复杂度求解
  • React hooks的闭包陷阱