JWT简介

  • 标签: JWT
  • 发表时间:2020年05月30日
  • 作者:hhao
  • 浏览次数:146

什么是JWT?


JWT是json web token 的缩写,是一种用于通信双方之间以JSON对象形式传递安全信息的简洁的、URL安全的开放标准([RFC 7519 (https://tools.ietf.org/html/rfc7519))。

JWT的应用场景


  • 认证鉴权(Authentication): 这是JWT最常用的场景,一旦用户成功登入,在随后的每次请求中都将会包含JWT信息。 通过JWT的验证机制后,将允许该用户访问路由(routes)、服务(services)以及该Token所允许的资源。由于JWT的开销非常小, 使得其可以轻松的在不同的域名中传递,所以目前在单点登录(Single Sign On)中有比较广泛的应用。

  • 数据交换(Information Exchange): SON Web Tokens是一种很好的安全传输方式,因为JWTs是可签名的- 例如基于使用公钥/私钥对,你可以确保请求的发送者是可信的。另外,因为参与签名是是头部信息(header)和负载信息(payload), 您可以可以验证内容是否被篡改。

JWT的结构


JWT由一下三个部分组成:

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

每个部分之间使用" . "隔开。 如下所示:

xxxxx.yyyyy.zzzzz

Header(头部) header是一个json对象,存放JWT的元数据,如token使用的加密算法(HMAC SHA256或者RSA)和token的类型。

例:

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

然后将上面的json对象使用Base64Url转成字符串组成第一部分结构信息。

Payload(负载)

Payload部分也是一个json对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

除了官方字段还可以定义一些私有字段。

例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。

然后把这个json对象经过 Base64Url 编码来组成JWT的第二部分结构信息。

Signature(签名) Signature 部分是对前两部分的签名,防止数据篡改。需要使用经过编码后的头部(header)和负载(payload)以及一个密钥,使用在头部(header)中指定的算法进行签名。

如果说你希望使用 HMAC SHA256 algorithm进行签名,那么签名将会如下所示方式进行创建:

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

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。 encodedjwt3.png

JWT是如何工作的?

传统的方法中,当用户使用账户密码登录成功时在传统的方法中服务端会创建一个session并保存用户信息,然后服务端返回一个与之对应的cookie用来记录用户的状态。 而使用JWT时只需要将令牌会返回给客户端,客户端将JWT保存在本地 (通常是保存在local storage, 不过也可以使用cookies来进行存储),服务端无需存储。

当用户想要访问一个受保护的路由或者资源,用户都应该在请求中发送JWT,通常是在请求头(Request Header)的 Authorizationheader信息中使用Bearer的模式,如下所示:

Authorization: Bearer <token>

用户的状态在服务端的内存中是不会被存储的,所以这是一种无状态的身份验证机制。

服务端受保护的路由将Authorization header 中的JWT信息取出Header和Payload内容进行签名,生成Signature与之对比校验,如果校验合法,用户将会被允许访问受保护的资源。

由于JWT是自包含的,所有必要的基础信息都在JWT中,这样就避免了多次 对数据库的查询操作。

JWT的这些特性,使得开发者可以完全依赖无状态的数据API,甚至向下游服务提交请求。因为它的实现并不基于cookie,所以是哪个域名提供 的API服务就变得无关紧要,因此跨域资源共享(CORS)不会成为应用中的问题。

参考:JSON Web Tokens

上一篇:Session和Cookie
评论