ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JWT 规范

2022-08-27 15:31:13  阅读:328  来源: 互联网

标签:加密 JWT base64 jwt 规范 secret 声明


JWT:Json Web Token,是基于Json的一个公开规范(RFC 7519),这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

两大使用场景:认证数据交换

JWT由三部分组成,它们之间用圆点(.)连接。这三部分分别是:

  • Header 头部
  • Payload 载荷
  • Signature 签名

就像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

1. Header

jwt的头部承载两部分信息:

  • 声明类型,这里是jwt
  • 声明加密的算法 通常直接使用 HMAC SHA256

完整的头部就像下面这样的JSON:

{
  'typ': 'JWT',
  'alg': 'HS256'
}

然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

2. Payload

载荷就是存放有效信息的地方。这些有效信息包含三个部分:

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明

标准声明

  • iss(Issuer): jwt签发者。一般为授权服务器的Url。

  • sub(Subject): 用户信息,一般为用户姓名。

  • aud(Audience): 接收jwt的一方,一般为特定的App、服务或模块。

  • exp(Expiration Time): jwt的过期时间,这个过期时间必须要大于签发时间

  • nbf(Not Before): 定义在什么时间之前,该jwt都是不可用的.

  • iat(Issued At): jwt的签发时间

  • jti(JWT ID): jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

例如:John访问购票网站12306,使用微信扫码登录而不是直接输入12306网站的账号密码。那么微信颁发给12306的JWT就会包含以下信息:

{
    "iss":"open.weixin.qq.com",
    "aud":"www.12306.cn",
    "sub":"John"
}

公共声明

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。但不建议添加敏感信息,因为该部分在客户端可解密.

私有声明

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

定义一个payload:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

然后将其进行base64加密,得到Jwt的第二部分。

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

3. Signature

jwt的第三部分是一个签名,这个签名内容由三部分组成:

  • header (base64后的)
  • payload (base64后的)
  • secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);

var signature = HMACSHA256(encodedString, 'secret');

将这三部分用.连接成一个完整的字符串,构成了最终的jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。

参考

RFC7519

JWT 在线解析

标签:加密,JWT,base64,jwt,规范,secret,声明
来源: https://www.cnblogs.com/renzhsh/p/16630635.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有