Skip to content

jwt介绍

1. 什么是 JSON Web Token?

JSON Web 令牌 (JWT) 是一种开放标准 https://datatracker.ietf.org/doc/html/rfc7519[(RFC 7519)], 它定义了一种紧凑且独立的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。此信息可以验证和信任, 因为它是经过数字签名的。JWT 可以使用密钥(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。

2.JWT 结构

JWT固定各种的字符串,由三部分组成:

. Header,头部
. Payload,载荷
. Signature,签名

把这三部分使用点(.)连接起来,就是一个JWT字符串

Header,头部

header一般的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。

JWT里验证和签名使用的算法列表如下: image:image/11.png[]

json
{
  "alg": "HS256",
  "typ": "JWT"
}

Payload 载荷

payload主要用来包含声明(claims ),这个声明一般是关于实体(通常是用户)和其他数据的声明。

声明有三种类型:

registered
public
private

具体如下:

Registered claims : 这里有一组预定义的声明,它们不是强制的,但是推荐。

iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

Public claims : 可以随意定义

自定义数据:存放在token中存放的key-value值

Private claims : 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明

json
{
    "iss": "briup",
    "iat": 1446593502,
    "exp": 1446594722,
    "aud": "www.briup.com",
    "sub": "briup@briup.com",
    "username": "tom"
}

注意,不要在JWT的payload或header中放置敏感信息,除非它们是加密的

把头部和载荷分别进行Base64编码之后得到两个字符串,然后再将这两个编码后的字符串用英文句号.连接在一起(头部在前),形成新的字符串:aaa.bbb

Signature 签名

最后,将上面拼接完的字符串用HS256算法进行加密,在加密的时候,还需要提供一个密钥(secret)。 加密后的内容也是一个字符串,这个字符串就是签名。

把这个签名拼接在刚才的字符串后面就能得到完整的JWT字符串。 header部分和payload部分如果被篡改,由于篡改者不知道密钥是什么,也无法生成新的signature部分, 服务端也就无法通过。

在JWT中,消息体是透明的,使用签名可以保证消息不被篡改。
确保密钥不会泄露,否则会被篡改

例如,使用HMACSHA256加密算法,配合秘钥,将前俩部进行加密,生成签名

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

例如,将Header、Payload、Signature三部分使用点(.)连接起来

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

使用官网提供的工具,可以对该JWT进行验证和解析

版权声明