JWT格式

作者: 新签名 | 来源:发表于2019-10-06 13:29 被阅读0次

    概念

    全称:JSON Web Token。 一种浏览器与服务器之间的一种身份认证机制。

    特性

    • 安全:签名token,无法伪造。
    • 无状态:不依赖服务端,不用维持会话。

    原理

    采用原始的token机制,放在HTTP请求的header中,header格式:

    Authorization: Bear <token>
    

    其中token.分割的三部分组成:

    header.payload.signature
    
    header

    该部分存放token的加密方式、类型等内容。

    如:

    {
        "alg":"HS256",
        "type":"JWT"
    }
    
    • alg签名算法。如:HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384、ES512、PS256、PS384

    HS开头的是HMAC-SHAX。是利用HAMC对SHA摘要算法进行加盐(秘钥)哈希。
    其他三个均是利用非对称算法加密进行签名,再对结果进行摘要得出的结果。

    JWS 算法名称 描述
    HS256 HMAC256 HMAC with SHA-256
    HS384 HMAC384 HMAC with SHA-384
    HS512 HMAC512 HMAC with SHA-512
    RS256 RSA256 RSASSA-PKCS1-v1_5 with SHA-256
    RS384 RSA384 RSASSA-PKCS1-v1_5 with SHA-384
    RS512 RSA512 RSASSA-PKCS1-v1_5 with SHA-512
    ES256 ECDSA256 ECDSA with curve P-256 and SHA-256
    ES384 ECDSA384 ECDSA with curve P-384 and SHA-384
    ES512 ECDSA512 ECDSA with curve P-521 and SHA-512
    PS256 RSAPSSSA256 RSAPSS with SHA-256
    PS384 RSAPSSSA384 RSAPSS with SHA-384
    • type: 本次对话认证格式,如:JWT

    通过对该json字符串进行BASE64压缩就得到了header部分。

    payload

    该部分是有关实体(通常是用户)的声明。
    如:

    {
      "uid": "1234567890",
      "name": "John Doe",
      "admin": true
    }
    

    对该json字符串进行BASE64压缩就得到了第二部分。从这里可以看出payload完全是明文暴露的,请不要放置一些重要信息。

    声明主体信息格式有三种类型: registered, public, private

    • Registered claims: 预定义的声明,预定义声明的json内容应固定包含以下信息
    1. iss (issuer) 发行人信息,即整个token的发行者。
    2. exp (expiration time) token的过期时间(时间戳)。
    3. sub (subject) 当前主体信息,该值必须是全局唯一。
    4. aud (audience) 受众群体,即该token能被谁处理,用于多个token处理方的场景,若处理方只有一个,此值可以非必填。

    请注意,声明的名称仅是三个字符,因为JWT是紧凑的。

    如:

    {
      "iss": "abc company",
      "exp": 1570336171902,
      "sub": "eb34cc5a-6d4a-401a-9e4e-eec216bb56a7"
    }
    

    如果存在token发行方和处理方不一致或有多个处理方的应用场景时,可以借鉴该声明。

    • Public claims:可以随意定义主体JSON的声明。但是为了避免歧义,还是推荐从这里找到已经定义好的声明。

    • Private claims: 纯私有声明,不存在任何约束。内容不是Registered claims或者Public claims中的元素, payload开始部分给出的例子应属于私有。

    signature

    该部分是签名,以token的前两部分作为明文,用共同协商好的秘钥进行签名。

    如:用的第一部分选择的算法是HMAC-SHA256,执行以下操作得出签名值

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

    若是非对称秘钥,比如:RSAPSS-SHA256,执行以下操作得出签名值

    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), publicKey, privateKey)
    

    相关文章

      网友评论

          本文标题:JWT格式

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