• JWT


    JWT

    • JWT(json web token)作为一个开放的标准,通过紧凑(compact)或者包含(self-contained)的方式,定义用于在各方之间发送的安全 josn对象。

    • JWT 可以很好的充当访问令牌和刷新令牌的载体,这时 web双方之间进行安全传输信息的良好方式。只有授权服务器持有签发和验证 JWT的密钥那么就只有授权服务器能验证 JWT的有效以及发送带有签名的 JWT,这就唯一保证了 JWT 载体的令牌的有效和安全性。

    • JWT的一般格式如下所示

      eyJhbGciOiJIUzI1NiisinR5cCI6IkpXVCJ9
      .eyJuYW11joiY2FuZyB3dSisimV4cCI6MTUxODA1MTElNywdXNlcklkijoMTizNDU2In0 
      .IV4XZOy0nMpmMX9orv0gqsEMOxXXNQOE680CKkkPQcs
      

      image

    • 它由三部分组成,每部分通过 . 分隔开,分别是
      Header(头部)
      Payload(有效负荷)
      Signature(签名)

    1. 头部(Header)

    • 通常由两部分组成
      • typ:类型,一般为 JWT
      • alg:加密算法,通常是 HMAC,SHA256,RSA
      {
          "alg":"hs256",
          "typ":"jwt"
      }
      
    • 这部分 json会由 Base64Url编码,构成 JWT的第一部分
      eyJhbGciOJIUzI1N i isinR5cCI6IkpXVCJ9

    2. 有效负荷(Payload)

    • 是 JWT的第二部分,是用来携带有效信息的载体,主要是关于用户实体和附加元素的声明,组成如下
      • Registered claims(注册声明)。这是一组预定的声明,但并不强制要求。他提供了一套有用的,能共同使用的声明。主要由 iss(JWT 签发者),exp(JWT 过期时间),sub(JWT 面向的用户),aud(接受 JWT的一方)等。
      • Public claims(公开声明)。公开声明中可以添加任何信息,一般是用户信息或者业务拓展信息等。
      • Private claims(私有声明)。由 JWT 提供者和消费者共同定义的声明,既不属于注册声明也不属于公开声明。
    • 一般不建议在 Payload中添加任何敏感信息,因为 Base64是对称解密的,这意味着 Payload中的信息是可见的。
      {
          "name":"cang wu",
          "exp":"1232323",
          "userId":"123456"
      }
      
    • 这部分 JSON会由 Base64编码,构成 JWT的第二部分,
      eyJuYW11IjoiY2FuZyB3dSisimV4cCI6MTUxODA1MTE1NywidXNlcklkijoiMTizNDU2In0

    3. 签名(Signature)

    • 要创建签名,需要编码后的头部,编码后的 Payload,一个密钥,最后通过在头部 alg键值定义加密算法加密生成签名,生成签名的伪代码如下
      HMACSHA256(
          base64Encode(header) + "." +
          base64Encode(payload) ,
          secret
      )
      
    • 上述代码中用到的加密算法为 HMACSHA256。密钥保存在服务端用于验证 JWT以及签发 JWT,所以必须由服务端持有,不该泄露出去。
      IV4XZ0y0nMpmMX9orv0gqsEMOxXXNQOE680CKkkPQcs
    • 这将称为 JWT的第三部分。这三部分通过 “.”分隔,组成最终的 JWT。

    https://jwt.io/
    https://www.baeldung.com/spring-security-oauth-revoke-tokens
    https://www.cnblogs.com/better-farther-world2099/p/9146143.html

  • 相关阅读:
    Delphi 窗体失踪在最上面的代码
    Delphi 目前使用delay函数功能
    Delphi Delay 延时计数的功能。 下面的方法都是思路,但是没有用在项目上
    Delphi 通过SQLite3, SQLiteTable3 操作数据库
    解决sqlite删除数据后,文件大小不变问题 转载
    delphi执行cmd命令和bat文件
    Delphi 获取sqlite中所有的表名
    delphi 获取USB口拔出和插入的状态
    深度揭密轮播插件核心代码的实现过程
    flowJS源码个人分析
  • 原文地址:https://www.cnblogs.com/zk2020/p/16393879.html
Copyright © 2020-2023  润新知