JWT
关于 JWT(Json Web Token)
以及如何在 SpringBoot
中使用 JWT
进行身份验证
JWT(Json Web Token)
原理
服务器认证以后,生成一个 JSON 对象,发回给用户
1 | { |
以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上 == 签名 ==。
JWT 数据结构
1 | // 没有换行,这里的换行是额外加上用于拆分结构的 |
这个 JWT 由以下三部分组成:
头部(Header):eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- 头部通常包含了 token 的类型(typ)和所使用的签名算法(alg)。
载荷(Payload):
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
- 载荷包含了一些声明(Claims)。声明是一些关于用户和其他数据的陈述。
- JWT 规定了 7 个可用字段
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
- 同样你也可以定义你自己的私有字段
- 在这个示例中,载荷包含了以下声明:
- sub(主题):1234567890
- name:John Doe
- iat(发行时间):1516239022
签名(Signature):SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
- 签名是用来验证 token 的完整性和防止数据被篡改的。在这个示例中,签名是用 HMAC SHA256 算法和一个密钥生成的。
**== 特别注意:== **
JWT 的头部和载荷都是 Base64Url 编码的,但它们并不是加密的。所以事实上可以非常简单的解码你 JWT 头部和载荷里面的信息,所以不能在 JWT 里面写入一些重要的信息以及用户的隐私(密码)。但是生成原始 Token 以后,可以用密钥再加密一次。
如何创建 token
1 | public String getToken(User user) { |
如何解析 token
1 | public boolean verifyToken(String token) { |
如何在项目中获得当前用户的信息
- 在拦截器中验证 token
- 如果 token 验证成功,从 token 中提取用户信息,存入 session 中
- 需要使用当前用户信息时直接从 session 中获取
1 |
|