单点登录原理介绍 - 邱乘屹的个人技术博客


单点登录(Single Sign On),简称为 SSO。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。因在不同场景中使用的单点登录方式不同,在此做一个记录。

如何解决单点登陆

  1. Redis作为缓存储存session信息(cookie/session)
  2. JWT来解决单点登陆

使用cookie和session解决单点登陆

将Session存储于Redis上,然后将整个系统的全局Cookie Domain设置于顶级域名上,这样SessionID就能在各个子系统间共享。
在这里插入图片描述
redis存储所有SessionID。每次做session验证不再从本机对比session,而是将session放在redis里统一管理。无论那台服务器上存储的session都放在redis中。那么在判断的时候都以redis里的数据为准,即可解决单点登陆问题

但是这个方案存在着严重的扩展性问题,首先,ASP.NET的Session存储必须为SessionStateItemCollection对象,而存储的结构是经过序列化后经过加密存储的。并且当用户访问应用时,他首先做的就是将存储容器里的所有内容全部取出,并且反序列化为SessionStateItemCollection对象。这就决定了他具有以下约束:

Session中所涉及的类型必须是子系统中共同拥有的(即程序集、类型都需要一致),这导致Session的使用受到诸多限制;

跨顶级域名的情况完全无法处理;

使用JWT解决单点登陆

JWT优势

因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息,因为payload是可解密的。
便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
它不需要在服务端保存会话信息, 所以它易于应用的扩展

JWT劣势

保护好secret私钥,该私钥非常重要。如果泄露,任何人都可以伪造。
一旦token泄露,在有效期内任何人都可以使用该token进入系统,且不可撤回。

JWT安全要求

不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
如果可以,请使用https协议

猜你喜欢

转载自blog.csdn.net/weixin_47074764/article/details/106469062
今日推荐