JWT格式

概念

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

特性

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

原理

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

Authorization: Bear 

其中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格式)