文档地址: JSON Web Token Introduction - jwt.io

【什么是JWT?】

JWT全称是JSON Web Token,可以用来安全的传输json对象的信息。

JWT使用HMAC算法或RSA/ECDSA算法进行加密。

秘钥可以保证信息全部在里面,但是对外界又是保密的,当使用公/私钥的时候,只有一方持有私钥。

【什么时候使用JWT?】

(1)授权(Authorization):

这是使用最多的场景。当用户登录的时候,每一个request都会包含JWT,这样才可以让user访问资源。

单点登录(Single Sign On)中使用了JWT验证:因为JWT开销小,并且可以在不同域名都可以使用的优点。

(2)信息交换(Infomation Exchange):

(1)由于JWT可以使用公私钥,这样可以指明特定的接受方。

(2)signature是由信息生成的,可以检查信息是否被篡改。

【JWT的结构是什么?】

JWT包含3个部分,用。分隔开:Header,Payload,Signature

xxxx.yyyy.zzzz
  • 1.

(1)Header:  头部包含了两个部分:token类型 和 加密算法

例如:

{
  "alg": "HS256",
  "typ": "JWT"
}
  • 1.
  • 2.
  • 3.
  • 4.

这个json对象使用Base64编码,组成JWT的第一个部分。

(注:Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据)

(2)Payload:由Claims(声明,声称)组成。

Cliams包含了实体信息(statements about an entity)和额外信息。

Cliams有三种类型:Registered Claims,Public Claims ,Private claims。

例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

同样会使用Base64编码,组成JWT的第二部分。

(3)Signature:

由编码后的header,payload,sercret,和算法共同生成Signature。Signature可以用来检验信息不会被中途改变。

整合:

生成的三个Base64-URL字符串可以在HTML和HTTP环境中传输,比SAML简洁遍历。

什么是JWT?【官方文档翻译】_XML

 

【JWT是如何工作的?】

在认证阶段,当用户成功地登录时,会返回一个JWT,持有这个JWT不会超过特定时间。

当用户想要访问保护路径或者资源时,客户端应该发送自己的JST,通常在Authorization的头部使用Bearer <token>的方式 , 

Authorization: Bearer <token>
  • 1.

服务器会检查在Authorization头部是否有合法的JWT。

注意:尽量避免让JWT太长。有些服务器不接受超过8kb的headers,如果想要在JWT token中添加很多信息,可以使用其他方法,比如 Auth0 Fine-Grained Authorization   Fine Grained Authorization (FGA) at scale for developers - Auth0

如果token包含在Authorization头部,那么跨域访问资源就不会是一个问题,因为没有使用Cookies

什么是JWT?【官方文档翻译】_JSON_02

 1)客户端向authorizaiton server发送authorization请求

 2)当认证通过后,authorization server会返回一个token。

3)使用token访问保护资源

注意:存放在token中的信息对其他人是可见的,不能把机密信息存在token中。

【为什么要使用JWT?】

(1)相较于XML,JSON更简洁,所以在编码后体积更小,这使JWT相较于SAML更简洁,让JWT更容易在HTML和HTTP环境下传输

(2)SWT只能使用HMAC算法加密,而JWT和SAML能使用公私钥加密,但是对XML加密又比较困难。

(3)在大多数编程语言中都有JSON解释器,因为json可以直接转换为object。XML没有从docum到object的转换。

 JWT和SAML token的对比:

什么是JWT?【官方文档翻译】_JSON_03

什么是JWT?【官方文档翻译】_字符串_04