JWT 简介

2020-02-15 22:46:30

简介

JSON Web Token是一种轻量级的认证规范,用户端提供身份信息,由服务端进行验证,通过后生成对应的 token 返回给客户端,客户端再次访问时附带这个 token ,服务器可以解码获得这个用户的用户信息,以此来认证。因为这个 token 采用多种加密方式,可以比较安全的解决认证过程。

应用场景

  1. 一次性验证:在分布式系统中需要临时的短期访问请求,可以通过分发token的方式来分发授权;
  2. 无状态验证:在 rest-ful api 接口中使用 token ,可以省去状态管理的工作;
  3. 分布式环境:在多机环境下,多个服务间的认证用 jwt 可以大大简化认证工作,可以解决 session 共享问题;

组成

一个 token 由Header(头部)、Payload(负载)、Signature(签名)三部分组成,格式为Header.Payload.Signature。

Header

头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。
例如:

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

Payload

JWT的第二部分是payload,其中包含claims。claims是关于实体(常用的是用户信息)和其他数据的声明,claims有三种类型: registered, public, and private claims。
Registered claims: 这些是一组预定义的claims,非强制性的,但是推荐使用, iss(发行人), exp(到期时间), sub(主题), aud(观众)等;
Public claims: 自定义claims,注意不要和JWT注册表中属性冲突,这里可以查看JWT注册表
Private claims: v 这些是自定义的claims,用于在同意使用这些claims的各方之间共享信息,它们既不是Registered claims,也不是Public claims。
以下是payload示例:

{
  "sub": "1234567890",
  "name": "jone",
  "admin": true
}

Signature

要创建签名部分,必须采用编码的Header,编码的Payload,秘钥,Header中指定的算法,并对其进行签名。
例如,如果要使用HMAC SHA256算法,将按以下方式创建签名:

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

签名用于验证消息在此过程中未被篡改,并且,在使用私钥签名令牌的情况下,它还可以验证JWT的请求方是否是它所声明的请求方。
输出是三个由点分隔的Base64-URL字符串,可以在HTML和HTTP环境中轻松传递,与SAML等基于XML的标准相比更加紧凑。
例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Copyright tg-blog 京ICP备15066502号-2