JWT有状态登陆与无状态登陆的区别

单点登录与 JWT 1

JWT 全称: Json Web Token 。
作用: JWT 的作用是 用户授权(Authorization) ,而不是用户的身份认证(Authentication)
用户认证 指的是使用用户名、密码来验证当前用户的身份,即用户登录。
用户授权 指用户登录成功后,当前用户有足够的权限访问特定的资源。

传统的 Session 登录:

  • 用户登录后,服务器会保存登录的 Session 信息
  • Session ID 会通过 cookie 传递给前端
  • http 请求会附带 cookie
    这种登录方式称为 有状态登录

有状态登录(Session):

传统上,我们会使用 Session 和 Cookie 来保存用户的授权信息。第一步,登录过程,用户使用用户名和密码来登录系统,服务器会来验证用户名和密码是否正确,如果正确,服务器会给这个用户创建一个包含用户登录信息、角色、权限的一个叫做 Session 的东西,然后把这个 Session 保存起来,同时把这个 Session 的 ID 以 Cookie 的形式发送给前端,表示用户验证成功,登录完成了;接下来如果用户希望访问某些资源,前端要向后端发起一个 HTTP 的请求,同时相应的 Cookie 也会跟随请求一起发送给服务器,而服务器取得 Cookie 以后就会去查找是否有 Session ID ,然后通过 Session ID 提取相应的 Session 来确定用户的身份与权限,如果 Session 与 ID 相符,同时用户的信息也能提供相应的权限,服务器就会认为这个用户已经登录了,随后资源信息就会通过 HTTP 响应给前端。
客户端 服务器 POST api/login{email,password} 通过 cookie 传递 session ID 请求携带 cookie ,并包含 sessionID 如果用户认证成功,则返回资源 用户登陆 访问资源 创建并保存 session 通过sessionID 来确定用户 身份与权限 有状态登陆(Session)
无状态登陆(JWT):

第一步,同样是登陆,用户使用用户名和密码登陆,如果登陆成功,服务器就会返回一个加密文档,这个文档就是 JWT ,其中包含用户密码以外,全部的认证信息,包括用户名、Email、角色、权限等等,而前端在拿到 这个JWT 以后就可以把它保存起来了,可以保存到 Cookie 中,也可以保存到浏览器的 LocaStorage 里面,而生成的 JWT 不需要在后端保存,接下来第二步,用户如果需要访问某些权限的时候,这时候,用户就要把 JWT 放在 HTTP 请求 herder 中与请求一起发送给服务器,服务器取得 JWT 以后 会使用私钥给 JWT 文档解密 ,如果解密成功而且数据依然有效则代表用户已经登陆了,如果 JWT 所描述的用户权限允许该用户访问资源,那么服务器就会把资源的信息,通过 HTTP 响应发回给前端。
客户端 服务器 POST api/login{email,password} 返回 JWT 请求携带 JWT 如果 JWT 有效则返回资源 用户登陆 访问资源 使用密码加密 JWT 使用相同的密码验证JWT 无状态登陆(JWT)
区别与差异:

传统上用户登陆状态会以 Session 的形式保存在服务器上,而 Session ID 则保存在前端的 Cookie 中;而使用 JWT 以后,用户的认证信息将会以 Token 的形式保存在前端,服务器不需要保存任何的用户状态,这也就是为什么 JWT 被称为无状态登陆的原因,无状态登陆最大的优势就是完美支持分布式部署,可以使用一个 Token 发送给不同的服务器,而所有的服务器都会返回同样的结果。

JWT官网: https://jwt.io/


1,这是有状态登录

缺点是什么?

• 服务端保存大量数据,增加服务端压力

• 服务端保存用户状态,无法进行水平扩展

• 客户端请求依赖服务端,多次请求必须访问同一台服务器(如果集群了,相当于启动了多个tomcat,就需要在多个tomcat之间共享数据)
简单来说,用之前无状态登录的方式难以共享session,所以用单点登录

1.2.什么是无状态
服务器不保存用户的登录信息!

微服务集群中的每个服务,对外提供的都是Rest风格的接口。而Rest风格的一个最重要的规范就是:服务的无状态性,即:

服务端不保存任何客户端请求者信息
客户端的每次请求必须具备自描述信息(jwt),通过这些信息识别客户端身份

带来的好处是什么呢?

客户端请求不依赖服务端的信息,任何多次请求不需要必须访问到同一台服务

服务端的集群和状态对客户端透明

服务端可以任意的迁移和伸缩

减小服务端存储压力

1.3.如何实现无状态
无状态登录的流程:

• 当客户端第一次请求服务时,服务端对用户进行信息认证(登录)

• 认证通过,将用户身份信息(不包含密码)进行加密形成token,返回给客户端,作为登录凭证

• 以后每次请求,客户端都携带认证的token

• 服务端对token进行解密,判断是否有效。
流程图:

来源:

https://blog.csdn.net/weixin_45581482/article/details/119336595

https://blog.csdn.net/fhkkkbfgggjk/article/details/85047461

 
原文地址:https://www.cnblogs.com/konglxblog/p/15561058.html