【JWT的原理和使用】
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。
文章目录
- 一、跨域认证的问题
- 二、JWT 的原理
- 三、JWT 的数据结构
- 3.1 Header
- 3.2 Payload
- 3.3 Signature
- 3.4 Base64URL
- 四、JWT 的使用方式
- 五、JWT 的几个特点
一、跨域认证的问题
互联网服务离不开用户认证。一般流程是下面这样。
1、用户向服务器发送用户名和密码。
2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
3、服务器向用户返回一个 session_id,写入用户的 Cookie。
4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。
举例来说,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?
一种解决方案是 session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。
另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。
二、JWT 的原理
JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。
{"姓名": "张三","角色": "管理员","到期时间": "2018年7月1日0点0分"
}
以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。
服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。
三、JWT 的数据结构
实际的 JWT 大概就像下面这样。
它是一个很长的字符串,中间用点(.
)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。
JWT 的三个部分依次如下。
- Header(头部)
- Payload(负载)
- Signature(签名)
写成一行,就是下面的样子。
Header.Payload.Signature
下面依次介绍这三个部分。
3.1 Header
Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。
{"alg": "HS256","typ": "JWT"
}
上面代码中,alg
属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ
属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT
。
最后,将上面的 JSON 对象使用 Base64URL 算法(详见后文)转成字符串。
3.2 Payload
Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。
{"sub": "1234567890","name": "John Doe","admin": true
}
注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
这个 JSON 对象也要使用 Base64URL 算法转成字符串。
3.3 Signature
Signature 部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.
)分隔,就可以返回给用户。
3.4 Base64URL
前面提到,Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。
JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+
、/
和=
,在 URL 里面有特殊含义,所以要被替换掉:=
被省略、+
替换成-
,/
替换成_
。这就是 Base64URL 算法。
四、JWT 的使用方式
客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization
字段里面。
Authorization: Bearer <token>
另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
五、JWT 的几个特点
(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
相关文章:
【JWT的原理和使用】
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。 文章目录 一、跨域认证的问题二、JWT 的原理三、JWT 的数据结构3.1 Header3.2 Payload3.3 Signature3.4 Base64URL 四、JWT 的使用方式五、JWT 的几个特点…...
对本地存储的有效期的理解
本地存储是一种在Web开发中常用的客户端存储数据的方式,它可以让网页应用程序在用户的浏览器中存储和检索数据,而无需依赖服务器来保存信息。本地存储的有效期是指数据存储在用户的设备上可以被访问和保留的时间段。在本地存储中,有两种主要的…...
蓝桥杯-02-蓝桥杯Java组考点与14届真题
文章目录 蓝桥杯Java组考点与14届真题参考资源Java组考点1. 组别2. 竞赛赛程3. 竞赛形式4. 参赛选手机器环境5. 试题形式5.1. 结果填空题5.2. 编程大题 6. 试题考查范围7. 答案提交8. 评分9. 样题样题 1:矩形切割(结果填空题)样题 2ÿ…...
门户网站二级等保评测问题,服务器漏洞问题解决办法
二级等保查出来的服务器问题 操作前可在自己服务器测试一下,看看有没有用 1.服务器定时更换密码 永久(需重启) vim /etc/login.defs PASS_MAX_DAYS 90 # 密码最长过期天数 PASS_MIN_DAYS 0 # 密码最小过期天数 PASS_MIN_LEN 10 # 密码…...
NPDP考前注意事项,这些细节你可要注意!
产品经理国际资格产认证(NPDP)2023年考试将于2023年12月2日(本周六)进行,你准备好了吗? 考试详情 考试时间:2023年12月2日 上午9:00-12:30 考试题型:200题,单选题。 考…...

八个优秀开源内网穿透工具
内网穿透(NAT穿透)是一种将本地网络服务暴露给互联网的一种技术。这种技术可以很好地解决许多局域网内的资源共享。采用路由的方式将一台计算机变成一个“路由器”,将公共的网络地址转为内部网络地址,从而实现通过英特网可以访问局…...

C语言贪吃蛇(有详细注释)
这个贪吃蛇是在比特特训营里学到的,同时我还写了用EasyX图形库实现的图形化贪吃蛇,含有每个函数的实现以及游戏中各种细节的讲解,感兴趣的可以去看一看。 贪吃蛇小游戏 实现效果 以下就是源码,感兴趣的小伙伴可以cv自己玩一玩改…...

MUI框架从新手入门【webapp开发教程】
文章目录 MUI -最接近原生APP体验的高性能前端框架APP开发3.25 开发记录miu框架介绍头部/搜索框:身体>轮播图轮播图设置数据自动跳转:九宫格图片九宫格图文列表底部选项卡按钮选择器手机模拟器 心得与总结:MUI框架在移动应用开发中的应用M…...

HNU-计算机网络-讨论课2
第二次 有关网络智能、安全以及未来网络的讨论 一、必选问题(每组自由选择N个,保证组内每人负责1个) 网络的发展促进信息的传播,极大提高了人类的感知能力,整个世界都被纳入人类的感知范围。但人们对信息系统以及数据…...
西南科技大学信号与系统A实验一(信号的产生与时域运算)
目录 一、实验目的 二、实验原理 三、实验内容 四、思考题 一、实验目的 1、 掌握用matlab软件产生基本信号的方法。 2、 应用matlab软件实现信号的加、减、乘、反褶、移位、尺度变换及卷积运算 二、实验原理 (一) 产生信号波形的方法 利用Matlab软件的信号处…...
代码随想录二刷 |字符串 |翻转字符串里的单词
代码随想录二刷 |字符串 |翻转字符串里的单词 题目描述解题思路 & 代码实现移除多个空格将整个字符串翻转将每个单词翻转 题目描述 151.翻转字符串里的单词 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成…...

低调使用。推荐一个 GPT4 Turbo、Vision、GPTs、DELL·E3 等所有最新功能同步可用国内网站
在 11 月 6 日,万众期待的 OpenAI DevDay,ChatGPT 发布了一系列新的产品,其中推出了 GPT4 Turbo,并且将GPT4 Vision,DELLE3 等等能力全部集合到一起,不需要再分开使用,原来的局限的文本聊天也进…...

基于视觉传感器的自主扫雷机器人设计与实现
摘要: 在当今的世界安全形势下,扫雷小车的出现可以减少各国人员在扫雷过程中的人员伤亡,扫雷小车实用性能强更适合在军事化领域或者是民用领域上应用。让它具有光明的发展前景。针对这一情况,本毕业设计就对自主扫雷小车进行研究…...

计算机新建盘符和重新分配盘符的大小
一、新建盘符 有些电脑刚买来时候,只有一个C盘分区,此时最好增加几个分区方便使用。 注意:分区操作要慎重,不要轻易去试。这里只针对购买的电脑厂家未做分区,只有一个C盘的情况。 如果自己电脑的分区本身已经满足你…...

windows 查看mysql的错误日志
查找错误日志文件存储路径 用到的软件:everything 官网 voidtools 下载路径 https://www.voidtools.com/Everything-1.4.1.1024.x64-Setup.exe 直接点击下载即可 运行效果如下 我们知道mysql有个配置文件是my.ini,里面配置了相关信息 我们需要先…...
java多线程CountDownLatch简单测试
学习java多线程,请同时参阅 Java多线程 信号量和屏障实现控制并发线程数量,主线程等待所有线程执行完毕1 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后再继续执行。当所有的线程都已经完成任务,然后在CountDownLatch上…...
npm,yarn,pnpm 清理缓存
目录 1,为什么要清理缓存1,缓存文件太多,影响系统运行2,不同源会有区别 2,命令2.1,npm2.2,yarn2.3,pnpm 1,为什么要清理缓存 1,缓存文件太多,影响…...

【数据结构】二叉排序树(c风格、结合c++引用)
目录 1 基本概念 结构体定义 各种接口 2 二叉排序树的构建和中序遍历 递归版单次插入 非递归版单次插入 3 二叉排序树的查找 非递归版本 递归版本 4 二叉排序树的删除(难点) 1 基本概念 普通二叉排序树是一种简单的数据结构,节点的值…...

SpringCloudSleuth+Zipkin 整合及关键包汇总
背景 整合了一下 SpringCloudSleuth Zipkin,本来是很简单的东西,但是最终导出依赖包时没注意,导致目标服务始终没有被纳入 Zipkin 的链路追踪中,本文记录这个过程及关键依赖包。 部署zipkin 官网下载最新的 zipkin 可执行包&a…...
腾讯面试笔试题2023.11.30
给定一个由整数组成的非空数组所表示的非负整数如[1,2,3],在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。 (要求只能操作数组,不…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...