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 进行验证即可, 不需要再去后台查数据库了.

    参考:

  • 相关阅读:
    [bzoj4241] 历史研究 (分块)
    [tyvj2054] 四叶草魔杖 (最小生成树 状压dp)
    20180710 考试记录
    [luogu2047 NOI2007] 社交网络 (floyed最短路)
    [luogu2081 NOI2012] 迷失游乐园 (树形期望dp 基环树)
    [luogu1600 noip2016] 天天爱跑步 (树上差分)
    [luogu2216 HAOI2007] 理想的正方形 (2dST表 or 单调队列)
    [poj 3539] Elevator (同余类bfs)
    [BZOJ1999] 树网的核 [数据加强版] (树的直径)
    bzoj2301 [HAOI2011]Problem b
  • 原文地址:https://www.cnblogs.com/magexi/p/11703144.html
Copyright © 2011-2022 走看看