参考了一下这篇文章:https://medium.com/vandium-software/5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec

原理说的非常清楚。总结如下:

首先这个先说这个东西是什么,干什么用的,一句话说:就是这是一种认证机制,让后台知道请求是来自于受信的客户端。

那么从这个角度而言,这个东西跟浏览器的cookie是一个作用,好比我在一个网站登录了,就可以往这个网站发送restful请求,请求的同时会捎带上cookie,后台检查这个cookie发现你是合法的,才响应你的请求。

只不过这里JWT的原理不同,但基本上最顶层的原理还是非常简单:

这个图中有三个主体: user, application server和authentication server

非常常见的一个架构,首先用户需要 通过登录等手段向authentication server发送一个认证请求,authentication会返回给用户一个JWT(这个JWT的具体内容格式是啥后面会说,先理解成一个简单的字符串好了)

此后用户向application server发送的所有请求都要捎带上这个JWT,然后application server会验证这个JWT的合法性,验证通过则说明用户请求时来自合法守信的客户端。

下面简单说一下这个JWT的格式,十分简单,就是一个三部分组成的字符串:

下面一部分一部分来讲:

header, 一个例子是:

非常简单,typ顾名思义就是type的意思,例如上面这里就指明是JWT的类型。alg顾名思义是algorithm的意思,指代一个加密算法,例如上面指代HS256(HMAC-SHA256),这个算法会在生成第三部分signature的时候用到。

payload,一个例子是:

这部分的本质是用户数据,怎么理解呢,就是JWT的目的是认证身份来源,那么你是不是得自报家门我是谁呢?所以总得往里塞点跟用户相关的信息吧,例如这里就是userId

signature,一个例子是:

signature顾名思义就是签名,签名一般就是用一些算法生成一个能够认证身份的字符串,具体算法就是上面表示的,也比较简单,不赘述,唯一说明的一点是上面hash方法用到了一个secret,这个东西需要application server和authentication server双方都知道,相当于约好了同一把验证的钥匙,最终才好做认证。

至此,三个部分,都解释完了,那么按照header.payload.signature这个格式串起来就行了,串之前注意,header和payload也要做一个base64url encoded的转换。那么最终拼出来的一个例子是:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM

再次强调一点,别看上面做了那么多hash,其实目的不在加密保护数据,而是为了认证来源,认证来源,认证来源。JWT不保证数据不泄露,因为JWT的设计目的就不是数据加密和保护。

最后再解释一下application server如何认证用户发来的JWT是否合法,首先application server 和 authentication server必须要有个约定,例如双方同时知道加密用的secret(这里假设用的就是简单的对称加密算法),那么在applicaition 收到这个JWT是,就可以利用JWT前两段(别忘了JWT是个三段的拼成的字符串哦)数据作为输入,用同一套hash算法和同一个secret自己计算一个签名值,然后把计算出来的签名值和收到的JWT第三段比较,如果相同则认证通过,如果不相同,则认证不通过。就这么简单,当然,上面是假设了这个hash算法是对称加密算法,其实如果用非对称加密算法也是可以的,比方说我就用非对称的算法,那么对应的key就是一对,而非一个,那么一对公钥+私钥可以这样分配:私钥由authentication server保存,公钥由application server保存,application server验证的时候,用公钥解密收到的signature,这样就得到了header和payload的拼接值,用这个拼接值跟前两段比较,相同就验证通过。总之,方法略不同,但大方向完全一样。

提两个best practice:

1. 发送JWT要用https,原因前面说了,JWT本身不保证数据安全

2.JWT的payload中设置expire时间,为什么要这样做其实跟cookie为什么要设置过期时间一样,都是为了安全。

JWT(JSON Web Token)原理简介的更多相关文章

  1. Java JWT: JSON Web Token

    Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...

  2. JWT(JSON Web Token) 【转载】

    JWT(JSON Web Token) 什么叫JWTJSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. 一般来说,互联网用户认证是这样子的. 1.用户向服务器发送用户名和密码. ...

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

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

  4. 温故知新,.Net Core遇见JWT(JSON Web Token)授权机制方案

    什么是JWT JWT (JSON Web Token) 是一个开放标准,它定义了一种以紧凑和自包含的方法,用于在双方之间安全地传输编码为JSON对象的信息. 因此,简单来说,它是JSON格式的加密字符 ...

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

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

  6. [更新]一份包含: 采用RSA JWT(Json Web Token, RSA加密)的OAUTH2.0,HTTP BASIC,本地数据库验证,Windows域验证,单点登录的Spring Security配置文件

    没有任何注释,表怪我(¬_¬) 更新: 2016.05.29: 将AuthorizationServer和ResourceServer分开配置 2016.05.29: Token获取采用Http Ba ...

  7. ( 转 ) 什么是 JWT -- JSON WEB TOKEN

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  8. 关于JWT(Json Web Token)的思考及使用心得

    什么是JWT? JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(php 后端实现JWT认证方法一般用来做轻量级的API鉴权.由于许多API接口设计是遵循无状态的(比如 ...

  9. 什么是JWT(Json Web Token)

    什么是 JWT (Json Web Token) 用户认证是计算机安全领域一个永恒的热点话题. JWT 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该to ...

随机推荐

  1. 使用Java2D改善API的绘制效果

    ---------------siwuxie095                             工程名:TestSwingPaintAPI 包名:com.siwuxie095.swingp ...

  2. 1003 NOIP 模拟赛Day2 城市建设

    题面不好找放一个吧. Description 描述 在有$N$个地级市的H省,政府为了城市开发建设,决定先修路,后造房子,以吸引外来人员.一开始每个城市中有$b_i$个住户,而在两个城市$u,v$之间 ...

  3. 《Head First Servlets & JSP》-8-无脚本的JSP

    以前servlet和JSP交互的代码 servlet代码示例: JSP代码示例: 若属性不是一个String而是一个Bean呢? 一个简单的JavaBean servlet代码示例: JSP代码示例: ...

  4. Java分层概念(转)

    Java分层概念(转) 对于分层的概念,似乎之间简单的三层,多了,就有点难以区分了,所以收藏了这个. ervice是业务层 action层即作为控制器 DAO (Data Access Object) ...

  5. Android 中 吐司显示不出来的原因分析

    当你发现你的toast的show方法的确被执行了,但是却没有在界面中显示出来, 有问题的地方可能有两点: 1.Context上下文对象有问题,不是当前的上下文对象或者什么的: 2.message(即T ...

  6. sina 接口 根据ip获取各个国家和地区

    http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=ip

  7. ubuntu重新安装 apache2

    $ sudo apt-get --purge remove apache2 $ sudo apt-get --purge remove apache2.2-common $ sudo apt-get ...

  8. javascript 常用兼容fire fox的解决办法

    常用兼容fire fox的解决办法 一.js不兼容:1.event不兼容,必须通过参数传递过来: function test(event){ //兼容fire fox var event = even ...

  9. c# 大文件分割 复制 Filestream 进度条

    大文件分割复制,每次复制100M 也可以复制别的较大数值. 小于1G的小文件就直接复制得了.代码里没写 ,但是很简单 直接写进去就好了,难得是分割复制 所以没写. 好吧 我还是改了 改成小文件也可以复 ...

  10. Spark大数据处理 之 动手写WordCount

    Spark是主流的大数据处理框架,具体有啥能耐,相信不需要多说.我们开门见山,直接动手写大数据界的HelloWorld:WordCount. 先上完整代码,看看咋样能入门. import org.ap ...