JWT全称JSON Web Token是一种新的身份认证技术,也是一种信息交换技术。
JWT的原理是,在服务器在进行完认证会生成一个JWT token 并且返回给客户端。以后客户端每次的请求都加上这个token,客服端每次请求加上这个token服务器就可以通过算法解析token里内容拿到客户端端的认证信息。由于这个token只保存在客户端,并未在服务器端保存,所以是无状态的,方便扩展。
JWT有以下三个部分组成:
- Header
- Payload
- Signature
因此JWT最终的结果是xxxxx.yyyyy.zzzzz这样格式的字符串。
Header
header主要包含了2部分内容,签名所用的算法和token类型。支持的签名算法有HMAC、SHA256、 RSA等。token类型为JWT
{
"alg":"sha256",
"type":"JWT"
}
将这部分内容进行Base64编码,便是JWT的第一部分内容。
Payload
payload是JWT的有效负载,payload有三部分数据,第一部分数据是预定义字段有iss(签发人)、sub(主题)、adu(受众)、exp(过期时间)、nbf(生效时间)、iat(签发时间)、jti(JWT ID)总共7个。第二部分是公开字段在IANA JSON Web Token Registry有注册。第三部分是私有的字段不能和必须声明字段和公开注册字段冲突即可,下面是payload的一个demo
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
这部分内容也是要进行Base64编码的,编码后的字符串是JWT的第二部分。
Signature
signature通过使用header里声明的签名算法,由服务器提供一个secret对已经Base64编码后的header和payload进行签名得到的。
signature=sha256(header + '.' + payload, secret);
最终返回给客户端的内容就是下面这样格式的字符串
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ