JWT

JWT 介绍

JSON Web Token(JWT)是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519)。来自 JWT RFC 7519 标准化的摘要说明:JSON Web Token 是一种紧凑的,URL 安全的方式,表示要在双方之间传输的声明。JWT 一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 Token 也可直接被用于认证,也可被加密。

JWT 认证流程

  1. 客户端调用登录接口(或者获取 token 接口),传入用户名密码。
  2. 服务端请求身份认证中心,确认用户名密码正确。
  3. 服务端创建 JWT,返回给客户端。
  4. 客户端拿到 JWT,进行存储(可以存储在缓存中,也可以存储在数据库中,如果是浏览器,可以存储在 Cookie 中)在后续请求中,在 HTTP 请求头中加上 JWT。
  5. 服务端校验 JWT,校验通过后,返回相关资源和数据。

JWT 结构

JWT 是由三段信息构成的,第一段为头部(Header),第二段为载荷(Payload),第三段为签名(Signature)。每一段内容都是一个 JSON 对象,将每一段 JSON 对象采用 BASE64 编码,将编码后的内容用. 链接一起就构成了 JWT 字符串。如下:

header.payload.signature

1. 头部(Header)

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

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

在头部指明了签名算法是 HS256 算法。

2. 载荷(payload)

载荷就是存放有效信息的地方。有效信息包含三个部分:

  • 标准中注册的声明

  • 公共的声明

  • 私有的声明

标准中注册的声明(建议但不强制使用):

  • iss:JWT 签发者

  • sub:JWT 所面向的用户

  • aud:接收 JWT 的一方

  • exp:JWT 的过期时间,这个过期时间必须要大于签发时间

  • nbf:定义在什么时间之前,该 JWT 都是不可用的

  • iat:JWT 的签发时间

  • jti:JWT 的唯一身份标识,主要用来作为一次性 token, 从而回避重放攻击。

公共的声明 :

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息. 但不建议添加敏感信息,因为该部分在客户端可解密。

私有的声明 :

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为 base64 是对称解密的,意味着该部分信息可以归类为明文信息。

示例如下:

{ "iss": "Online JWT Builder",
"iat": 1416797419,
"exp": 1448333419,
"aud": "www.primeton.com",
"sub": "[email protected]",
"GivenName": "dragon",
"Surname": "wang",
"admin": true
}

3. 签名(signature)

创建签名需要使用 Base64 编码后的 header 和 payload 以及一个秘钥。将 base64 加密后的 header 和 base64 加密后的 payload 使用. 连接组成的字符串,通过 header 中声明的加密方式进行加盐 secret 组合加密,然后就构成了 jwt 的第三部分。

比如:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

JWT 的优点:

  1. 跨语言,JSON 的格式保证了跨语言的支撑
  2. 基于 Token,无状态
  3. 占用字节小,便于传输

关于 Token 注销:

Token 的注销,由于 Token 不存储在服务端,由客户端存储,当用户注销时,Token 的有效时间还没有到,还是有效的。所以如何在用户注销登录时让 Token 注销是一个要关注的点。一般有如下几种方式:

  1. Token 存储在 Cookie 中,这样客户端注销时,自然可以清空掉
  2. 注销时,将 Token 存放到分布式缓存中,每次校验 Token 时去检查下该 Token 是否已注销。不过这样也就失去了快速校验 Token 的优点。
  3. 多采用短期令牌,比如令牌有效期是 20 分钟,这样可以一定程度上降低注销后 Token 可用性的风险。

你可能感兴趣的:(JWT)