有状态登录和无状态登录详解
- 一 有状态登录
- 二 无状态登陆
- 无状态登陆介绍:
- 无状态token生成方式
- 一 Jwt方式
- 二 RSA256非对称加密方式
- 三 区别与差异
- 四 参考连接
一 有状态登录
有状态登录(Session): 传统上,我们会使用 Session 和 Cookie 来保存用户的授权信息。
第一步,登录过程,用户使用用户名和密码来登录系统,服务器会来验证用户名和密码是否正确,如果正确,服务器会给这个用户创建一个包含用户登录信息、角色、权限的一个叫做 Session 的东西,然后把这个 Session 保存起来,同时把这个 Session 的 ID 以 Cookie 的形式发送给前端,表示用户验证成功,登录完成了;
第二步,接下来如果用户希望访问某些资源,前端要向后端发起一个 HTTP 的请求,同时相应的 Cookie 也会跟随请求一起发送给服务器,而服务器取得 Cookie 以后就会去查找是否有 Session ID ,然后通过 Session ID 提取相应的 Session 来确定用户的身份与权限,如果 Session 与 ID 相符,同时用户的信息也能提供相应的权限,服务器就会认为这个用户已经登录了,随后资源信息就会通过 HTTP 响应给前端。
二 无状态登陆
无状态登陆介绍:
第一步:同样是登陆,用户使用用户名和密码登陆,如果登陆成功,服务器就会返回一个加密文档,这个文档就是 JWT ,其中包含用户密码以外,全部的认证信息,包括用户名、Email、角色、权限等等,而前端在拿到 这个JWT 以后就可以把它保存起来了,可以保存到 Cookie 中,也可以保存到浏览器的 LocaStorage 里面,而生成的 JWT 不需要在后端保存;
第二步:用户如果需要访问某些权限的时候,这时候,用户就要把 JWT 放在 HTTP 请求 herder 中与请求一起发送给服务器,服务器取得 JWT 以后 会使用私钥给 JWT 文档解密 ,如果解密成功而且数据依然有效则代表用户已经登陆了,如果 JWT 所描述的用户权限允许该用户访问资源,那么服务器就会把资源的信息,通过 HTTP 响应发回给前端。
无状态token生成方式
一 Jwt方式
JWT其实是无状态token实现方式之一。
上述JWT实际上通过JwtBuilder将用户信息、秘钥和JWTID等构建成一个加密的字符串。 后续验证时使用同一秘钥创建JwtParser对JWT进行解析获取相应的信息。
二 RSA256非对称加密方式
当然也可以使用其他加密方式对用户信息进行加密作为无状态token来使用,
比如采用RSA256非对称加密来生成公钥私钥,采用公钥和用户信息进行加密生成无状态Token,
采用私钥对Token进行解密。
三 区别与差异
传统上用户登陆状态会以 Session 的形式保存在服务器上,而 Session ID 则保存在前端的 Cookie 中;而使用 JWT 以后,用户的认证信息将会以 Token 的形式保存在前端,服务器不需要保存任何的用户状态,这也就是为什么 JWT 被称为无状态登陆的原因,无状态登陆最大的优势就是完美支持分布式部署,可以使用一个 Token 发送给不同的服务器,而所有的服务器都会返回同样的结果。
四 参考连接
单点登陆和无状态登陆
下述文章详细的介绍了session 、token、jwt、cookie网上有些博客混淆概念
token与JWT详细介绍