JWT 简介

JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。

  • 简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快

  • 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库

JWT的主要应用场景

  • 身份认证
    在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录(SSO)中比较广泛的使用了该技术。

  • 信息交换
    在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。

JWT的结构

JWT包含了使用.分隔的三部分:

  • Header 头部

  • Payload 负载

  • Signature 签名

其结构看起来是这样的

xxxxx.yyyyy.zzzzz

Header

在header中通常包含了两部分:token类型和采用的加密算法。

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

接下来对这部分内容使用 Base64Url 编码组成了JWT结构的第一部分。

Payload

Token的第二部分是负载,它包含了claim, Claim是一些实体(通常指的用户)的状态和额外的元数据,有三种类型的claim: reserved, publicprivate.

  • Reserved claims: 这些claim是JWT预先定义的,在JWT中并不会强制使用它们,而是推荐使用,常用的有 iss(签发者), exp(过期时间戳), sub(面向的用户), aud(接收方), iat(签发时间)

  • Public claims:根据需要定义自己的字段,注意应该避免冲突

  • Private claims:这些是自定义的字段,可以用来在双方之间交换信息

负载使用的例子:

{"sub": "1234567890","name": "John Doe", "admin": true } 

上述的负载需要经过Base64Url编码后作为JWT结构的第二部分。

Signature

创建签名需要使用编码后的header和payload以及一个秘钥,使用header中指定签名算法进行签名。例如如果希望使用HMAC SHA256算法,那么签名应该使用下列方式创建:

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

签名用于验证消息的发送者以及消息是没有经过篡改的。

完整的JWT

JWT格式的输出是以.分隔的三段Base64编码,与SAML等基于XML的标准相比,JWT在HTTP和HTML环境中更容易传递。

下列的JWT展示了一个完整的JWT格式,它拼接了之前的Header, Payload以及秘钥签名:

如何使用JWT?

在身份鉴定的实现中,传统方法是在服务端存储一个session,给客户端返回一个cookie,而使用JWT之后,当用户使用它的认证信息登陆系统之后,会返回给用户一个JWT,用户只需要本地保存该token(通常使用local storage,也可以使用cookie)即可。

当用户希望访问一个受保护的路由或者资源的时候,通常应该在Authorization头部使用Bearer模式添加JWT,其内容看起来是下面这样:

Authorization: Bearer <token>

因为用户的状态在服务端的内存中是不存储的,所以这是一种无状态的认证机制。服务端的保护路由将会检查请求头Authorization中的JWT信息,如果合法,则允许用户的行为。由于JWT是自包含的,因此减少了需要查询数据库的需要。

JWT的这些特性使得我们可以完全依赖其无状态的特性提供数据API服务,甚至是创建一个下载流服务。因为JWT并不使用Cookie的,所以你可以使用任何域名提供你的API服务而不需要担心跨域资源共享问题(CORS)。

下面的序列图展示了该过程:

为什么要使用JWT?

相比XML格式,JSON更加简洁,编码之后更小,这使得JWT比SAML更加简洁,更加适合在HTML和HTTP环境中传递。

在安全性方面,SWT只能够使用HMAC算法和共享的对称秘钥进行签名,而JWT和SAML token则可以使用X.509认证的公私秘钥对进行签名。与简单的JSON相比,XML和XML数字签名会引入复杂的安全漏洞。

因为JSON可以直接映射为对象,在大多数编程语言中都提供了JSON解析器,而XML则没有这么自然的文档-对象映射关系,这就使得使用JWT比SAML更方便。

转载于:https://www.cnblogs.com/hanxue112253/p/8542336.html

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

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

相关文章

FFMPEG的详细资料可以在它的官方网站上找到

请看官网的文档栏目: http://ffmpeg.mplayerhq.hu/documentation.html FFmpeg System Documentation Frequently Asked QuestionsFFmpeg program documentationffserver documentationffplay documentationvideo hook documentationsample ffserver configuration fileFFmpeg A…

空指针入栈问题

空指针和数据元素一样能够进栈。并且如果栈原来为空&#xff0c;压入空指针后栈就不会为空了。空指针一旦被赋予指针&#xff0c;如果是在32位机上则占四个字节。只不过是没有指向堆内存中的任何数据。而空指针已经压进栈了&#xff0c;不加以释放就一直存在。

arm linux 中断 分析,armlinux中断异常的处理分析.pdf

基于 ARM Linux 中断、异常的处理分析本文是基于ARM S3C2410X 系统的Linux 2.6 中断、异常和系统调用的处理分析。主要有以下几个部分&#xff1a;1. ARM 的硬件中断机制2. Linux 2.6 对 ARM 中断向量表的初始化3. Linux 2.6 对 ARM 中断、异常的处理(从汇编-->C 语言函数&a…

(数据科学学习手札03)Python与R在随机数生成上的异同

随机数的使用是很多算法的关键步骤&#xff0c;例如蒙特卡洛法、遗传算法中的轮盘赌法的过程&#xff0c;因此对于任意一种语言&#xff0c;掌握其各类型随机数生成的方法至关重要&#xff0c;Python与R在随机数底层生成上都依靠梅森旋转&#xff08;twister&#xff09;来生成…

音视频编解码知识学习详解(分多部分进行详细分析)

1. 常用的基本知识 基本概念 编解码 编解码器&#xff08;codec&#xff09;指的是一个能够对一个信号或者一个数据流进行变换的设备或者程序。这里指的变换既包括将信号或者数据流进行编码&#xff08;通常是为了传输、存储或者加密&#xff09;或者提取得到一个编码流的操作…

二叉树非递归后序遍历算法

与正常的非递归中序遍历算法不同于两点&#xff1a; 一 比正常的中序遍历算法多了对数据元素的标记。 在压数据元素入栈&#xff08;标记记为0&#xff0c;用来表示访问了其左子树&#xff09;时标记&#xff0c; 还有访问完左子树利用gettop&#xff08;&#xff09;获取双亲…

SQL*Plus命令

SQL*Plus命令 前言 一&#xff1a;SQL*Plus 与数据库的交互 二&#xff1a;设置SQL* Plus的运行环境 二 - 1 &#xff1a;SET命令概述 二 - 2 &#xff1a;使用SET命令设置运行环境 二 - 2 ____1&#xff1a;Pagesize 变量 1 SYSorcl> show pagesize2 pages…

redis-day1

1 Redis 概述 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统。redis和大名鼎鼎的Memcached缓存服务软件很像&#xff0c;但是Redis支持的数据存储类型比Memcached更丰富&#xff0c;包括strings&#xff08;字符串&#xff09;、lists&…

C语言数码管是共阴共阳程序,C语言实现共阴极数码管操作

共阴极或者共阳极数码管&#xff0c;因为其需要电流大&#xff0c;而一般51输出电流低&#xff0c;需要锁存器。买的开发板使用的共阴极数码管。至于其构造&#xff0c;找个相关方面的书看看&#xff0c;这里主要是对做好的电路板进行编程。刚开始的时候&#xff0c;感觉在数码…

数据库主要特点

(1)实现数据共享。数据共享包含所有用户可同时存取数据库中的数据&#xff0c;也包括用户可以用各种方式通过接口使用数据库&#xff0c;并提供数据共享。 (2)减少数据的冗余度。同文件系统相比&#xff0c;由于数据库实现了数据共享&#xff0c;从而避免了用户各自建立应用文…

百度与华为全面战略合作 人工智能手机真的要来了

视频加载中...12月21日百度和华为在北京宣布达成全面战略合作。这次合作内容主要包括三点&#xff0c;首先是在语音、语义、视觉和VR上的自然交互&#xff0c;这是百度为华为手机AI赋能的基础层。第二是基于华为HiAI平台和百度PaddlePaddle深度学习框架&#xff0c;共建人工智能…

JavaScript数据类型

一、JavaScript数据类型主要分为原始类型和引用数据类型。 原始类型包括(不可拆分的东西)&#xff1a;Number、String、Boolean、Null、Undefined。引用数据类型包括&#xff1a;Object&#xff08;Array&#xff0c;Date&#xff0c;RegExp&#xff0c;Function&#xff09;ty…

funcode拼图游戏c语言程序,同求funcode平台下拼图游戏的C语言代码

做了好几天&#xff0c;写了好多回就是不对&#xff0c;彻底崩溃。。#include "CommonAPI.h"//#include "LessonX.h"#include#define BLOCK_COUNT 4int g_iGameState;intg_iBlockState[BLOCK_COUNT][BLOCK_COUNT];charg_szBlockName[BLOCK_COUNT*BLOCK_COU…

什么是透明传输

透明传输是指不管所传数据是什么样的比特组合&#xff0c;都应当能够在链路上传送。当所传数据中的比特组合恰巧与某一个控制信息完全一样时&#xff0c;就必须采取适当的措施&#xff0c;使收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。…

Android 秒级编译FreeLine

项目地址&#xff1a;FreeLine FreeLine官网: FreeLine 1. 安装FreeLine插件 File->Settings->Plugins, 搜索输入FreeLine Plugin, 查找到后进行安装并重启Android Studio。 图1.png安装好之后&#xff0c;在工具栏就会出一个图标 图2.png2. 配置gradle 根目录build.gr…

JS实现大整数乘法(性能优化、正负整数)

本方法的思路为&#xff1a; 一&#xff1a;检查了输入的合法性&#xff08;非空&#xff0c;无非法字符&#xff09; 二&#xff1a;检查输入是否可以进行简单计算&#xff08;一个数为 0&#xff0c;1&#xff0c;1&#xff0c;-1&#xff09; 三&#xff1a;去掉输入最前面可…

c语言中- gt he,C语言中deta,fabs,lt;stdlib.hgt;,lt;stdio.hgt;分别是什么意思

fabs 编辑本段C语言数学函数:fabs 函数简介  原型&#xff1a;在TC中原型是extern float fabs(float x);&#xff0c;在VC6.0中原型是double fabs( double x );。   用法&#xff1a;#include   功能&#xff1a;求浮点数x的绝对值   说明&#xff1a;计算|x|, 当x不为…

物理层

目的&#xff1a; 物理层要尽可能地屏蔽掉物理设备和传输媒体&#xff0c;通信手段的不同&#xff0c;使数据链路层感觉不到这些差异&#xff0c;只考虑完成本层的协议和服务。 给其服务用户&#xff08;数据链路层&#xff09;在一条物理的传输媒体上传送和接收比特流…

C语言中的二级指针(双指针)

二级指针又叫双指针。C语言中不存在引用&#xff0c;所以当你试图改变一个指针的值的时候必须使用二级指针。C中可以使用引用类型来实现。 下面讲解C中的二级指针的使用方法。 例如我们使用指针来交换两个整型变量的值。 错误代码如下&#xff1a; 一级指针 [cpp] view pla…

测试环境服务器硬盘塞满问题排查

项目中出现的问题 某天下午测试环境服务器出现tab无法补全命令&#xff0c;给出的提示大概意思就是说,无可用空间无法创建临时文件&#xff0c;不过这次跟上次出现的问题比较像&#xff0c;上次服务器出现的问题&#xff0c;因此楼主判断可能是服务器数据盘被占满&#xff0c;果…