介绍

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。该token被设计为紧凑且安全的,
特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,
也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

JWT是一个轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。规范的细节参考JWT规范

场景

(1) 权限认证:这是JWT使用最常见的地方,用户一旦登录,就会获得一个JWT,这个JWT使得用户有权限访问后续的路径或者服务。
由于其容量小和易于跨域的特点,因此JWT广泛应用在分布式单点登录中。
(2) 信息交换:JWT是不同服务之间信息交换和好的一种方式。因为它可以使用键值对来标记,所以接收方可以确定发送方的身份。
此外,JWT的signature的通过head和payload计算出来的,所以可以保证传递的信息
内容不会被篡改。

结构

一个JWT实际上就是一个字符串,看起来大概是这样的:

  1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
  2. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
  3. SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT是一段被base64url编码过的字符序列(去除了尾部的“=”),并用点号分隔。它由三部分组成,头部(Header)、载荷(Payload)与签名(Signature)。

Header

Header 包含了一些元数据,至少会表明 token 类型以及 签名方法。比如:

  1. {
  2. "typ" : "JWT",
  3. "alg" : "HS256"
  4. }

type: 必需。token 类型,JWT 表示是 JSON Web Token. alg: 必需。token 所使用的签名算法,可用的值在这里有规定。

Payload

Payload部分包含了一些跟这个 token 有关的重要信息。 JWT 标准规定了一些字段,节选一些:

  • iss: The issuer of the token,token 是给谁的
  • sub: The subject of the token,token 主题
  • exp: Expiration Time。 token 过期时间,Unix 时间戳格式
  • iat: Issued At。 token 创建时间, Unix 时间戳格式
  • jti: JWT ID。针对当前 token 的唯一标识

除了规定的字段外,可以包含其他任何 JSON 兼容的字段。
Payload 示例:

  1. {
  2. "iss": "example.com",
  3. "exp": 1435055117,
  4. "user_id": 1,
  5. "foo": "bar"
  6. }

Payload加密后是安全可信的,所以我们可以将JWT设计为自说明、无状态的!

Signature

签名主要用于验证 token 是否有效,是否被篡改。 签名时可以加密算法进行签名,比如 HMAC SHA-256:

  1. content = base64url_encode(Header) + '.' + base64url_encode(Payload)
  2. signature = hmacsha256.hash(content)

默认情况下Payload的内容并没有被加密,可以通过 base64url_decode(text) 的方式解码得到.如果要包含敏感信息的话,记得先将 Payload 的内容进行加密.

可以使用http://jwt.io来调试

安全性

上边说到默认情况下Payload的内容并没有被加密,所以你如果有加密需求,请使用pycrypto或是cryptography来加密。jwt的签名目的不是加密而是防止篡改.

原理

参考资料