统一登录门户系统

随着等保2.0和密评工作的深入推进,各政企单位的应用系统建设会向着更安全、更标准方向发展。

为了推进整合信息共享,破除各系统之间的壁垒,首先要建设的就是统一登录门户系统。

常见的统一登录要求,还是基于一个统一的入口,由统一登录入口完成登录后,可以自由访问其他系统,而其他系统的用户登录应跳转到统一登录入口。

可能存在的问题:

1.用户系统如何建立,如何解决存量用户。

2.应符合等保要求和国密要求。

一种简单的统一登录系统,在主域名中设置cookie信息,保证在访问其他子域名时也带上cookie,通过cookie获得用户的身份信息。知识点如下:

1.基于cookie用户登录,cookie和session的关系

2.cookie的domain(域)信息

一、基础知识

1.1 cookie

cookie是http协议的产物,由server生成,通过http response发送给webbrowser,webbrowser存储在用户本地的文件,在下一次访问同一url时候,在http header中携带cookie一起发送到服务器端。cookie采用key-value的数据结果。

在OSI 网络模型中,会话层在第五层,我们熟悉的Http、FTP、SMTP是TCP/IP网络协议的应用层协议。

Http是一种无状态的连接协议,本身并没有提供会话协议。通过cookie方式,可以为http添加会话信息。

如何理解,Http是一种无状态的连接协议。当用户的一次访问请求结束后,后端服务器就无法知道下一次来访问的还是不是上次访问的用户。另一种情况,在一个NAT的网络中,有10个用户通过NAT方式访问网络,那么这10个用户的ip都是一样,10个用户访问Web服务器时,在服务端无法区分这10个用户。

当一个web系统,需要会话信息时,可以在用户登录时,在cookie中保存用户名。这样在下一次访问时,cookie信息会放在http header中,随着http请求发送到服务端,起到会话标识的作用。即同一个客户端发出的请求,每次发出的请求都会带有上一次访问时服务端设置的信息,这样服务端就可以根据之前存入 Cookie 的值来做相应的处理。

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        // 设置生命周期为MAX_VALUE
        cookie.setMaxAge(Integer.MAX_VALUE);
        resp.addCookie(cookie);
    }

1.2 cookie域

产生Cookie的服务器可以向set-Cookie响应首部添加一个Domain属性来控制哪些站点可以看到那个cookie,例如下面:

Set-Cookie: name="wang"; domain="m.zhuanzhuan.58.com"

如果用户访问的是m.zhuanzhuan.58.com那就会发送cookie: name="wang", 如果用户访问www.aaa.com(非zhuanzhuan.58.com)就不会发送这个Cookie。

cookie的路径 Path

Path属性可以为服务器特定文档指定Cookie,这个属性设置的url且带有这个前缀的url路径都是有效的。

例如:m.zhuanzhuan.58.com 和 m.zhaunzhuan.58.com/user/这两个url。 m.zhuanzhuan.58.com 设置cookie

Set-cookie: id="123432";domain="m.zhuanzhuan.58.com";

m.zhaunzhuan.58.com/user/ 设置cookie:

Set-cookie:user="wang", domain="m.zhuanzhuan.58.com"; path=/user/

但是访问其他路径m.zhuanzhuan.58.com/other/就会获得

cookie: id="123432"

如果访问m.zhuanzhuan.58.com/user/就会获得

  cookie: id="123432"
  cookie: user="wang"

二、cookie实现单点登录

正常情况下,同一个一级域名下的两个二级域名也不能交互使用Cookie,比如test1.mcrwayfun.com和test2.mcrwayfun.com,因为二者的域名不完全相同。如果想要mcrwayfun.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数为.mcrwayfun.com,这样使用test1.mcrwayfun.com和test2.mcrwayfun.com就能访问同一个cookie。

在这种单点登录模型中,登录系统采用cookie保存登录信息,并设置cookie domain域为一级域名,在访问二级域名时,服务端也会获得用户的登录信息,实现了统一登录的功能。

三、session和cookie

cookie 缺点

  1. 每次请求都会携带全部的 Cookie 信息,容易造成不必要的带宽浪费。

  2. 每个浏览器对 Cookie 在同一个域名下的个数和每个 Cookie 的总大小(4kb)都有相应的限制。

  3. 数据存储在客户端,容易被拦截篡改,不安全。

  4. 客户端可以禁用 Cookie,导致功能失效。

  5. 难于管理,大型系统里每个应用都会有自己的 Cookie,加上以上的限制,容易出现数据被截取,导致数据丢失。

Session(PHP 后端为例,java是一样的)

  1. 服务端(默认设置)接受请求时,先查看 $_COOKIE 中是否存在 name 为 PHPSESSID 的键值对(value 为服务端生成的 SESSION_ID:bebfaf6c745c1a6e5f341baf2178113b)。

  2. 若不存在(第一次请求),将会自动生成 SESSION_ID,写入到 $_COOKIE 数组中(name 为 PHPSESSID, value 为 SESSION_ID),然后通过响应头返回给浏览器。

  3. 若存在(非第一次请求),则根据 value 值到设置的目录下获取相应的文件,反序列化并写入到 $_SESSION 数组供后续使用。

  4. 当服务端进行设置时,此$_SESSION 只会维持在内存中。当脚本执行结束时,将会自动把 $_SESSION 序列化后写入到 SESSION_ID 对应的文件中(创建或覆盖)。(脚本执行即http访问)

  5. 通过POST获取用户的用户名密码,当验证成功后,将用户身份信息保存在$_SESSION中,通过cookie和session实现用户登录。

优点

  1. 只将会话标识符放到 Cookie 里,减少带宽的传输。

  2. 可以存储大量的信息,基本没有空间上的限制。

  3. 数据存放在服务端,安全。

  4. 可以统一集中式管理。

联系

SESSION 为了识别会话,需要传输一个唯一的 SESSION_ID 到客户端。一般情况下,都是借助 Cookie 来传递,当然也可以通过其他方式进行传递。

Session 安全延伸

以上分析得出, Session 需要通过 SESSION_ID 来识别客户端,这就会导致一个安全隐患。当 SESSION_ID 落入第三者时,服务端将无法分辨出是否是合法的请求。SESSION_ID通常为一串随机值,除了防止泄露,还要防止通过暴力方式猜解出来。

一个简单的防御措施就是:每次请求时都生成一个新的 SESSION_ID 关联到对应的数据并将老的 SESSION_ID 删除。

百度BDUSS可以看做是一个session_id,HttpOnly属性保证javascript不能修改这个值。

四、全局Session

采用Redis替代中间件session存储,实现单点登录。

五、采用cookie实现统一登录架构

  1. 登录login页面,生成用户信息并保存,保存在持久化UserInfo_Server数据库或Redis中。
  2. 将用户信息的key,写入到cookie中,设置domain为顶级域名。
  3. 浏览其他页面,会携带cookie发布到后端server,server向UserInfo_Server查询用户认证信息,实现用户登录。
  4. 用户注销,任一个server都可以设置cookie的有效期为0,删除cookie,并调用UserInfo_Server接口修改数据库中的认证信息。
  5. key的生成要随机,UserInfo接口校验数字签名,保证信道加密cookie不能被窃取

参考:

  1. 这一次带你彻底了解Cookie https://www.cnblogs.com/zhuanzhuanfe/p/8010854.html 
  2. 深入理解Cookie https://www.jianshu.com/p/6fc9cea6daa2
  3. Cookie 和 Session https://segmentfault.com/a/1190000008928086
  4. SpringBootSecurity学习(09)网页版登录配置Session共享 https://segmentfault.com/a/1190000020544320

猜你喜欢

转载自blog.csdn.net/u011893782/article/details/105312760
今日推荐