zoukankan      html  css  js  c++  java
  • JWT(Json Web Token)

    JWT(Json Web Token) 的理解

    格式Header.Payload.Signature

    1. Header: JWT 元数据, Json 对象, Base64Url编码

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

      alg表示Signature使用的算法, typ表示令牌类型, JWT 统一写为JWT

    2. Payload: 有效载荷, 包含令牌实际要传输的内容, Json 对象, JWT 规定了 7 个官方字段可供选择(非必选), Base64Url编码

      1. iss(issuer): 签发人
      2. exp(expiration time): 过期时间
      3. sub(subject): 主题
      4. aud(audience): 受众
      5. nbf(Not Before): 生效时间
      6. iat(Issued At): 签发时间
      7. jti(JWT ID): 编号

      另外, 也可以自定义字段

    3. Signature: 签名, 字符串, 防止 JWT 被篡改
      使用Header中指定的算法, 如HS256表示HMAC SHA256算法, 再加上只有 JWT 签发方才知道的密钥secret, 对HeaderPayload进行签名, 计算公式如下:

      Signature = HMACSHA256((Base64UrlEncode(Header) + "." + Base64UrlEncode(Payload)), secret)
      

      这里面用到了Base64Url编码, 与Base64编码基本一样. 因为 JWT 可能会放到 URL 中, 所以前者中不能出现 +, /= 这 3 个字符. 所以要被替换掉: = 被省略, + 替换成 -, / 替换成 _.
      计算出签名后, 按照上面给出的格式将这三个部分拼接成字符串即可.

    注意:

    • Payload仅仅是对 Json 字符串进行Base64Url编码, 所以其内容相当于是明文. 因此, 严禁在Payload中传输敏感内容(比如说密码), 如果要通过 JWT 传输敏感内容, 应该对Payload单独进行加密处理.

    • Signature用来确保 JWT 没有被篡改, HeaderPayload相当于是明文, 但是计算签名的过程中加入了密钥secret, 只有签发者知道, 所以签发者只要用拿到的 JWT 再计算一次签名, 如果得到的结果与收到的 JWT 中的Signature不一致, 就说明 JWT 被篡改了.

    • JWT 只是作为令牌使用, 证明身份的临时工具(证明你是你)
      拿接口调用来举例: 调用方第一次调用接口, 传输username(全局唯一)和password, 提供方查询数据库验证身份之后, 用username生成了一个 JWT 还给调用方.
      调用方第二次调用其他接口时, 只需要把 JWT 给提供方, 提供方对 JWT 进行验证即可, 不需要再去后台查数据库了.

    参考:

  • 相关阅读:
    hihocoder 1049 后序遍历
    hihocoder 1310 岛屿
    Leetcode 63. Unique Paths II
    Leetcode 62. Unique Paths
    Leetcode 70. Climbing Stairs
    poj 3544 Journey with Pigs
    Leetcode 338. Counting Bits
    Leetcode 136. Single Number
    Leetcode 342. Power of Four
    Leetcode 299. Bulls and Cows
  • 原文地址:https://www.cnblogs.com/magexi/p/11703144.html
Copyright © 2011-2022 走看看