一文看懂JWT (JSON Web Token)
介绍
JSON Web Token(JWT)是一种紧凑的声明表示格式,旨在用于空间受限的环境,例如HTTP授权头和URI查询参数。JWT将声明编码为JSON [RFC7159] 对象,该对象用作JSON Web Signature(JWS)[JWS]结构的有效负载或JSON Web Encryption(JWE)[JWE]结构的明文,从而使得声明可以通过数字签名或使用消息认证码(MAC)进行完整性保护和/或加密。JWT始终使用JWS紧凑序列化或JWE紧凑序列化表示。
JWT的建议发音与英语单词 "jot" 相同。
-
术语 "JSON Web Signature (JWS)"、"Base64url Encoding"、"Header Parameter"、"JOSE Header"、"JWS Compact Serialization"、"JWS Payload"、"JWS Signature" 和 "Unsecured JWS" 由JWS规范[JWS]定义。
-
术语 "JSON Web Encryption (JWE)"、"Content Encryption Key (CEK)"、"JWE Compact Serialization"、"JWE Encrypted Key" 和 "JWE Initialization Vector" 由JWE规范[JWE]定义。

JWT可以解决什么问题?
-
集群数据共享
-
跨域认证
-
认证 Authentication
-
授权 Authorization
-
联合识别
-
客户端会话(无状态的会话)
-
客户端机密
名词解释
-
JWS:Signed JWT签名过的jwt
-
JWE:Encrypted JWT部分payload经过加密的jwt;目前加密payload的操作不是很普及;
-
JWK:JWT的密钥,也就是我们常说的 scret;
-
JWKset:JWT key set在非对称加密中,需要的是密钥对而非单独的密钥,在后文中会阐释;
-
JWA:当前JWT所用到的密码学算法;
-
nonsecure JWT:当头部的签名算法被设定为none的时候,该JWT是不安全的;因为签名的部分空缺,所有人都可以修改。
JWT原理
服务器认证之后生成一个JSON对象,对象中包含描述用户的标识,用户与服务端通信的时候需要携带这些数据,用来识别用户身份。服务器变为无状态,比较容易实现扩展。
JWT数据结构

JWT包含三部分
-
Header(头部)
-
Payload(负载)
-
Signature(签名)没有该部分的JWT被称为nonsecure JWT也就是不安全的JWT,此时header中声明的签名算法为none
这三部分通过.进行分割,如下
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
其中Header,Payload都是json对象通过Base64URL算法编码后的字符串,我们可以直接将其解码
Header中包含alg和typ,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
json
{
"alg": "HS256",
"typ": "JWT"
}
Payload 用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。
-
iss (Issuer):签发人
-
exp (Expiration Time):过期时间
-
sub (Subject):主题
-
aud (Audience):受众
-
nbf (Not Before):生效时间
-
iat (Issued At):签发时间
-
jti (JWT ID):编号
此外你可以向其中添加素有字段,例如下面的name
json
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
从上面可以看出JWT不是加密的,只要拿到该字符串,就可能读取到数据,所以不要将私密信息放在里面。
Signature 是前两部分的签名,用来防止数据被篡改
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
JWT的特征
- JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
- JWT 不加密的情况下,不能将秘密数据写入 JWT。
- JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
- JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
- JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
- 为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。