概念
全称: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
内容应固定包含以下信息
-
iss (issuer)
发行人信息,即整个token
的发行者。 -
exp (expiration time)
token
的过期时间(时间戳)。 -
sub (subject)
当前主体信息,该值必须是全局唯一。 -
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)
网友评论