发展1:原始在没有JWT的时候,服务器发送一些信息info给浏览器后,浏览器将信息以cookie或localStorage等方式进行保存,缓存信息info供将来直接发送给服务器。而这样的弊端是,该缓存信息存于浏览器端,则存有通过浏览器端对信息进行篡改、伪造数据传给服务器的情况。
发展2:为能识别浏览器传过来的信息真伪,服务器则可采用签名的方式(签名是一种算法),服务器通过信息+密钥进行某种算法即可得到一个签名结果(常见以字符串形式作为签名结果),其中密钥保存在服务器端。则服务器发送信息给浏览器变为先对info信息进行签名再将签名结果“info.签名”发送给浏览器,则浏览器缓存的信息即为带有签名的信息“info.签名”,这时浏览器再将缓存信息“info.签名”传给服务器,服务器只要将得到的info再进行一次密钥加密,将得到的签名结果与浏览器传过来的“info.签名”进行对比,即可确认信息是否有被篡改。(客户端没有密钥,没法通过服务器端的密钥对篡改的信息进行加密伪造为与服务器一致的签名结果)因此浏览器传给服务器的信息可被验证。
发展1→发展2实际上就是JWT的雏形。
JWT实际就是一个字符串,这个字符串有一个标准格式(事实上JWT就是给发展1→发展2中info.签名信息规定了一套标准格式),有三个部分组成:header+payload+signature。header主要是说明JWT标准的信息(由json对象信息转换为base64格式),payload则包含要传给浏览器的info信息等(也是由json对象信息转换为base64格式),signnature则为通过密钥对header.payload信息进行加密算法得到的签名结果(再将结果转为base64格式)。再将这三个部分则通过“.”进行拼接即返回为JWT结果。
实际上header和payload都是明文(base64只是一种数据格式的转换,并非加密算法),只有signature是签名结果,用来验证前面两个明文部分有没有被篡改伪造。
发展3:JWT实际应用过程。服务器生成JWT,放在响应数据的header或body中传给浏览器,浏览器将JWT信息通过localStorage或cookie等方式进行存储,将来浏览器重新请求服务器时将存储的JWT信息传给服务器,服务器则能验证浏览器传过来的信息有没有被动过,而返回相应的响应结果。