JWT

143 阅读2分钟

jwt全称Json Web Token,强行翻译过来就是json格式的互联网令牌

它要解决的问题,就是为多种终端设备,提供统一的、安全的令牌格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8NfqFv46-1649293375398)(media/16481748421276/16481749149910.jpg)]

因此,jwt只是一个令牌格式而已,你可以把它存储到cookie,也可以存储到localstorage,没有任何限制!

同样的,对于传输,你可以使用任何传输方式来传输jwt,一般来说,我们会使用消息头来传输它

比如,当登录成功后,服务器可以给客户端响应一个jwt:

image.png

可以看到,jwt令牌可以出现在响应的任何一个地方,客户端和服务器自行约定即可。

当然,它也可以出现在响应的多个地方,比如为了充分利用浏览器的cookie,同时为了照顾其他设备,也可以让jwt出现在set-cookie和authorization或body中,尽管这会增加额外的传输量。

当客户端拿到令牌后,它要做的只有一件事:存储它。

你可以存储到任何位置,比如手机文件、PC文件、localstorage、cookie

当后续请求发生时,你只需要将它作为请求的一部分发送到服务器即可。

虽然jwt没有明确要求应该如何附带到请求中,但通常我们会使用如下的格式:

image.png

jwt网站,里面提供了header,payload与生存jwt的互相转换

为了保证令牌的安全性,jwt令牌由三个部分组成,分别是:

header:令牌头部,记录了整个令牌的类型和签名算法 payload:令牌负荷,记录了保存的主体信息,比如你要保存的用户信息就可以放到这里 signature:令牌签名,按照头部固定的签名算法对整个令牌进行签名,该签名的作用是:保证令牌不被伪造和篡改 它们组合而成的完整格式是:header.payload.signature

比如,一个完整的jwt令牌如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE1ODc1NDgyMTV9.BCwUy3jnUQ_E6TqCayc7rCHkx-vxxdagUwPOWqwYCFc

它各个部分的值分别是:

header:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 payload:eyJmb28iOiJiYXIiLCJpYXQiOjE1ODc1NDgyMTV9 signature: BCwUy3jnUQ_E6TqCayc7rCHkx-vxxdagUwPOWqwYCFc 下面分别对每个部分进行说明

header 它是令牌头部,记录了整个令牌的类型和签名算法

它的格式是一个json对象,如下:

image.png