写点什么

jwt

作者:卢卡多多
  • 2022 年 6 月 24 日
  • 本文字数:1196 字

    阅读完需:约 4 分钟

jwt

一、JWT 令牌

1、什么是 JWT 令牌


JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌。
复制代码


JSON Web令牌(JWT)是一种紧凑的、URL安全的方式, 用来表示要在双方之间传递的“声明”。JWT中的声明被编码为JSON对象,用作JSON Web签名(JWS)结构的有效内容或JSON Web加密(JWE)结构的明文,使得声明能够被:数字签名、 或利用消息认证码(MAC)保护完整性、加密。
复制代码


JWT的使用场景:一种情况是webapi,另一种情况是多web服务器下实现无状态分布式身份验证。
复制代码

2、JWT 令牌的组成

典型的,一个 JWT 看起来如下图:\


https://jwt.io/\


该对象为一个很长的字符串,字符之间通过"."分隔符分为三个子串。


每一个子串表示了一个功能块,总共有以下三个部分:JWT 头、有效载荷和签名


J**WT 头**


JWT 头部分是一个描述 JWT 元数据的 JSON 对象,通常如下所示。


{
复制代码


  "alg": "HS256",
复制代码


  "typ": "JWT"
复制代码


}
复制代码


在上面的代码中,alg 属性表示签名使用的算法,默认为 HMAC SHA256(写为 HS256);typ 属性表示令牌的类型,JWT 令牌统一写为 JWT。最后,使用 Base64 URL 算法将上述 JSON 对象转换为字符串保存。


有效载荷


有效载荷部分,是 JWT 的主体内容部分,也是一个 JSON 对象,包含需要传递的数据。 JWT 指定七个默认字段供选择。


iss:发行人
复制代码


exp:到期时间
复制代码


sub:主题
复制代码


aud:用户
复制代码


nbf:在此之前不可用
复制代码


iat:发布时间
复制代码


jti:JWT ID用于标识该JWT
复制代码


除以上默认字段外,我们还可以自定义私有字段,如下例:


{
复制代码


  "name": "Helen",
复制代码


  "admin": true
复制代码


}
复制代码


请注意,默认情况下 JWT 是未加密的,任何人都可以解读其内容,因此不要构建隐私信息字段,存放保密信息,以防止信息泄露。


JSON 对象也使用 Base64 URL 算法转换为字符串保存。


签名哈希


签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。


首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为 HMAC SHA256)根据以下公式生成签名。


HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(claims), secret)
复制代码


在计算出签名哈希后,JWT 头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用"."分隔,就构成整个 JWT 对象。


Base64URL 算法


如前所述,JWT 头和有效载荷序列化的算法都用到了 Base64URL。该算法和常见 Base64 算法类似,稍有差别。


作为令牌的 JWT 可以放在 URL 中(例如 api.example/?token=xxx)。 Base64 中用的三个字符是"+","/"和"=",由于在 URL 中有特殊含义,因此 Base64URL 中对他们做了替换:"="去掉,"+"用"-"替换,"/"用"_"替换,这就是 Base64URL 算法。

三、总结

1、JWT 令牌类似支票


2、JWT 令牌的优缺点

JWT 令牌的优点:


1、jwt 基于 json,非常方便解析。


2、可以在令牌中自定义丰富的内容,易扩展。


3、通过非对称加密算法及数字签名技术,JWT 防止篡改,安全性高。


4、资源服务使用 JWT 可不依赖认证服务即可完成授权。


缺点:


1、JWT 令牌较长,占存储空间比较大。


\

发布于: 刚刚阅读数: 3
用户头像

卢卡多多

关注

努力寻找生活答案的旅途者 2020.04.12 加入

公众号:卢卡多多,欢迎一起交流学习 2021年度优质创作者

评论

发布
暂无评论
jwt_JWT_卢卡多多_InfoQ写作社区