JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。由于此信息是经过数字签名的,因此可以被验证和信任。

今天我们就来简单的认识一下 JSON Web Token。

JWT 认证和 session认证的区别

首先需要说明 JSON Web Token 是可以用于认证的,那么就先来对比一下 JSON Web Token 认证和 传统的 session 认证的区别,传统的 session 认证是有状态的,也就是说我们需要在服务端保存用户的认证信息,如果服务端重新或者换一台服务器,那么这个认证就失效了,并且传统的 session 的认证方式扩展起来不是那么的容易。

基于 JSON Web Token 的鉴权机制类似于 http 协议,是一种无状态的,服务器不需要保存用户的认证信息或者会话信息,这也就意味着 JWT 认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,也是由于这个特性,JWT 在微服务架构中应用广泛。

JSON Web Token 的组成

一个 JSON Web Token 实际上就是一个字符串,它由三部分组成:头部、载荷与签名,如下图所示:

1、头部(header )

头部用于描述关于该 JSON Web Token 的最基本的信息,例如其类型以及签名所用的算法等,通常如下所示:

{
"alg": "HS256",
"typ": "JWT"
}
  • alg属性:表示签名使用的算法,默认为HMAC SHA256(写为HS256)
  • typ属性:表示令牌的类型,JWT令牌统一写为JWT

头部一般使用 base64 加密,加密后密文:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

2、载荷(payload)

载荷是 JSON Web Token 的主体内容部分,里面存放一些有效信息,JSON Web Token 标准定义中定义了以下 5 个字段:

  • iss: 该JWT的签发者
  • sub: 该JWT所面向的用户
  • aud: 接收该JWT的一方
  • exp(expires): 什么时候过期,这里是一个Unix时间戳
  • iat(issued at): 在什么时候签发的

除了标准定义中的字段外,我们还可以自定义字段,比如在 JWT 中,我们的载荷信息可能如下:

{
"sub": "1234567890",
"name": "pingtouge",
"admin": true
}

我们需要注意,在默认情况下 JWT 是未加密的,每一个人都可以读取其内容,因此在载荷中,不要存放私密信息,防止信息泄露。

3、签名(signature)

签名是 JSON Web Token 中比较重要的一部分,前面两部分都是使用 Base64 进行编码的,signature 需要使用编码后的 header 和 payload 以及我们提供的一个密钥,然后使用 header 中指定的签名算法(HS256)进行签名,签名的作用是保证 JWT 没有被篡改过。

为什么需要签名?

对于加密算法来说,碰撞概率还是比较小的,一般而言,不同的输入加密后的输出是不一样的,不同输入产生相同结果的概率还是相当小的,所以可以利用加密算法的这个特性来判断 JWT 是否被篡改过。

假如有人篡改了载荷中的信息,再进行编码的话,那么新的头部和载荷的签名跟之前的签名是不一样的,并且如何加密的密钥不一样的话,得出来的签名结果也会不一样。

JWT使用场景

  • Authentication(鉴权)

这是使用JWT最常见的情况。 一旦用户登录,每个后续请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源。 单点登录是当今广泛使用JWT的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。

  • Information Exchange(信息交换)

JSON Web Tokens是在各方之间安全传输信息的好方式。 因为JWT可以签名:例如使用公钥/私钥对,所以可以确定发件人是他们自称的人。 此外,由于使用标头和有效载荷计算签名,因此您还可以验证内容是否未被篡改。

以上就是 JSON Web Token 相关知识,希望这篇文章对您的学习或者工作有所帮助,如果您觉得文章有帮助,欢迎帮忙转发,谢谢。

最后

目前互联网上很多大佬都有 JSON Web Token 相关文章,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

欢迎扫码关注微信公众号:「互联网平头哥」,和平头哥一起学习,一起进步。

一分钟简单了解 JSON Web Token的更多相关文章

  1. JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现

    十年河东,十年河西,莫欺少年穷. 学无止境,精益求精. 突然发现整个十月份自己还没有写一篇博客......哎,说出来都是泪啊,最近加班实在实在实在是太多了,真的没有多余的时间写博客.这不,今天也在加班 ...

  2. 5分钟搞懂:JWT(Json Web Token)

    https://www.qikegu.com/easy-understanding/892 JWT 基于token的用户认证原理:让用户输入账号和密码,认证通过后获得一个token(令牌),在toke ...

  3. 如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  4. 理解JSON Web Token (一)

    一:理解单系统登录的原理及实现? web应用采用的 browser/server 架构的,http是无状态协议的,也就是说用户从A页面跳转到B页面会发起http请求,当服务器返回响应后,当用户A继续访 ...

  5. 使用json web token

    由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPHP,到现在的nodejs,我自己的看法是 ...

  6. Laravel 5 中使用 JWT(Json Web Token) 实现基于API的用户认证

    在JavaScript前端技术大行其道的今天,我们通常只需在后台构建API提供给前端调用,并且后端仅仅设计为给前端移动App调用.用户认证是Web应用的重要组成部分,基于API的用户认证有两个最佳解决 ...

  7. 理解JWT(JSON Web Token)认证及python实践

    原文:https://segmentfault.com/a/1190000010312468?utm_source=tag-newest 几种常用的认证机制 HTTP Basic Auth HTTP ...

  8. 理解JWT(JSON Web Token)认证

    理解JWT(JSON Web Token)认证 最近想做个小程序,需要用到授权认证流程.以前项目都是用的 OAuth2 认证,但是Sanic 使用OAuth2 不太方便,就想试一下 JWT 的认证方式 ...

  9. 42.JSON Web Token认证

    JSON Web Token认证介绍 简称JWT认证,一般用于用户认证 JWT是一种相当新的标准,可用于基于token的身份验证 与内置的TokenAuthentication方案不同,JWT不需要使 ...

随机推荐

  1. apache相关实验-1

    一.目录别名实验 当 apache 接受请求时,在默认情况下会将 DocumentRoot 目录中的文件送到客户端,如果想将某一不在 DocumentRoot 目录中的文件共享到网站上,并希望将它们留 ...

  2. Linux开发环境及应用—《第五周单元测验》《第六周单元测验》

    1.与windows中"格式化磁盘"功能相对应的Linux命令是 mkfs 2.在Linux文件系统中,文件名也存放在磁盘上,存放于磁盘的下述哪个区域 文件存储区 3.传统Linu ...

  3. 在EasyUI项目中使用FileBox控件实现文件上传处理

    我在较早之前的随笔<基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用>Web框架介绍中介绍了基于Uploadify的文件上传操作,免费版本用的是J ...

  4. 11.在Chrome谷歌浏览器中安装插件XPath Helper的方法

    1.首先在以下链接下载XPath Helper插件,链接:https://pan.baidu.com/s/1Ng7HAGgsVfOyqy6dn094Jg 提取码:a1dv 2.插件下载完成后解压,然后 ...

  5. CF1200E Compress Words | 字符串hash

    传送门 Examples input 1 5 I want to order pizza output 1 Iwantorderpizza input 2 5 sample please ease i ...

  6. 《C++Primer》第五版习题详细答案--目录

    作者:cosefy ps: 答案是个人学习过程的记录,仅作参考. <C++Primer>第五版习题答案目录 第一章:引用 第二章:变量和基本类型 第三章:字符串,向量和数组 第四章:表达式

  7. Netty快速入门(05)Java NIO 介绍-Selector

    Java NIO Selector Selector是Java NIO中的一个组件,用于检查一个或多个NIO Channel的状态是否处于可读.可写.如此可以实现单线程管理多个channels,也就是 ...

  8. 客户端访问windows server2016 服务器共享 速度慢

    客户端(windows10)敲完地址后,要过很久才会谈出窗口.  所有的客户端都出现过此现象. 解决:关闭server的 Smb1.0

  9. 关于将vs项目推到GitHub上遇到的问题

    想整理下项目,然后通过vs推到github下. 1.在vs上创建好了一个程序.点中解决方案-->右键-->将项目加入代码库. 2.在github上创建好一个仓库,然后复制下https 3. ...

  10. C++符合类型:指针和引用

    1. 引用(左值引用) 引用为对象起了另外一个名字,引用类型引用另外一种类型. int ival = 1024; int &refval = ival; //refval指向ival(是iva ...