JWT简明介绍
JSON Web Token一种数据格式,用来表示Token。具有可扩展、防篡改、能够在URL中安全传输的特性,已经形成标准,定义在rfc7519。
JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties.
JWT的发音跟单词jot相同,读[dʒɑt]。
JWT长什么样
JWT的最终表现形式是一个字符串,由两个点分隔的,不包含换行字符串。就像下面这样:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLCJleHAiOjEzMDA4MTkzODAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.6xWqaqNdCsyhIjc32MJKfikpOhAaBG9mz93He-E3Hvs
两个“.”把JWT分成了三段:
HEADER.PAYLOAD.SIGNATURE
HEADER、PAYLOAD、SIGNATURE这三段内容都是URL Safe的Base64编码字符串。Base64大家都清楚,URL Safe是把Base64编码后的字符串里面的=省略、+和/替换成-和_。这样最终的字符串就能够安全地放到URL里面而不需要再encode了。
HEADER
Header这段URL Safe的Base64编码字符串“eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9”在decode之后,是一个二进制的JSON。
转化成JSON字符串,是这样的:
{
"typ": "JWT",
"alg": "HS256"
}
格式就是这样了,typ不会变,alg代表签名算法。HS256代表HMAC-SHA256,是当前最常用的MAC算法。不了解MAC可以看这里。
alg还可以有其它取值,除了用MAC,还可以用RSA、ECC这种非对称签名算法。这个算法是用来计算SIGNATURE这一段内容的,具体干啥用,下面再具体介绍。
PAYLOAD
Payload这段URL Safe的Base64编码字符串“eyJpc3MiOiJqb2UiLCJleHAiOjEzMDA4MTkzODAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ”在decode之后,也是二进制的JSON。
转化成JSON字符串,是这样的:
{
"iss": "joe",
"exp": 1300819380,
"http://example.com/is_root": true
}
顾名思义,这一段是JWT对应用来说真正有用的内容。rfc7519定义了一些可以使用的固定字段:
- "iss" (Issuer) 签发者
- "aud" (Audience) 申请签发者
- "exp" (Expiration Time) 过期时间
- "nbf" (Not Before) 生效时间
- "iat" (Issued At) 签发时间
- "jti" (JWT ID) 唯一编号
虽然定义了一些字段,但这些字段全都是可选的,另外可以随意添加自定义字段。所以Payload可以理解成一个可以自定义的JSON。
SIGNATURE
JSON编码、Base64编码都是对数据进行的序列化,相当于明文存储。需要一种机制来保证JWT在传输过程中没有被篡改。
SIGNATURE就是干这事儿用的,“6xWqaqNdCsyhIjc32MJKfikpOhAaBG9mz93He-E3Hvs”这一段decode完,就是一个HMAC-SHA256的签名。相当于下面这段代码的计算结果:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)
其实就是用密钥对JWT前两段做了个签名,然后拼接在后面。
只要密钥不丢,别人即便拿到了JWT,解码看到了里面都有啥,也不能篡改内容。
解析示例
JWT有什么用
Web应用在很多时候需要令牌(Token)来串联业务,比如登录态保持、SSO登录态传递等。
在大部分场景,如果Token中能够包含一部分业务数据,业务流程会大大简化。JWT就是这样一种数据格式约定,考虑到了这些场景下对Token格式的要求,比如防篡改、TTL、多种算法、URL Safe等等,让大家可以拿来就用,不必再重复设计格式。
很方便,不过也仅仅就是一种格式而已,如果觉着不好,比如嫌JWT最终生成的字符串太长,那就设计自己的格式好了。
Reference
https://tools.ietf.org/html/rfc7519
https://jwt.io/introduction/
JWT简明介绍的更多相关文章
- Spark如何使用Akka实现进程、节点通信的简明介绍
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- Linq4j简明介绍
Linq4j简明介绍 开发JAVA一段时间,面临的一大问题就是集合操作,习惯了LINQ的简洁语法,对JAVA的集合操作实在是无甚好感,只能通过C系的循环实现筛选等操作,由于没有延迟执行特性,内存占用实 ...
- JWT的介绍解析
JWT的介绍解析 一.什么是JWT?了解JWT,认知JWT 首先jwt其实是三个英语单词JSON Web Token的缩写.通过全名你可能就有一个基本的认知了.token一般都是用来认证的,比如我们系 ...
- 静态库(.a)与动态库(.so)的简明介绍
静态库(.a)与动态库(.so)的简明介绍 gcc有很多关于静态库,动态库的选项如-l,-L,-fPIC,-shared -Wl,-soname,看着很复杂容易混淆,其实静态库和动态库都是应需而生,只 ...
- BearerToken之JWT的介绍
Bearer认证 HTTP提供了一套标准的身份验证框架:服务器可以用来针对客户端的请求发送质询(challenge),客户端根据质询提供身份验证凭证.质询与应答的工作流程如下:服务器端向客户端返回40 ...
- JSON Web令牌(JWT)介绍与使用
手机端接口开发会遇到一个问题是,接口登录后需要返回一个Token.token首先有一点必须唯一,每次请求都需要把token给带上.基于必须唯一的特性,很多朋友在开发是都选择了uuid.是不是token ...
- Spark中常用工具类Utils的简明介绍
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- java的LINQ :Linq4j简明介绍
开发JAVA一段时间,面临的一大问题就是集合操作,习惯了LINQ的简洁语法,对JAVA的集合操作实在是无甚好感,只能通过C系的循环实现筛选等操作,由于没有延迟执行特性,内存占用实在不敢恭维.因此便在网 ...
- Eclipse安装SVN插件方式简明介绍
一.Links安装: 推荐使用此种安装方式,因为它便于插件的管理. 在eclipse根目录下新建文件夹links,这样就得到了eclipse\links 在eclipse\links下新建一个link ...
随机推荐
- QFramework 使用指南 2020(二):下载与版本介绍
目前 QFramework 有两个可供安装的版本 PackageKit:QFramework 的插件平台,可以下载只感兴趣的插件,除了 Framework 模块还有一些 Shader 案例.项目模板. ...
- JavaScript的垃圾回收机制与内存泄漏
常用的两种算法: 引用计数(新版浏览器已弃用,弃用原因:会出现循环引用的情况,无法进行垃圾回收,导致内存泄漏) 标记清除 引用计数法 引用计数,顾名思义一个对象是否有指向它的引用,即看栈中是否有指向要 ...
- 谷歌移动UI框架Flutter教程之Widget
引言 在之间我已经介绍了关于Flutter的下载安装以及配置,还有开发工具Android Studio的配置,还不知道的同学可以看看我这篇博客--谷歌移动UI框架Flutter入门.这里为什么非要用A ...
- AVL-平衡二叉树的原理和实现
一.简介 本文将通过图解和代码详细讲解AVL平衡二叉树的性质及失衡和再平衡的内容.在看本文之前希望大家具备二分搜索树的相关知识.或移步<二分搜索树>了解二分搜索树. 二.平衡二叉树 前面关 ...
- TokuDB · 引擎特性 · HybridDB for MySQL高压缩引擎TokuDB 揭秘
原文出处:阿里云RDS-数据库内核组 HybridDB for MySQL(原名petadata)是面向在线事务(OLTP)和在线分析(OLAP)混合场景的关系型数据库.HybridDB采用一份数据存 ...
- thinkPHP中的简单文章推荐(按浏览量)功能实现
在公司中接触到了thinkPHP框架,其中要在项目中实现文章推荐功能.记录笔记如下: 一.在Controller中获取从文章列表页进入详情页传入的文章ID值. 二.在Controller中绑定数据库查 ...
- Egret白鹭开发微信小游戏分享功能
今天给大家分享一下微信分享转发功能,话不多说,直接干 方法一: 1.在egret中打开Platfrom.ts文件,添加代码如下(当然,你也可以直接复制粘贴) /** * 平台数据接口. * 由于每款游 ...
- babel-loader与babel-core的版本对应关系
babel-loader 8.x对应babel-core 7.xbabel-loader 7.x对应babel-core 6.x如何解决1. 卸载旧的babel-corenpm un babel-co ...
- 借助 RAM disk 技术,加快前端工程打包速度
背景以 Jenkins 服务器为例,在构建内部的这个项目时,CE 每部署一次服务,最快 6 分钟,最慢将近 13 分钟左右.遇到多个项目并发打包会因为资源占用等问题时间会延长,甚至出现过几次 20 分 ...
- 机器学习性能度量指标:ROC曲线、查准率、查全率、F1
错误率 在常见的具体机器学习算法模型中,一般都使用错误率来优化loss function来保证模型达到最优. \[错误率=\frac{分类错误的样本}{样本总数}\] \[error=\frac{1} ...