一文看懂JWT (JSON Web Token)

2023/12/27·2 views

介绍

JSON Web Token(JWT)是一种紧凑的声明表示格式,旨在用于空间受限的环境,例如HTTP授权头和URI查询参数。JWT将声明编码为JSON [RFC7159] 对象,该对象用作JSON Web Signature(JWS)[JWS]结构的有效负载或JSON Web Encryption(JWE)[JWE]结构的明文,从而使得声明可以通过数字签名或使用消息认证码(MAC)进行完整性保护和/或加密。JWT始终使用JWS紧凑序列化或JWE紧凑序列化表示。

JWT的建议发音与英语单词 "jot" 相同。

  • 术语 "JSON Web Signature (JWS)"、"Base64url Encoding"、"Header Parameter"、"JOSE Header"、"JWS Compact Serialization"、"JWS Payload"、"JWS Signature" 和 "Unsecured JWS" 由JWS规范[JWS]定义。

  • 术语 "JSON Web Encryption (JWE)"、"Content Encryption Key (CEK)"、"JWE Compact Serialization"、"JWE Encrypted Key" 和 "JWE Initialization Vector" 由JWE规范[JWE]定义。

1.00

JWT可以解决什么问题?

  • 集群数据共享

  • 跨域认证

  • 认证 Authentication

  • 授权 Authorization

  • 联合识别

  • 客户端会话(无状态的会话)

  • 客户端机密

名词解释

  • JWS:Signed JWT签名过的jwt

  • JWE:Encrypted JWT部分payload经过加密的jwt;目前加密payload的操作不是很普及;

  • JWK:JWT的密钥,也就是我们常说的 scret;

  • JWKset:JWT key set在非对称加密中,需要的是密钥对而非单独的密钥,在后文中会阐释;

  • JWA:当前JWT所用到的密码学算法;

  • nonsecure JWT:当头部的签名算法被设定为none的时候,该JWT是不安全的;因为签名的部分空缺,所有人都可以修改。

JWT原理

服务器认证之后生成一个JSON对象,对象中包含描述用户的标识,用户与服务端通信的时候需要携带这些数据,用来识别用户身份。服务器变为无状态,比较容易实现扩展。

JWT数据结构


JWT包含三部分

  • Header(头部)

  • Payload(负载)

  • Signature(签名)没有该部分的JWT被称为nonsecure JWT也就是不安全的JWT,此时header中声明的签名算法为none

这三部分通过.进行分割,如下

复制代码
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

其中HeaderPayload都是json对象通过Base64URL算法编码后的字符串,我们可以直接将其解码

Header中包含alg和typ,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。

json 复制代码
{
  "alg": "HS256",
  "typ": "JWT"
}

Payload 用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

  • iss (Issuer):签发人

  • exp (Expiration Time):过期时间

  • sub (Subject):主题

  • aud (Audience):受众

  • nbf (Not Before):生效时间

  • iat (Issued At):签发时间

  • jti (JWT ID):编号

此外你可以向其中添加素有字段,例如下面的name

json 复制代码
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

从上面可以看出JWT不是加密的,只要拿到该字符串,就可能读取到数据,所以不要将私密信息放在里面。

Signature 是前两部分的签名,用来防止数据被篡改

复制代码
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

JWT的特征

  1. JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
  2. JWT 不加密的情况下,不能将秘密数据写入 JWT。
  3. JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
  4. JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
  5. JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
  6. 为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

参考链接

JSON Web Token入门教程 - 阮一峰

JSON Web Tokens

RFC 7519: JSON Web Token (JWT)

一篇文章带你分清楚JWT,JWS与JWE - 简书