欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对 JWT 的一些认识

程序员文章站 2024-03-07 19:44:57
...

JWT 全称 JSON Web Token,是一个设计规范,这个规范允许我们使用JWT在客户端和服务器之间传递安全可靠的信息。换句话说,服务器接收到JWT之后,可以验证它的合法性。

1. JWT 的组成

JWT本质上是一个字符串,一个完整的JWT由三部分组成,头部(header), 荷载(Payload), 和签名(Signature),中间用.隔开,如下是一个典型的JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

其中头部和荷载使用了base64编码,分别解码之后得到两个JSON串:

//头部
{
  "alg": "HS256",
  "typ": "JWT"
}

alg字段为加密算法。

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

荷载的字段及含义:

  • iss: 该JWT的签发者
  • sub: 该JWT所面向的用户
  • aud: 接收该JWT的一方
  • exp(expires): 什么时候过期,这里是一个Unix时间戳
  • iat(issued at): 在什么时候签发的

而第三部分签名则不能使用base64解码出来,该部分用于验证头部和荷载数据的完整性。

2. 如何生成 JWT

  1. 生成头部header
  2. 生成荷载payload
  3. 生成签名signature
    signature = encode(base64(header) + '.' + base64(payload), secret)
  4. JWT = header.payload.signatrue

注:encode是header.alg指定的加密算法;secret为**,需要妥善保存。

3. 如何验证一个 JWT 的合法性

在得到一个 JWT 串之后,如何验证它携带的信息是否可靠呢(假设该串为:header.payload.signatyre),我们只需要:

  1. base64 解码 header 得到加密算法 encode;
  2. 计算vercode = encode(header.payload, secret);
  3. 验证 vercode 和 signatyre 是否匹配

4. 应用

JWT可作为Token,用于单点登陆;相比普通的Token,它的优势在于服务器无需使用额外的存储空间来保存Token,因为使用生成JWT时的secret,就可以验证JWT的合法性。
JWT的安全性建立在加密方**的安全性之上。若服务端使用JWT作为Token来鉴别用户身份,而**泄漏的话,得到**的人便可以为任意用户生成合法的Token,进而冒充他们与服务端交互。