JSON Web Token详解

JWT几乎出现在所有现代登录和API中。本指南介绍它的结构、如何读取以及如何安全使用。

打开工具: JWT解码器

三个部分

JWT的形式是xxxxx.yyyyy.zzzzz。第一部分是头部,一个包含算法(alg)和类型(typ)的JSON对象;第二部分是包含声明的载荷;第三部分是用密钥或私钥对前两部分计算出的签名。每部分都经过Base64url编码,可安全用于URL和HTTP头。

注册声明

  • iss(签发者):创建并签名令牌的一方。
  • sub(主题):令牌所指的用户或服务。
  • aud(受众):应当接受令牌的应用。
  • exp(过期时间):令牌失效的时间。
  • nbf(生效时间):令牌开始有效的时间。
  • iat(签发时间):令牌创建的时间。
  • jti(JWT ID):用于防止重放的唯一ID。

访问令牌与ID令牌

在OpenID Connect中,ID令牌告诉客户端应用是谁登录了,并包含姓名、邮箱等资料声明。访问令牌发送给API,用来证明调用方被允许做什么,通常带有scope声明。访问令牌应当短期有效,一般为几分钟到一小时,并通过刷新令牌续期。

需要避免的错误

  • 只解码不验证就信任令牌中的声明。
  • 接受令牌中声明的算法,而不是服务器预期的算法。
  • 使用短小、易猜的HMAC密钥,应至少使用32字节的随机值。
  • 在载荷中存放敏感数据。
  • 签发永不过期的令牌或有效期很长的访问令牌。