JWT简介

概念

JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止被篡改。

优点

1、JWT基于json,非常方便解析。
2、可以在令牌中自定义丰富的内容,易扩展。
3、通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。
4、资源服务使用JWT可不依赖认证服务即可完成授权。

缺点

JWT令牌较长,占存储空间比较大。

JWT组成

一个JWT实际上就是一个字符串,它由三部分组成,头部(header)、载荷(payload)与签名(signature)。

头部(header)

头部用于描述关于该JWT的最基本的信息:类型(即JWT)以及签名所用的算法(如HMACSHA256或RSA)等。
然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分。

载荷(payload)

载荷就是存放有效信息的地方,包含三个部分:
1、标准中注册的声明(建议但不强制使用)

2、公共的声明

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

3、私有的声明

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

签名(signature)

这个部分需要base64加密后的header和base64加密后的payload使用 . 连接组成的字符串,然后通过header中声明的加密方式进行加盐 secret 组合加密。

签名信息由三部分组成:
1、header (base64后的)
2、payload (base64后的)
3、secret(盐,一定要保密)

secret是保存在服务器端的,JWT的签发生成也是在服务器端的,secret就是用来进行JWT的签发和验证。它就是服务端的私钥,在任何场景都不应该泄露出去。一旦客户端得知secret, 那就意味着客户端是可以自我签发JWT了。

JWT应用场景

一次性验证

比如用户注册后需要发一封邮件让其激活账户,通常邮件中需要有一个链接,这个链接需要具备以下的特性:能够标识用户,该链接具有时效性(通常只允许几小时之内激活),不能被篡改以激活其他可能的账户…
这种场景就和JWT的特性非常贴近,JWT的 payload 中固定的参数: iss签发者和exp过期时间正是为其做准备的。
restful API的无状态认证
使用JWT来做restful API的身份认证也是值得推崇的一种使用方案。客户端和服务端共享secret,过期时间由服务端校验,客户端定时刷新,签名信息不可被修改。

使用JWT做单点登录 + 会话管理(不推荐)

JWT是无状态的,在处理注销,续约问题上会变得非常复杂。