文档地址: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)Header: 头部包含了两个部分:token类型 和 加密算法
例如:
{
"alg": "HS256",
"typ": "JWT"
}
这个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
}
同样会使用Base64编码,组成JWT的第二部分。
(3)Signature:
由编码后的header,payload,sercret,和算法共同生成Signature。Signature可以用来检验信息不会被中途改变。
整合:
生成的三个Base64-URL字符串可以在HTML和HTTP环境中传输,比SAML简洁遍历。
【JWT是如何工作的?】
在认证阶段,当用户成功地登录时,会返回一个JWT,持有这个JWT不会超过特定时间。
当用户想要访问保护路径或者资源时,客户端应该发送自己的JST,通常在Authorization的头部使用Bearer <token>的方式 ,
Authorization: Bearer <token>
服务器会检查在Authorization头部是否有合法的JWT。
注意:尽量避免让JWT太长。有些服务器不接受超过8kb的headers,如果想要在JWT token中添加很多信息,可以使用其他方法,比如 Auth0 Fine-Grained Authorization Fine Grained Authorization (FGA) at scale for developers - Auth0
如果token包含在Authorization头部,那么跨域访问资源就不会是一个问题,因为没有使用Cookies
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的对比: