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。
    image

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

posted @ 2022-06-20 17:00  MikiKawai  阅读(74)  评论(0编辑  收藏  举报