Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

README.md

1. JWT(JSON Web Token)

  • JWT 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准
  • JWT 的声明一般被用在身份提供者和服务者间传递被认证的用户身份信息,以便于从资源服务器获取资源,比如用在用户登录上。
  • 因为数字签名的存在,这些信息是可信的,JWT 可以使用 HMAC 算法或者是 RSA 的公私密钥进行签名

2. 主要应用场景

  • 身份认证在这种场景下,一旦用户完成了登录,在接下来的每个请求中包含 JWT ,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。
  • 信息交换在通信的双方之间使用 JWT 对数据进行编码时一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。

3. JWT 的结构,

  • Header 头部 {typ: 'JWT', alg: 'HS256'}
  • Payload 负载,需要的数据, {id: '用户id', name: '用户name'...}
  • Signature 签名,签名是一串字符串
  • 把 Header ,Payload 和 Signature 通过 Base64 进行编码

3.1 Header

  • 在 header 中通常包含两个部分,Token 类型和采用的加密算法
  • 使用 Base64 编码组成 JWT 结构的第一部分

3.2 Payload

  • 负载,就是存放有效信息的地方,有效信息分为三个部分,标准中注册的声明,公共的声明,私有的声明

3.2.1 标准中的注册的声明(不强制使用)

  • iss: JWT 签发者
  • sub: JWT 所面向的用户
  • aud: 接收 JWT 的一方
  • exp: JWT 的过期时间,这个过期时间必须要大于签发时间,以秒为单位
  • nbf: 定义在什么时间之前,给 JWT 是不可用的
  • iat: JWT 的签发时间

3.2.2 公共的声明

  • 公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但是不建议添加敏感信息,因为该部分信息在客户端可以解密

3.2.3 私有的声明

  • 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为 Base64 是对称解密的,意味着该部分信息可以归类为明文信息

3.2.4 负载使用的例子

  • {"sub": "123456789", "name": "mark", "admin": true}
  • 上述的负载需要经过 Base64Url 编码后作为 JWT 结构的第二部分

3.3 Signature

  • 创建签名需要使用编码后的 header 和 payload 以及一个秘钥
  • 使用 header 中指定签名算法进行签名
  • 例如如果希望使用 HMAC SHA256 算法,那么签名应该使用下列方式创建 HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret)
  • 签名用于验证信息的发送者以及消息都是没有经过篡改的
  • 完整的 JWT 格式的输出是以 . 分割的三段 Base64 编码
  • 秘钥 secret 是保存在服务端的,服务端会根据这个秘钥进行生成 token 的验证,所以需要保护好这个秘钥