如何为特定用户实现跨子域LocalStorage授权令牌共享
跨子域身份令牌共享实现方案
LocalStorage受浏览器同源策略约束,仅同协议、同域名、同端口的站点可访问存储内容,不同子域默认完全隔离,无法直接读取对方存储的Auth Token。要实现类似Jira的同组织子域切换免登效果,可选择以下几种成熟方案:
方案1:配置主域Cookie存储令牌(最推荐,Jira等商业化产品的主流实现)
这是落地成本最低、安全性最高的方案,操作逻辑如下:
- 登录成功后,写入Auth Token到Cookie时,显式指定
Domain属性为顶级主域,示例配置为domain=.site.com,前缀的点代表匹配所有归属该主域的子域,当前主流浏览器也支持不带前缀的domain=site.com配置,效果一致 - 同步配置
Path=/确保所有站点路径都可访问该Cookie,可根据安全需求搭配HttpOnly(禁止前端JS读取,防范XSS窃密)、Secure(仅HTTPS协议下传输)、SameSite属性加固 - 配置完成后,
company1.site.com、company2.site.com等所有同主域子域发起请求时,都会自动携带该Cookie,服务端直接校验Cookie中的令牌即可完成身份识别,无需前端在子域间手动传递令牌
注意:该方案仅适用于所有子域归属同一个顶级主域的场景,跨顶级主域无法使用该方案。
方案2:通过postMessage跨子域同步LocalStorage内容
如果业务要求必须使用LocalStorage存储令牌,可以通过统一中间页做通信传递:
- 单独部署一个统一身份校验页,域名固定为
sso.site.com,所有子域的登录状态统一以该页面LocalStorage中存储的令牌为准 - 各个业务子域页面加载时,隐藏嵌入
sso.site.com的iframe,通过postMessage向该iframe发起令牌查询请求 - iframe侧校验请求来源属于授信的同主域子域后,将自身LocalStorage存储的有效令牌通过postMessage回传给业务子域,业务子域拿到令牌后写入自身LocalStorage即可完成身份同步
- 必须严格校验postMessage的请求来源域名,防止未授信站点窃取令牌。
方案3:URL参数临时传递令牌(仅适用于固定跳转场景)
如果只是子域间主动跳转的场景,可以临时用URL参数传递令牌:
- 从A子域跳转到B子域前,将Auth Token加密后拼接到跳转URL的参数中,同时给令牌设置极短的有效期
- B子域加载时读取URL中的令牌参数,校验解密通过后写入自身存储,立刻清理URL中的令牌参数,避免被浏览器历史记录、服务端日志等留存泄露
注意:该方案存在较高的令牌泄露风险,仅可作为临时补充方案使用,不推荐作为核心实现。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

