JWT 基础知识

news2024/11/24 12:21:23

目录

什么是JWT

JWT 的原理

JWT 的数据结构

Header

Payload

Signature

参考链接


什么是JWT

Json Web Token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519。

该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景,是目前最流行的跨域认证解决方案。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

JWT 的原理

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。

{
  "姓名": "张三",
  "角色": "管理员",
  "到期时间": "2018年7月1日0点0分"
}

以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

JWT 的数据结构

实际当中 JWT 长这个样子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkNURkh1YiIsImlhdCI6MTUxNjIzOTAyMn0.Y2PuC-D6SfCRpsPN19_1Sb4WPJNkJr7lhG6YzA8-9OQ

它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的

JWT 的三个部分依次如下:

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

写成一行,就是下面的样子。

Header.Payload.Signature

每个部分最后都会使用 base64URLEncode方式进行编码

#!/usr/bin/env python
function base64url_encode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
} 

Header

Header 部分是一个 JSON 对象,描述 JWT 的元数据,以上面的例子,使用 base64decode 之后:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
{
  "alg": "HS256",
  "typ": "JWT"
}

header部分最常用的两个字段是alg和typ。

alg属性表示token签名的算法(algorithm),最常用的为HMAC和RSA算法

typ属性表示这个token的类型(type),JWT 令牌统一写为JWT。

Payload

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

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

除了官方字段,还可以在这个部分定义私有字段,以上面的例子为例,将 payload 部分解 base64 之后:

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkNURkh1YiIsImlhdCI6MTUxNjIzOTAyMn0
{
  "sub": "1234567890",
  "name": "CTFHub",
  "iat": 1516239022
}

注意:JWT 默认是不会对 Payload 加密的,也就意味着任何人都可以读到这部分JSON的内容,所以不要将私密的信息放在这个部分

Signature

Signature 部分是对前两部分的签名,防止数据篡改

首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

参考链接

  • JSON Web Token Introduction - jwt.io
  • https://en.wikipedia.org/wiki/JSON_Web_Token
  • JSON Web Token 入门教程 - 阮一峰的网络日志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gsap动画库入门

目录 前言 一、基本用法 (一) 安装 (二) 语法 (三) 简单动画 二、配置 (一) 动画方法 1. to 2. from 3. fromTo 4. set (二) 动画目标 (三) 动画属性 前言 官网:https://gsap.com/ 中文文档:GSAP 中文教程 中文文档 |官方文档 …

JAVA基础知识总结(上)(初识Java)

JDK的下载与环境变量的配置 JDK的下载 首先在官网找到JDK,然后根据电脑配置选择x64或者x32,然后一直next就可以了,不过重要的一点是记住存放的路径,因为后续环境配置需要复制这个路径。 为什么要配置环境变量 第一:JAVA_HOME环…

Vue | Vue 中的 refInForde 用法

refInFor:如果你在渲染函数中给多个元素都应用了相同的 ref 名,那么 $refs.myRef 会变成一个数组。 vue中的refInFor属性是Vue框架中用于在循环渲染的元素上设置引用的一种方式。‌ 在Vue中,‌ref属性通常用于给元素或子组件注册引用信息&am…

vue打包设置 自定义的NODE_ENV

默认NODE_ENV 自定义process.env.NODE_ENV的值_process.node.env的值-CSDN博客 ‌NODE_ENV开发环境下:NODE_ENVdevelopment(默认) 生产环境下:NODE_ENVproduction(默认) NODE_ENV 除了默认的 development 和 production 以外,确实可以自定义…

一款轻量级的Docker日志查看器!!【送源码】

今天给大家分享一款Docker日志查看神器。 背景 作为一名攻城狮,相信大家对Docker并不陌生,特别是现在盛行微服务时代,容器应用技术可谓是满天飞,Docker的好处和便捷就不多说了。 如今管你项目多大,先来个容器部署&a…

在Kubernetes中通过 pod 打开 pod所在宿主机上的shell

昨日一伙计突然问我 在么把自己打好的 docker镜像 上传到 kubernetes 的 节点的 local 镜像池。 现状大约如下: 1)只有master节点的登录权限; 2)不知道存在哪些worker节点也无法通过 master 借助SSH 登录到 worker节点 &#x…

算法的学习笔记—二叉搜索树的后序遍历序列(牛客JZ33)

😀前言 在数据结构与算法的学习中,二叉搜索树(BST)是一个重要的概念,而后序遍历则是树的遍历方式之一。今天,我们将深入探讨一个经典问题:如何判断一个给定的整数数组是否是某个二叉搜索树的后序…

水利详细数据

有网友问水利数据的情况,前两天忙,没回应!现在我将号内数据总结了一下,发给大家看看!可以获取数据不限于以下,其它数据也可以根据需要转出和制作! 数据详细情况: 下面是关于水系方面的数据效果…

黑神话·悟空爆火,有哪些AI技术在助力?

北京时间8月20日上午10点,沉淀了4年的首款国产“3A”游戏《黑神话悟空》正式在各大游戏交易平台上线,迄今为止售出预计450万份。 昨天,各大社媒平台的热搜榜前列几乎都被「黑神话」相关词条霸占,并久居不下,大众的社交…

linux容器基础-namespace-2(net)

net namespace network namespace用来隔离网络环境,在network namespace中,网络设备、端口、套接字、网络协议栈、路由表、防火墙规则等都是独立的。 因为network namespace中具有独立的网络协议栈,因此每个network namespace中都有一个lo接…

向量数据库中的PQ(Procduct Quantization)

为了加快向量之间距离计算和比较速度,有人发明的Product Quantization方法,这个方法并不是一种索引,所以它并不能减少目标向量(要查找的向量),与数据库中向量的比较次数,但是它可以加快与每个数…

黑神话孙悟空:自媒体小白的流量密码!

当下,黑神话孙悟空的热度如熊熊烈火,席卷了整个游戏世界。 只要与这个话题沾边,似乎就能轻松吸引大量关注。 那么,对于不怎么懂自媒体运营的小伙伴来说,该如何抓住这个机遇呢? 别担心,我们用以…

IO进程线程8月22日

1&#xff0c;思维导图 2&#xff0c;使用read和write实现文件拷贝 #include<myhead.h> int main(int argc, const char *argv[]) {int fp1,fp2;char a[1];fp1open("./1.txt",O_RDONLY);fp2open("./2.txt",O_CREAT|O_TRUNC|O_WRONLY,0664);if(fp1-…

简过网:博士考公务员有什么优势?还需要笔试吗?

博士生考公务员需要面试吗&#xff1f;这要看具体情况&#xff0c;一般来讲&#xff0c;公务员考试分为国考、省考和单招&#xff01; 很多公务员单招的一般可以免笔试&#xff0c;但是需要面试&#xff0c;但是对于国考和省考和统考来讲&#xff0c;博士是不能免笔试的&#…

hive4.0.0部署以及与MySQL8.4连接

在开始之前&#xff0c;需要在主机上准备好MySQL数据库&#xff0c;并且已经完成了hdfs和yarn的部署 步骤1&#xff1a;MySQL的配置 以root用户登录mysql后执行以下命令&#xff1a; grant all privileges on *.* to root% with grant option; flush privileges; 这样我们就…

解码极氪汽车的短期成效与长期定力

近日&#xff0c;极氪汽车&#xff08;NYSE&#xff1a;ZK&#xff0c;下同“极氪”&#xff09;公布了截止2024年第二季度的业绩公告。 不难发现&#xff0c;极氪汽车实现了交付数量与经营业绩的双螺旋增长&#xff0c;稳居新能源自主品牌第一梯队。不仅如此&#xff0c;极氪…

JavaEE从入门到起飞(九) ~Activiti 工作流

工作流 当一道流程逻辑需要用到多个表单的提交和多个角色的审核共同完成的时候&#xff0c;就可以使用工作流。 工作流一般使用的是第三方技术&#xff0c;也就是说别人帮你创建数据库表和service层、mapper层&#xff0c;你只需要注入工具接口即可使用。 原理&#xff1a;一…

深度优先搜索-放苹果

放苹果 http://noi.openjudge.cn/ch0205/666/ #include<bits/stdc.h> using namespace std;int dfs(int,int); //第一个赋值为1 其余为0 int a[11]{1},ans,n,m;int main(){ int k; cin>>k; for(int i1;i<k;i){ ans0; cin>>m>>n; dfs(m,1);//m个…

滴答拍摄影项目

TOC springboot0796滴答拍摄影项目 第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对拍摄影方面的要求也在不断提高&#xff0c;旅游的人数更是不断增加&#xff0c;使得拍摄影项…

FPGA开发——IIC协议介绍

简介 其实关于IIC通信协议的相关原理的相关理论我在最开始的文章当中进行过讲解&#xff0c;但是没有详细的去进行过说明&#xff0c;在今天的这篇文章中我们就来详细说明一下IIC协议的相关理论。 一、IIC 总线组成 1、定义介绍 采用串行总线可以简化系统硬件结构、减小系统…