JWT原理解析

devtools/2024/11/15 0:37:52/

一、概述

虽然现在很多的开发框架会支持JWT的使用,但是对JWT还是没有一个详细的了解,有很多疑惑:

  • JWT比之前的session或者token有什么好处?
  • JWT的构成元素是什么?
  • JWT从生成到使用的详细流程?

JWT_6">二、 JWT

JWT_7">2.1 JWT是什么?

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

JWT_10">2.2 在什么场景使用JWT

  • 授权

    授权是我们使用JWT最常见的场景;用户登录后,后端服务根据JWT规则生成token给到前端,前端之后的请求都会携带这个token访问后端接口,后端对这些请求校验token,保障token的有效性,进而确保是合法请求;JWT非常契合单点登录,因为JWT的后端认证不需要额外访问存储信息,只需要一个秘钥就可以自认证;

  • 交换信息

    由于JWT生成的token可以包含业务信息,而且这些业务信息是参与了签名的,所以保障了这些业务信息不被篡改,而且还有有效时间范围;

JWT_19">2.3 JWT生成规则

在这里插入图片描述
JWT整体的组成形式类似为: xxxx.yyyy.zzzz

JWT 本质上就是一组字串,通过(.)切分成三个为 Base64 编码的部分:

  • Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型;
    示例:

    {"typ":"JWT","alg":"HS256"}
    
  • Payload : 用来存放实际需要传递的数据;
    示例:

    {"sub":"123456","exp":1713939930564,"userid":"28912"}
    

    注意:由于Payload是明文传输和前端存储,所以不能存放隐私性信息

  • Signature(签名):服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。
    示例:

    HMACSHA256(base64UrlEncode({"typ":"JWT","alg":"HS256"}) + "." +base64UrlEncode({"sub":"123456","exp":1713939930564,"userid":"28912"}),"123456789qwer")
    

最终得出的token示例:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJzdWIiOiIxMjM0NTYiLCJleHAiOjE3MTM5Mzg4NTkzNDIsInVzZXJpZCI6IjI4OTEyIn0.
qFxI_m6XOYMdASi9nXpaOtr3p2SQCy8OOIktWhJBnCQ

至于其中的算法,可以按照JWT的严格算法来实现,也可以按照自己的算法来实现,只需要保证生成token验证token时的算法一致即可;

JWTsessionredistoken_53">2.4 JWT、session、redis存储的token对比

JWTredis存储的token本地session
服务端是否需要存储用户认证成功的信息不需要需要需要
认证成功的用户信息存储在哪客户端redis本地
生成的token是否可以跨域使用可以可以不可以

上述表格对比了JWT redis存储的token 本地session 三者的一些特性;

  • JWT由于包含了认证的用户信息,那么就不需要后端服务再额外保存这些认证信息,所以节省了后端的资源;

  • JWT由于自包含认证信息,所以可以不依赖后端服务,可以在不同的后端服务之间认证使用;所以非常契合单点登录的实现;

  • JWT默认使用请求头Authorization向后端传输,当然你也可以使用其他请求头,只需要前后端一致即可;

    Authorization: Bearer {JWTtoken}

  • JWT由于摆脱了传统的cookie传输,所以跨资源(CORS)不会成为问题,有助于防止CSRF攻击;

JWT_72">2.5 JWT认证流程

在这里插入图片描述

上图是JWT在单点登录的认证流程过程;

如果后端是微服务架构,那么 验证JWT是否合法 这个功能可以集成到API网关层,统一处理即可;


http://www.ppmy.cn/devtools/12567.html

相关文章

三款 AI 工具,带你开启智能新时代!

云雀大模型 简介 字节跳动以云雀大模型为基础,研发出了一款生成式 AI 助手,其名为“豆包”。用户与豆包展开对话,便能够自动生成歌词、小说、文案等各类文本内容。而且,每一段回答不光有文字形式,还会由数字人豆包给出…

蓝桥杯2024年第十五届省赛真题-拔河

审题可能会遇到的问题&#xff1a;认为所有人都必须参与拔河&#xff0c;但其实不用&#xff0c;只要符合l1<r1<l2<r2就行&#xff0c;不一定要全部人上场&#xff0c;比如只上场a1和a2他们的力量差是1其实也可以。 正解思路&#xff1a;前缀和枚举二分。枚举左区间&…

【介绍下WebStorm开发插件】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

JVM垃圾收集器--分区收集器

G1收集器 G1&#xff08;Garbage-First Garbage Collector&#xff09;在 JDK 1.7 时引入&#xff0c;在 JDK 9 时取代 CMS 成为了默认的垃圾收集器。G1 有五个属性&#xff1a;分代、增量、并行、标记整理、STW。 分代 G1收集器 将内部分为多个大小相等的区域&#xff0c;另…

怎样把rk3399的图片截取发送到电脑端?

要实现截完图后立即执行拷贝到D盘的功能&#xff0c;您需要将截图命令和拷贝命令组合在一起&#xff0c;使用管道&#xff08;|&#xff09;或分号&#xff08;;&#xff09;来连接这两个命令。然而&#xff0c;由于adb pull命令本身并不支持管道操作&#xff0c;且Android设备…

981: 统计利用二叉树存储的森林中树的棵数

解法&#xff1a; 在数据结构中&#xff0c;森林&#xff08;Forest&#xff09;是一组互不相交的树的集合&#xff0c;而二叉树&#xff08;Binary Tree&#xff09;是每个节点最多只有两个子节点的树。下面介绍如何在森林和二叉树之间进行转换。 森林转换为二叉树&#xff1…

富格林:深究受害原因安全规避

富格林指出&#xff0c;现货黄金作为一种广受好评的投资项目&#xff0c;虽说风险比较低&#xff0c;但终究还是会因为不明受害情况而无法安全规避。所以在进行现货黄金中一定要注意深究错误受害交易操作&#xff0c;尽量安全避开这些操作误区。接下来&#xff0c;与富格林一起…

关于Java的三个小题目(很容易错!)

第一题 char运算后的数据类型 最后输出的是什么类型&#xff1f; 答案&#xff1a;int char与byte的联系和区别 char是无符号型的&#xff0c;能够表示一个整数&#xff0c;不能表示负数&#xff08;0~65535&#xff09;&#xff1b;而byte是有符号型的&#xff0c;能够表示…