首页 > 其他分享 >JWT 规范

JWT 规范

时间:2022-08-27 15:35:17浏览次数:59  
标签:加密 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,声明
From: https://www.cnblogs.com/renzhsh/p/16630635.html

相关文章

  • 关于我在.net core6时JWT 出现错误:IDX10653
      IDX10653:Theencryptionalgorithm'System.String'requiresakeysizeofatleast'System.Int32'bits.Key'Microsoft.IdentityModel.Tokens.Symmetr......
  • .Net Core之JWT认证方案
    .NetCore提供了JWT的认证方案,开箱即用,我们再配合Redis启用黑名单机制,基本可以满足需求基本功能 开启JWT认证:publicvoidConfigureServices(IServiceCollectionserv......
  • 规范:前端代码规范(二)
    前端开发命名规范前端开发命名规范常见的不规范命名见名知义命名规则文件资源命名变量命名函数常量类的成员注释规范函数(方法)注释类的命名.html/.jsp......
  • 规范:前端代码规范一
    命名规范变量长度:变量名不要太长,尽量不超过5个单词,若太长可以使用单词缩写变量缩写:变量缩写可以采用两种缩写方案:1.使用单词前几个字母,能表述含义即可,控制在3-5个字母(具......
  • 规范:数据埋点集成使用说明
    1.获取和引入 TrackLogData SDK1.1.异步方式(推荐)引入场景:通常情况下使用。1.1.1.本地手动指定sdk版本(vue SPA项目)最新版本: //sa.a5.petrochina/stats/tld.glob......
  • 开发规范-DTO和VO
    DTO和VO的区别DTO是展示层和服务层之间传递数据的对象,为什么还需要一个VO呢?在绝大部分场景,DTO和VO的属性值是一致的,通常都是POJO,这只是实现方面的思维,但是在设计层......
  • JavaScript知识-简介、语言规范、语言基础
    目录JavaScript简介1.ECMAScript和JavaScript的关系2.JavaScript语言3.HTML、CSS、JavaScriptJavaScript基础之语言规范1.如何使用?2.注释3.结束符JavaScript语言基础1.Java......
  • restfulAPI接口规范/django rest_Framework_环境
    一.RESTFUlAPI设计1).域名应该将api部署在专用域名下https://www.baidu.com/api/2).版本应该将API版本号放到路径中https://www.baidu.com/api/1.0/loginhttps:......
  • 九,DRF JWT-RBAC
    一JWT认证在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用JsonWebToken(本质就是token)认证机制。Json......
  • 【数据库】在公司开发过程中总结的SQL编写规范,参考开发手册
    〇、概述1、常用资料链接(1)阿里巴巴开发手册链接:https://pan.baidu.com/s/1OtOFuItDIP7nchfODGIZwg?pwd=htx0 提取码:htx0 2、包含内容 一、开发手册内容(一)建表1......