JWT详解

JWT详解

JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。
JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。

JWT组成部分

屏幕截图 2023-07-16 210351.png
JWT 本质上就是一组字串,通过(.)切分成三个为 Base64 编码的部分:

  • Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型
  • Payload : 用来存放实际需要传递的数据
  • Signature(签名):服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成的

JWT通常格式:xxxxx.yyyyy.zzzzz
JWT在线解密工具:https://www.lddgo.net/encrypt/jwt-decrypt

Header

Header通常由两个部分组成

  • typ(Type):令牌类型,也就是JWT
  • alg( Algorithm):签名算法,比如HS256

示例

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

Payload 也是 JSON 格式数据,其中包含了 Claims(声明,包含 JWT 的相关信息)。
Claims 分为三种类型:

  • iss(issuer):JWT签发方
  • iat(issued at time):JWT签发时间
  • sub(subject):JWT主题
  • aud(audience):JWT接收方
  • exp(expiration time):JWT过期时间
  • nbf(not before time):JWT生效时间,早于该定义的时间的JWT不能被接受处理
  • jti(JWT ID):JWT唯一标识
{
  "uid": "ff1212f5-d8d1-4496-bf41-d2dda73de19a",
  "sub": "1234567890",
  "name": "John Doe",
  "exp": 15323232,
  "iat": 1516239022,
  "scope": ["admin", "user"]
}

Payload 部分默认是不加密的,一定不要将隐私信息存放在 Payload 当中!!!

Signature

Signature 部分是对前两部分的签名,作用是防止 JWT(主要是 payload) 被篡改
这个签名的生成需要用到:

  • Header + Payload
  • 存放在服务端的密钥(一定不要泄露出去)
  • 签名算法

签名算法的公式:

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

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,这个字符串就是 JWT

JWT身份验证过程

在基于 JWT 进行身份验证的的应用程序中,服务器通过 Payload、Header 和 Secret(密钥)创建 JWT 并将 JWT 发送给客户端。客户端接收到 JWT 之后,会将其保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌
屏幕截图 2023-07-16 210351.png
简化后的步骤如下:

  1. 用户向服务器发送用户名、密码以及验证码用于登陆系统。
  2. 如果用户用户名、密码以及验证码校验正确的话,服务端会返回已经签名的 Token,也就是 JWT
  3. 用户以后每次向后端发请求都在 Header 中带上这个 JWT
  4. 服务端检查 JWT 并从中获取用户相关信息

两点建议:

  1. 建议将 JWT 存放在 localStorage 中,放在 Cookie 中会有 CSRF 风险
  2. 请求服务端并携带 JWT 的常见做法是将其放在 HTTP Header 的 Authorization 字段中(Authorization: Bearer Token)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值