Spring Security 之 JWT介绍

2022-11-18 16:45:03 浏览数 (1)

相关文章:

  1. OAuth2的定义和运行流程
  2. Spring Security OAuth实现Gitee快捷登录
  3. Spring Security OAuth实现GitHub快捷登录
  4. Spring Security的过滤器链机制
  5. Spring Security OAuth Client配置加载源码分析
  6. Spring Security内置过滤器详解
  7. 为什么加载了两个OAuth2AuthorizationRequestRedirectFilter分析
  8. Spring Security 自定义授权服务器实践
  9. Spring Security 自定义资源服务器实践
  10. Spring Security 自定义用户信息端点与多种登录方式共存

什么是JWT

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

官网: https://jwt.io

标准:https://tools.ietf.org/html/rfc7519

JWT令牌的优点:

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

缺点:

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

JWT组成

这是一段JWT,一个JWT就是一个字符串,由三部分组成:头部、载荷、签名

头部(Header)

头部用于描述关于该JWT的最基本的信息,例如其类型(JWT)以及签名所用的算法(如HMAC SHA256或RSA)等,这也可以被表示成一个JSON对象。

代码语言:javascript复制
{
"alg":"HS256",
"typ":"JWT"
}

typ:类型 alg:签名的算法

再对JSON字符串进行Base64编码,得如下字符串:

代码语言:javascript复制
ewoiYWxnIjoiSFMyNTYiLAoidHlwIjoiSldUIgp9

负载(Payload)

第二部分是负载,用来存放有效信息,这些有效信息包含三个部分:

  1. 标准中注册的声明 iss: jwt签发者 sub:jwt所面向的用户 aud:接收jwt的一方 exp:jwt的过期时间,这个过期时间必须要大于签发时间 nbf:定义在什么时间之前,该jwt都是不可用的 iat:jwt的签发时间 jti:jwt的唯一身份标识,主要用来作为一次性token,从而避免重放攻击
  2. 公共的声明 公共的声明可以添加任何信息,一般添加用户相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为该部门在客户端可解密
  3. 私有声明 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对标解密的,意味着该部分信息可以归类为明文信息 这个指的就是自定义的claim,比如:
代码语言:javascript复制
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

sub 标准的声明,name自定义的声明(公共的或者私有的)

再base64后得到jwt的第二部分:

代码语言:javascript复制
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

签名(signature)

JWT的第三部分是一个签证信息,这个签证信息由三部分组成:

  1. header(base64后)
  2. payload(base64后)
  3. secret(盐,保密) 这部分将base64加密后的header、base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret,然后构成jwt的第三部分。
代码语言:javascript复制
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

0 人点赞