美文网首页
jwt身份认证

jwt身份认证

作者: wuqingfeng | 来源:发表于2022-10-25 19:30 被阅读0次

    JWT(JSON Web Tokens) 是一个开放的标准(RFC 7519)定义的一种简洁的、自包含的方法,用于通信双方之间以 Json 对象的形式安全的传递信息。

    1 JWT结构

    JWT由header、payload、signature三部分组成。


    850498-20200320133305475-1970269555.jpg

    对它们更详细的描述如下:

    1.1 header

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

    • 声明类型,固定为 jwt
    • 声明签名算法,通常为 HMAC SHA256
      完整的头部就像下面这样的JSON:
    {
        "typ": "JWT",
        "alg": "HS256"
    }
    

    然后将头部进行 base64 编码,构成了第一部分。

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
    

    1.2 payload

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

    • 标准中注册的声明(Reserved claims)
      这些 claim 是 JWT 预先定义的,在 JWT 中并不会强制使用它们,而是推荐使用
    iss:jwt签发者
    sub:jwt所面向的用户
    aud:接收 jwt 的一方
    exp:jwt的过期时间,这个过期时间必须要大于签发时间
    nbf:定义在什么时间之前,该jwt都是不可用的.
    iat:jwt 的签发时间
    jti:jwt 的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
    
    • 公共的声明
      公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。但不建议添加敏感信息,因为该部分在客户端可解密。
    • 私有的声明
      私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为 base64 是编码方式,有对应的解码方式,意味着该部分信息可以归类为明文信息。
      定义一个 payload:
    {
        "sub": "1234567890",
        "name": "John Doe",
        "admin": true
    }
    

    然后将其进行 base64 编码,得到 Jwt 的第二部分:

    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
    

    1.3 signature

    创建签名需要使用编码后的 header 和 payload 以及一个秘钥,使用 header 中指定签名算法进行签名。例如如果希望使用 HMAC SHA256 算法,那么签名应该使用下列方式创建:

    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)
    

    secret 是保存在服务器端的,jwt 的签发生成也是在服务器端的,secret 就是用来进行 jwt 的签发和 jwt 的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个 secret, 那就意味着客户端是可以自我签发和验证 jwt 了。
    碰到 JWT token 可以去 JWT 官网解密看看,下面这是官网解密出来的数据,可以很清楚的看到它的三部分内容:

    碰到 JWT token 可以去 JWT 官网解密看看,下面这是官网解密出来的数据,可以很清楚的看到它的三部分内容:


    image.png

    2. JWT使用

    JWT在实际应用流程如下:


    850498-20200320133306091-1592499456.jpg

    其中,因为JWT加密算法如HMAC为信息摘要算法,所以第5步check jwt signature的过程应当为重新计算signature并比对的过程。

    相关文章

      网友评论

          本文标题:jwt身份认证

          本文链接:https://www.haomeiwen.com/subject/ghjozrtx.html