文章目录
Spring Boot+Spring Security+Jwt实现登陆认证
1.JWT简介
在项目里面,实现登录认证有很多方式,其中传统的session和jwt应该是主要的两种,通过对比我们来揭开jwt的神秘面纱。
传统session认证的流程:
- 用户向服务器发送用户名和密码;
- 服务器通过验证后,在会话session里面保存客户端信息,比如用户名,角色等
- 返回一个session_id,并写入cookie,返回用户
- 下次请求时,用户携带这个带有session_id的cookie访问服务器,服务器根据这个id找到相应的session,从而找到这个用户的信息。
基于传统session的缺点如下:
jwt认证克服了session的弊端,它不需要在服务器里面保存大量的信息,这也意味着如果有多台服务器,也不需要考虑用户在哪台服务器访问认证。
基于jwt的认证流程:
- 用户发请求传用户名和密码;
- 服务器验证用户信息;
- 验证通过后发送用户一个token;
- 客户端存储token,下次用户发请求都要携带这个token
- 服务端接受并解析token,如果解析正确,则放行用户请求,给他服务或者数据
jwt是什么样子
JWT包含三段信息,每段信息之间用.拼接,实际上就是三段信息拼接的字符串,具体样子如下
可以看到由三个字符串拼接为一个长字符串,这就是jwt的数据格式。下面就一一解读下这三段信息。
1.头部Header(第一段字符串)
头部通常包含两个信息,格式如下:
{
'typ': 'JWT',
'alg': 'HS256'
}
typ 声明类型,alg声明加密的算法,将上述格式的数据通过Base64Url编码(可解码)就得到了第一段字符串:eyJhbGciOiJIUzUxMiJ9
2.载荷payload(第二段字符串)
载荷就是存放有效数据,通常存放三部分有效信息,标准中注册的声明、公共的声明、私有的声明。
关于标准中注册的声明,官方文档中给出了七个示例信息:
- iss (issuer):表示签发人
- exp (expiration time):表示token过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- 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. 两者结合
待更新