0
点赞
收藏
分享

微信扫一扫

JWT(JSON Web Token)简介

仲秋花似锦 2022-01-11 阅读 97

注:本文大体上是对JWT官方文档介绍(https://jwt.io/introduction)的简化翻译,并加入了一些自己的理解。

JWT的定义

应用场景

  • 授权(Authorization):这是JWT最常用的场景。当用户成功登录(log in)之后,后续的每个request里都包含JWT token,以便访问server所提供的服务,资源等。
  • 交换信息:JWT本身是一种安全传输信息的方式,因为JWT包含了数字签名。此外,由于JWT是用其本身的header和payload来签名的,这就保证了这些内容不会被篡改。

JWT的结构

JWT token一般由3部分组成,各个部分之间以 . 分隔:

  • Header
  • Payload
  • Signature

例如: xxxxx.yyyyy.zzzzz

Header

Header通常由类型( typ )和算法( alg )2部分组成,例如:

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

该JSON数据经过 Base64Url 编码后,组成了JWT的 Header

Payload

Payload由一些声明( claim )组成。这些声明包括:

  • Registered claims:例如 iss (issuer), exp (expiration time), sub (subject)等
  • Public claims:
  • Private claims

例如:

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

该JSON数据经过 Base64Url 编码后,组成了JWT的 Payload

注:尽管这些信息有数字签名以确保其不会被篡改,但它们可能会被任何人读取(注意encoding并不是加密)。因此,不要在Header和Payload里放置任何敏感数据(除非经过加密,比如https)。

Signature

也就是把 <encoded header>.<encoded payload> ,和一个 secret ,以Header中所指定的算法,生成数字签名。例如:

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

如上文所述,该数字签名一来用来验证身份,二来可确保Header和Payload没有被篡改。

最终生成的JWT token,是一个由2个 . 所分隔的Base64-URL字符串,例如:

在这里插入图片描述

JWT的使用

当用户使用credentials成功登录之后,server会生成JWT token并返回给用户。用户后续的request里会包含该JWT token,通常是放在HTTP request的 Authorization Header里面,并冠以 Bearer schema,例如:

Authorization: Bearer <token>

Server收到request后,会去检查并验证该JWT token,如果验证成功,就会允许request访问所请求的资源。此外,由于JWT本身可以包含一些信息,这就有可能减少一些DB的查询(比如上面例子中的 nameadmin 身份的信息)。

试一试

有一些在线网站,可以验证和decode JWT token。比如JWT官网:

https://jwt.io/#debugger-io

参考

  • https://jwt.io/introduction
举报

相关推荐

0 条评论