Cookie配置同源单点登录

315 阅读3分钟

本文记录一下在前端通过cookie来实现单点登录的流程,通过一个用户中心和两个业务系统为例子,在cookie同域的情况下来共享cookie从而实现token的传输。

同源的概念

先了解下同源的概念

同源(Same-Origin Policy, SOP)是一种浏览器的安全机制,限制从一个源加载的文档或脚本与另一个源的资源进行交互。同源的定义基于三个要素:协议、域名和端口号。只有这三个要素都相同的资源才被认为是同源的。

如果两个 URL 的协议、域名和端口号任意一个不同,则它们被认为是不同源。例如:

  • http://example.com/page1http://example.com/page2 是同源的。
  • http://example.comhttps://example.com不同源的(协议不同)。
  • http://example.comhttp://sub.example.com不同源的(域名不同)。
  • http://example.com:80http://example.com:8080不同源的(端口号不同)。

Cookie的作用域

Cookie 的作用域确实主要由 DomainPath 决定,而与协议和端口无关 Domain 和 Path 决定 Cookie 作用域

  • Domain:指定 Cookie 适用的域名。当多个服务在同一个域名下(即使是不同端口),只要 Domain 相同,浏览器会发送该 Cookie 给所有匹配的子域。
  • Path:指定 Cookie 生效的路径。只要路径匹配,浏览器就会在相同 Domain 下发送 Cookie。

协议和端口:Cookie 的存取不受协议(HTTP/HTTPS)和端口的直接影响。浏览器在同一个域名下的所有端口间共享 Cookie,只要 DomainPath 匹配。

解决的场景

根据以上的信息我们可以实现一个前端的单点登录,比如有一个用户中心,和两个业务系统

三个系统之间都是挂载在相同的ip上面,只是端口不同

那么即可实现我只需要在用户中心登录一次,获取到token之后能和两个业务系统

当我在用户中心登录的时候,都是相同的Ip,此时用户中心的端口是 9798

image.png

当进入业务系统端口味18087的情况下,可以看到相同的cookie也在这个业务系统中

image.png

这是因为用户中心和业务系统的cookie通过Domain这个属性进行了共享

可以借助cookie的这个属性来实现一下token的共享,从而实现从用户中心登录之后,跳转到其他业务系统免登录的场景。

大概的流程就是在业务系统中获取一下token,如果存在token则验证token的正确性直接进入首页,如果不存在token,则走正常的登录页面登录流程

安全问题

由于上面保存的是token登录凭证,为了防止被截获或者篡改,需要注意cookie的其他几个属性

1.设置 HttpOnly 属性可以防止 JavaScript 访问 Cookie,从而降低 XSS(跨站脚本)攻击的风险。

2.使用 Secure 属性确保 Cookie 仅通过 HTTPS 传输,避免在网络上传输时被窃取。

3.设置 SameSite 属性可以限制 Cookie 在跨站请求中的使用,从而降低 CSRF(跨站请求伪造)攻击的风险。

也可以针对我们的cookie来设定较短的过期时间(ExpiresMax-Age),以降低 token 被盗后长期有效的风险

如果觉得有趣或有收获,请关注我的更新,给个喜欢和分享。您的支持是我写作的最大动力!

往期好文推荐