JWT = JSON Web Tokens
一、JWT概述
JSON Web Tokens(缩写 JWT)是目前最流行的跨域认证解决方案。
JWT的认证过程如下图:
二、JWT 的原理
三、JWT的数据结构
JWT分为三部分
所以一个token的结构就是这样的:
Header.Payload.Signature
它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。
1.分别介绍三部分
①.Header(头部)
Header包含的信息:
{
“alg”: “HS256”,
“typ”: “JWT”
}
也就是说,header含有两个属性,**算法(algorithm)**和 类型(type)
算法:alg属性表示签名算法(algorithm),默认是 HMAC SHA256(写成 HS256);
类型:typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
设置好算法和类型属性值后,将其进行Base64URL编码,然后向下进行负载的设置
②.Payload( 负载 )
Payload包含的信息:
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
以上信息字段是由官方提供,是可选择的,你可以根据需求选择部分字段设置相应的信息。
而除了上面这些,你也可以自定义私有字段,例如下面这部分Payload:
{
“sub”: “1234567890”, //官方字段
“name”: “John Doe”, //自定义
“admin”: true //自定义
}
值得注意的是:JWT默认情况下是不加密的,这意味着任何人都可以随意读取到这里的信息,所以不要放入秘密信息在这里。
设置好负载字段值后,也将其使用Base64URL编码,然后向下进行前面的设置
③.Signature( 签名 )
Signature 部分是对前两部分的签名,防止数据篡改。
那么为了安全性,签名就需要一个密匙(SecretKey),这个密匙只能让在服务端设置,也就是只有后台掌握密匙才能进行有效签发token。一旦密匙被他人知道,那么token就可以被随意签发。
还记得在Header里设置的算法吗?下面将使用算法
在使用Header设置的签名算法前
a.将上面编码后的头部与负载使用 点符号(.)进行拼接,
b.然后再加上密匙,
最后进行加密签名
设置的算法吗?下面将使用算法
在使用Header设置的签名算法前
a.将上面编码后的头部与负载使用 点符号(.)进行拼接,
b.然后再加上密匙,
最后进行加密签名