500字学JWT

2019-07-18

JWT

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。通过客户端携带一个特定的字符串来实现认证。

客户端实际的JWT存储为一个加密字符串(BASE64编码),一般表现为Header.Payload.Signature的形式。通过.分割的JWT的三个部分为:

  • Header(头部)

    包含本条JWT的元数据,例如加密算法alg、类型typ等。通过BASE64转为字符串。

  • Payload(负载)

    包含签发人iss、过期时间exp等等,一般为真正的登陆凭证。通过BASE64转为字符串。

  • Signature(签名)

    防止JWT伪造的篡改的内容,公式为:

    Signature = HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)
    

其中secret为服务器秘钥。服务器在秘钥不泄漏的情况下,可以验证客户端发来的JWT字段是否被篡改。

为什么要采用JWT

JWT的目标在于将会话信息存储于客户端,实现服务端“零状态”,只需要客户端每次请求时带上JWT,服务端校验JWT完整性,如果通过,直接从JWT中取出会话信息(比如访问权限)即可。不让服务端存状态(也就是传统意义上的会话session)的意义是:

  • 如果服务端存session,那么如果是服务端集群,就要求所有的集群每台服务器都要有存取session的能力,造成拓展困难。
  • 跨域问题,如果普通session要实现“A网站登陆,B网站浏览”这种形式,需要A网站和B网站的服务器之间共享session,比较麻烦。

客户端怎么使用

并没有严格规定客户端必须如何使用JWT,甚至可以放在Cookie字段中。但为了跨域,一般放在HTTP头的Authorization字段中

Authorization: Bearer <token>