Spring Boot+Spring Security+Jwt实现登陆认证

Spring Boot+Spring Security+Jwt实现登陆认证

1.JWT简介

​ 在项目里面,实现登录认证有很多方式,其中传统的session和jwt应该是主要的两种,通过对比我们来揭开jwt的神秘面纱。

传统session认证的流程:
  1. 用户向服务器发送用户名和密码;
  2. 服务器通过验证后,在会话session里面保存客户端信息,比如用户名,角色等
  3. 返回一个session_id,并写入cookie,返回用户
  4. 下次请求时,用户携带这个带有session_id的cookie访问服务器,服务器根据这个id找到相应的session,从而找到这个用户的信息。

​ 基于传统session的缺点如下:

  1. 服务端要保存大量的session数据,增加了访问压力

  2. 如果要做集群化部署,那么服务器要把session做共享,十分麻烦

    jwt认证机制及流程

​ jwt认证克服了session的弊端,它不需要在服务器里面保存大量的信息,这也意味着如果有多台服务器,也不需要考虑用户在哪台服务器访问认证。

​ 基于jwt的认证流程:

  1. 用户发请求传用户名和密码;
  2. 服务器验证用户信息;
  3. 验证通过后发送用户一个token;
  4. 客户端存储token,下次用户发请求都要携带这个token
  5. 服务端接受并解析token,如果解析正确,则放行用户请求,给他服务或者数据
jwt是什么样子

​ JWT包含三段信息,每段信息之间用.拼接,实际上就是三段信息拼接的字符串,具体样子如下

image-20201022150750167

可以看到由三个字符串拼接为一个长字符串,这就是jwt的数据格式。下面就一一解读下这三段信息。

1.头部Header(第一段字符串)

​ 头部通常包含两个信息,格式如下:

   {
    'typ': 'JWT',
    'alg': 'HS256'
   }

​ typ 声明类型,alg声明加密的算法,将上述格式的数据通过Base64Url编码(可解码)就得到了第一段字符串:eyJhbGciOiJIUzUxMiJ9

2.载荷payload(第二段字符串)

​ 载荷就是存放有效数据,通常存放三部分有效信息,标准中注册的声明、公共的声明、私有的声明。

​ 关于标准中注册的声明,官方文档中给出了七个示例信息:

  1. iss (issuer):表示签发人
  2. exp (expiration time):表示token过期时间
  3. sub (subject):主题
  4. aud (audience):受众
  5. nbf (Not Before):生效时间
  6. iat (Issued At):签发时间
  7. jti (JWT ID):编号

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

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

​ 我们可以自定义一个payload:

{
    "userId":15,
    "userName":"dream_coke1"
}

​ 通过base64编码后就变成了第二段字符串:eyJ1c2VyTmFtZSI6ImRyZWFtX2Nva2UxIiwidXNlcklkIjo3fQ

3.签名 Signature:是整个数据的认证信息,那么它是怎么得到的呢?通过前面两个步骤,我们可以得到经过base64编码后的第一部分和第二部分的字符串,那么这个字符串再加上密钥secret(密钥(也是一段字符串)保存在服务端,不能泄露给客户端),通过 Header 中配置的加密算法(这里是HS256)生成.故最后生成了第三段字符串jxgP52fFp1PIjR6BjPd4cq5Je2lq_w_95ylsxe7HiSxvbXPpYmC7iXVy1gj-4WjOr8176pjG–EuhcTiiUmrIA

2.Spring Security 登陆流程

详情见下面的链接

https://blog.csdn.net/dream_cola/article/details/109205068

3. 两者结合

待更新

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值