JWT、JWE、JWS 、JWK 到底是什么?该用 JWT 还是 JWS?

JWT 相信很多小伙伴都知道,JSON Web Token,如果在项目中通过 jjwt 来支持 JWT 的话,可能只需要了解 JWT 一个概念即可,但是现在很多时候我们可能不是使用 jjwt,而是选择 nimbus-jose-jwt 库,此时就有可能接触到一些新的概念,如 JWE、JWS。那么 JWE、JWS 以及 JWT 之间是什么关系呢?松哥最近看到一篇不错的文章讲这个,我们一起来看下,以下是正文。

什么是 JWT

一个JWT,应该是如下形式的:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

这些东西看上很凌乱,但是非常紧凑,并且是可打印的主要用于验证签名的真实性。

JWT 解决什么问题?

JWT的主要目的是在服务端和客户端之间以安全的方式来转移声明。主要的应用场景如下所示:

  1. 认证 Authentication;
  2. 授权 Authorization // 注意这两个单词的区别;
  3. 联合识别;
  4. 客户端会话(无状态的会话);
  5. 客户端机密。

JWT 的一些名词解释

  1. JWS:Signed JWT签名过的jwt
  2. JWE:Encrypted JWT部分payload经过加密的jwt;目前加密payload的操作不是很普及;
  3. JWK:JWT的密钥,也就是我们常说的 scret;
  4. JWKset:JWT key set在非对称加密中,需要的是密钥对而非单独的密钥,在后文中会阐释;
  5. JWA:当前JWT所用到的密码学算法;
  6. nonsecure JWT:当头部的签名算法被设定为none的时候,该JWT是不安全的;因为签名的部分空缺,所有人都可以修改。

JWT的组成

一个通常你看到的jwt,由以下三部分组成,它们分别是:

  1. header:主要声明了JWT的签名算法;
  2. payload:主要承载了各种声明并传递明文数据;
  3. signture:拥有该部分的JWT被称为JWS,也就是签了名的JWS;没有该部分的JWT被称为nonsecure JWT也就是不安全的JWT,此时header中声明的签名算法为none。

三个部分用·分割。形如 xxxxx.yyyyy.zzzzz的样式。

JWT header

{
   
  "typ": "JWT",
  "alg": "none",
  "jti": "4f1g23a12aa"
}

jwt header 的组成

头通常由两部分组成:令牌的类型,即JWT,以及正在使用的散列算法,例如HMAC SHA256或RSA。

当然,还有两个可选的部分,一个是jti,也就是JWT ID,代表了正在使用JWT的编号,这个编号在对应服务端应当唯一。当然,jti也可以放在payload中。

另一个是cty,也就是content type。这个比较少见,当payload为任意数据的时候,这个头无需设置,但是当内容也带有jwt的时候。也就是嵌套JWT的时候,这个值必须设定为jwt。这种情况比较少见。

jwt header 的加密算法

加密的方式如下:

base64UrlEncode(header)
>> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQ

JWT payload

{
   
  "iss": "http://shaobaobaoer.cn",
  "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/",
  "jti": "4f1g23a12aa",
  "iat": 1534070547,
  "nbf": 1534070607,
  "exp": 1534074147,
  "uid": 1,
  "data": 
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值