JWT是一个无状态登录的技术.所谓无状态,是指和传统的session技术相比,服务器端不需要存储用户的信息.在JWT技术中,agent向server请求一个Token.
这个Token由三部分组成,head, playload,signature.三个部分由"."隔开.下面分别解释这三个部分的作用.
1.head
head中主要存储了这个Token所采用的加密算法.
2.playload
playload中存储的是这个token的有效信息.例如某个用户User1想要向服务器请求某个资源.那么当他向服务器请求资源时,他所附加的token中必然会存储这个
用户的身份信息,这个身份信息就是存储在playload中的.
3.signature
signature是用来验证这个Token有效性的.下面会详细说明.
用一个例子来说明JWT的工作过程:
a.用户User1向服务器请求一个Token,其中包含了用户名User1, 过期时间,签发时间等信息.
b.服务器收到用户User1的请求后,首先用BaseURL64编码将用户请求中所包含的用户名,过期时间,签发时间等信息转化为一个字符串.
注意这个字符串是没有加密的.BaseURL64编码只是一个简单的映射,你可以理解为他就是明文.
c.服务器根据指定的加密算法生成signature,例如:
RSASHA256(base64UrlEncode(header) + "." + base64UrlEncode(playload), publicKey, privateKey)
这里publicKey和privateKey都是服务端事先定义好的秘钥.服务器将得到的signature和head,playload拼接在一起返回给用户.
d.当用户想要访问某个资源的时候,它将从服务器哪里获得的Token附着在http请求的头部.
e.服务器端收到用户的请求后,将Token从http请求的头部取出,然后用秘钥对这个Token的signature进行解密.
如果解密的结果与playload的内容一致,那么这个token就是有效的.否则这个Token就是无效的.
也就是说,JWT中存储的信息是明文,任何人只要得到Token就可以获取里面的信息.但是恶意用户无法修改Token中所存储的信息.
服务器端会验证它所收到的Token信息是否遭到篡改.
Ref: https://jwt.io/