JWT(json web token) 电脑版发表于:2021/9/8 22:19 # jwt [toc] *[官网直达jwt.io](https://jwt.io/introduction)* ## 什么是json 网络令牌 json web token (jwt) 是一个开放标准,它定义了紧凑且自包含的方式, 用于在各方之间作为json 对象安全的传输信息。 该信息是可以被验证和信任的, 因为它是经过数字签名的。 <!-- 注: --> > 紧凑:就是网络传输快,体积小 > > 自包含:可以包含一些自定义的数据,且信息公开。 > > json 对象: 归根结底它还是一种json 对象 > > 安全:利用各种算法进行的签名 > > 签名:就是加密, 作用就是用来验证请求,防止请求被篡改。 ## 什么时候使用jwt 1. 授权 2. 信息交换 ### 授权 - 用户登录,后续的请求都带上jwt , 用来控制路由,资源,服务。 - 单点登录 > 因为jwt 的开销很小,并且能够轻松的跨域 ### 信息交换 - 接口请求的时候带上: 验证是否是对方发起的。 ## 什么是jwt 结构 > jwt由(.)分割的三个部分组成: header.payload.signature > > 例如:xxx.yyy.zzz ### header 标题 > 标题有两部分组成: type ,alg(加密方式) > > 例如: > > `{"alg":"HS256","typ":"JWT"}` > > 然后把json base64Url 编码 ### payload 负载 > 令牌的第二部分是负载,其中包含声明。声明是关于实体(通常是用户)和附加数据的声明。共有三种类型的声明:*注册声明*、*公共*声明和*私人*声明。 1. 注册声明: 官方推荐的 iss (发行者),exp(到期时间), sub(主题),aud(受众) 2. 公共声明 3. 私人 `{ "sub": "1234567890", "name": "John Doe", "admin": true }` 然后把json base64Url编码 形成jwt 第二部分 ## sign 签名 > 签名你必须获取到header ,payload 的数据并使用header 指定的算法对其签名 > > 例如:`HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)` > > 然后并将把header.payload.sign 拼接起来得到jwt. > > [jwt 官网解码,验证,生成jwt工具](https://jwt.io/#debugger-io)