HOME/Articles/

JWT

Article Outline

JWT(Json Web Token)是目前最流行的跨域认证解决方案。

其是为了在网络应用环境间传递声明而执行的一种基于Json的开发标准(RFC 7519)。

该token被设计位紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。

JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,便于从资源服务器获取资源,也可增加额外的业务信息参数。

该token可直接用于认证,也可被加密。

JWT构成

JWT是由 头部(header)、 载荷(payload)、 签证(signature) 三段信息构成的。将三段信息文本用 . 连接起来就构成了JWT字符串。

例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT的头部承载两部分信息

  • 声明类型: JWT
  • 声明加密算法:通常直接使用 HMAC SHA256

例:

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

将header进行base64加密,构成第一段信息文本

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

payload

载荷即存放有效信息的位置。有效信息包含三个部分:

标准中注册的声明(建议但不强制使用)

  • iss: JWT签发者
  • sub: JWT所面向的用户
  • aud: 接收JWT的一方
  • exp: JWT的过期时间,且必须大于签发时间
  • nbf: 定义最早可用时间。即在何时前,该JWT都是不可用的
  • iat: JWT的签发时间
  • jti: JWT的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

公共的声明

可以添加任何信息,由于这部分在客户端可解密因此不建议添加敏感信息

私有的声明

私有声明是提供者和消费者共同定义的声明。base64是对称解密的,因此不建议存放敏感信息

例:

{
    "sub": '123456',
    "name": 'Bob',
    "admin": true
}

将header进行base64加密,构成第一段信息文本

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

signature

签证信息,这个签证信息由三部分组成:

  • header(base64加密)
  • payload(base64加密)
  • secret 用 . 连接前两个部分构成字符串,通过header中声明的加密方式进行加盐secret组合加密,最终组成signature

例:

// signature: TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

String encodedString = base64Encode(header) + "." + base64Encode(payload);
String signature = HMACSHA256(encodedString, "secret"); 

注:secret与JWT的签发生成都是保存在服务端的,secret是服务器的私钥,用于进行JWT的签发与验证,不得外泄!

将header, payload, signature三个部分拼接组成最终的JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT的主要作用

jwt.jpg

JWT的使用流程

  1. 客户端需要携带用户名/密码等可证明身份的内容去授权服务器获取JWT信息

  2. 每次服务都携带该token内容与Web服务器进行交互,由业务服务器来验证token是否是授权系统发放的有效token,来验证当前业务的请求是否合法