JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。它是一种用于双方之间传递安全信息的表述性声明规范。

JWT作为一个开放的标准(RFC 7519),定义了一种简洁的、自包含的方法,从而使通信双方实现以JSON对象的形式安全的传递信息。

可以看出JWT并不是一种只能权限验证的工具,而是一种标准化的数据传输规范。

How to work?

image

  1. 客户端向授权服务系统发起请求,申请获取“令牌”
  2. 授权服务根据用户身份,生成一张专属的“令牌”,并将该“令牌”以JWT规范返回给客户端
  3. 客户端将获取到的“令牌”放到http请求的headers中后,向主服务器系统发起请求。主服务系统收到请求后会从headers中获取“令牌”,并从“令牌”中解析出该用户的身份权限,然后做相应的处理(同意或拒绝返回资源)

可以看出,JWT授权服务是可以脱离我们的主服务系统而作为一个独立系统存在的

What is token?

JWT字符串

定义: 通过JWT规则加密后生成的字符串,三部分组成:Header,Payload,Signature。将这三部分由‘.’ 连接而组成的一长串加密字符串就成为JWT字符串。

有且仅有两个数据组成,一个是“alg”(加密规范)指定了该JWT字符串的加密规则,另一个是“typ”(JWT字符串类型)。

例如:

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

将这组JSON格式的数据通过Base64Url格式编码后,生成的字符串就是我们JWT字符串的第一部分。

Payload

由一组数据组成,它负责传输数据,我们可以添加一些已注册声明,比如“iss” (JWT字符串的颁发人名称),“exp” (该JWT字符串的过期时间),”sub” (身份),“aud” (受众),除了这些,我们还可以根据需要添自定义的需要传输数据,一般是发起请求的用户信息。例如:

{
  “iss”:"RayPI",
  "sub": "Client",
  "name": "张三",
  "uid": 1
}

将该JSON格式的数据通过Base64Url格式编码后,生成的字符串就是我们JWT字符串的第二部分。

Signature

数字签名,由4个因素同时决定:编码后的header字符串,编码后的payload字符串,之前在头部声明的加密算法,我们定义的密匙字符串(secret)。