JWT分为三部分:
头部:里面包含签名通过哪个加密方式进行加密。
载荷:有着JWT的相关配置信息,我们的数据也是存储在载荷中的,还可以在载荷中设置JWT的有效时间,通过在载荷字典中设置exp部分来设置jwt的有效时间。
签名:先将heade头部部分通过Base64编码,再把payload载荷这部分进行Base64编码,然后将这两部分加上secret_key合成一个新的字符串然后通过头部中定义的签名加密方式进行加密,生成一个签名。
然后构建一个jwt字符串:header Base64后的字符串.载荷 Base64后的部分.签名
这就是一个完整的JWT字符串了。
验签:
当我们收到了一个:header Base64后的字符串.载荷 Base64后的部分.签名 这样的格式的jwt字符串我们会先将header Base64后的字符串和载荷 Base64后的部分以及手里有的secret_key合并进行HS256加密,加密结束后和我们收到的那个jwt中的签名进行对比,对比不成功,代表你的数据被篡改过,因为你的header数据和payload的数据是很容易拿到的,也是很容易被篡改的,但是,外边的人没有secret_key,他加密出来的签名和我们在验签时,将header Base64后的字符串和载荷 Base64后的字符串融合了secret_key生成的签名是不一样的,只要不一样,就代表,这不是我们生成的签名,就代表这个jwt不合法。如果验证成功,发现签名是正确的,就会把载荷这部分拿出来,解码,然后从中拿到exp的那部分,看看这个jwt是否过期了,如果过期了,就不会把数据返回了,如果没过期,再把数据返回。
相当于我们拿到一个JWT数据后,根据 header Base64后的字符串和载荷 Base64后的字符串融合了secret_key,生成了一个签名,如果你是从我这个服务器里出来的jwt数据,那么你的签名本应该就是这个签名,如果我们生成的签名和传入的那个签名不对,就代表你的jwt不合法。
简单来说:
根据头部和载荷的数据,计算一下如果你是从我这个服务器出来的,那么你的签名应该是什么,然后和传入服务器的那个jwt中的签名进行对比,如果不一样,就代表你不是从我这里出来的。