JWT的初步说明

news/2025/2/24 14:57:52

JWT

概念

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

数据结构

在这里插入图片描述

  • 标头(Header)

    • {
      “alg”:“HS256”,
      “typ”:“JWT”
      }
  • 有效载荷(Payload)
    JWT 第二部分是 Payload,也是一个 Json 对象,除了包含需要传递的数据,还有七个默认的字段供选择。

    iss (issuer):签发人/发行人
    sub (subject):主题
    aud (audience):用户
    exp (expiration time):过期时间
    nbf (Not Before):生效时间,在此之前是无效的
    iat (Issued At):签发时间
    jti (JWT ID):用于标识该 JWT
    如果自定义字段,可以这样定义:

{
    //默认字段
    "sub":"主题123",
    //自定义字段
    "name":"java技术爱好者",
    "isAdmin":"true",
    "loginTime":"2021-12-05 12:00:03"
}
  • 签名(Signature)
    JWT 第三部分是签名。是这样生成的,首先需要指定一个 secret,该 secret [秘钥]仅仅保存在服务器中,保证不能让其他用户知道。这个部分需要 base64URL 加密后的 header 和 base64URL 加密后的 payload 使用 . 连接组成的字符串,然后通过header 中声明的加密算法 进行加盐secret组合加密,然后就得出一个签名哈希,也就是Signature,且无法反向解密;
  • 形式:xxxx.yyyy.zzzz Header.Payload.Signature

缺陷

jwt不能很好的保存用
服务器不会保存会话状态,强制用户下线的话;
不能传递敏感信息;
头部核载和签名
安全性没法保证,所以 jwt 里不能存储敏感数据。因为 jwt 的 payload 并没有加密,只是用 Base64 编码而已。
无法中途废弃。因为一旦签发了一个 jwt,在到期之前始终都是有效的,如果用户信息发生更新了,只能等旧的 jwt 过期后重新签发新的 jwt。
续签问题。当签发的 jwt 保存在客户端,客户端一直在操作页面,按道理应该一直为客户端续长有效时间,否则当 jwt有效期到了就会导致用户需要重新登录。那么怎么为 jwt 续签呢?最简单粗暴就是每次签发新的 jwt,但是由于过于暴力,会影响性能。如果要优雅一点,又要引入 Redis 解决,但是这又把无状态的 jw t硬生生变成了有状态的,违背了初衷。

JWT的优点

json格式的通用性,所以JWT可以跨语言支持,比如Java、JavaScript、PHP、Node等等。
可以利用Payload存储一些非敏感的信息。
便于传输,JWT结构简单,字节占用小。
不需要在服务端保存会话信息,易于应用的扩展。


http://www.niftyadmin.cn/n/4924663.html

相关文章

MySQL和钉钉单据接口对接

MySQL和钉钉单据接口对接 数据源系统:钉钉 钉钉(DingTalk)是阿里巴巴集团打造的企业级智能移动办公平台,是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工牌…

[LeetCode - Python]744.寻找比目标字母大的最小字母(Easy)

题目: 744.寻找比目标字母大的最小字母(Easy) 代码: 一开始用纯左闭右开二分,忽略两种情况: 1.遗漏均不满足,返回Leeters[0],已提前加判断; 2.由于左闭右开适用于判断…

一、 Mysql索引

一、 Mysql索引 001 Mysql如何实现的索引机制? MySQL中索引分三类:B树索引、Hash索引、全文索引 002 InnoDB索引与MyISAM索引实现的区别是什么? MyISAM的索引方式都是非聚簇的,与InnoDB包含1个聚簇索引是不同的。 在InnoDB存储引…

接龙序列(14届)

对于一个长度为 K 的整数数列:A1,A2,...,AK,我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1的末位数字 (2≤i≤K2≤i≤K)。 例如 12,23,35,56,61,11 是接龙数列;12,23,34,56 不是接龙数列,因为 56 的首位数字不等于 34…

网络安全 Day27-运维安全项目-堡垒机部署

运维安全项目-堡垒机部署 1. 运维安全项目-架构概述2. 运维安全项目之堡垒机2.1 堡垒机概述2.2 堡垒机选型2.3 环境准备2.4 部署Teleport堡垒机2.4.1 下载与部署2.4.2 启动2.4.3 浏览器访问teleport2.4.4 进行配置2.4.5 安装teleport客户端 2.5 teleport连接服务器 1. 运维安全…

spring AOP两种动态代理

本文开始 1.什么是动态代理? 动态代理:本来是通过直接访问目标对象的,但是找个代理对象替你进行访问目标对象,这就是动态代理过程; 例如:买饭作为目标对象,自己不想亲自跑腿,就点个…

2208. 将数组和减半的最少操作次数

2208. 将数组和减半的最少操作次数 给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作) 请你返回将 nums 数组和 至少 减少一…

软件测试工程师面试如何描述自动化测试是怎么实现的?

软件测试工程师面试的时候,但凡简历中有透露一点点自己会自动化测试的技能点的描述,都会被面试官问,那你结合你的测试项目说说自动化测试是怎么实现的?一到这里,很多网友,包括我的学生,也都一脸…