JSON Web Token (JWT)
Abstract
JSON Web Token (JWT) is a compact, URL-safe means of representing
claims to be transferred between two parties. The claims in a JWT
are encoded as a JSON object that is used as the payload of a JSON
Web Signature (JWS) structure or as the plaintext of a JSON Web
Encryption (JWE) structure, enabling the claims to be digitally
signed or integrity protected with a Message Authentication Code
(MAC) and/or encrypted.
JWT example:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT的构成:
第一部分:头部(header)
头部承载两部分信息:
- 声明类型
- 声明加密的算法
例如:
{ "alg": "HS256", "typ": "JWT"}
然后将头部进行base64加密,构成token的第一部分:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
第二部分:载荷(payload)
存放有效信息的地方,包括三个部分
- RFC7519标准中注册的声明
- 公共的声明
- 私有的声明
标准中注册的声明有:
- iss: jwt签发者
- sub: jwt所面向的用户
- aud: 接收jwt的一方
- exp: jwt的过期时间,这个过期时间必须要大于签发时间
- nbf: 定义在什么时间之前,该jwt都是不可用的.
- iat: jwt的签发时间
- jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
定义一个payload:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022}
然后将其进行base64加密,得到Jwt的第二部分:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
第三部分:签证(signature)
签证信息有三部分组成:
- header(base64加密后)
- payload(base64加密后)
- secret
签证需要把base64加密后的header和base64加密后的payload使用.连接组成字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分: SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
密钥secret是保存在服务端的,服务端会根据这个密钥进行生成token和验证,所以需要保护好。