同一Laravel应用下多语言不同域名如何安全共享session
Laravel多语言独立域名安全共享Session的可行方案
情况1:所有域名属于同一根域名的二级子域名
这是成本最低的实现场景,比如你的域名结构为cn.example.com、en.example.com、jp.example.com,统一根域为example.com,可直接通过调整Session配置实现共享:
- 首先修改
config/session.php中的domain参数,值为带前置点的根域名,例如'.example.com',同时同步修改.env文件中的SESSION_DOMAIN参数,避免env配置覆盖文件配置 - 调整
SESSION_SAME_SITE参数为lax,不要设置为strict,否则跨子域名跳转时Cookie会被浏览器拦截 - 所有站点实例必须使用同一个
APP_KEY,Laravel的Session数据会通过APP_KEY加密,密钥不一致会导致Session解密失败无法读取 - 如果多站点部署在不同服务器,需统一Session存储为所有实例都可访问的中心化服务,比如Redis、共享数据库,不要使用本地文件存储
情况2:所有域名是完全独立的不同根域名
例如你的域名结构为example.cn、example.com、example.jp,浏览器默认会完全隔离不同根域名的Cookie,无法直接共享Session Cookie,可选择以下方案实现:
方案1:中心化Session存储+一次性校验令牌
- 统一所有站点的Session存储到共享的Redis/数据库实例,所有站点都可读取同一份Session数据
- 实现跨域跳转校验逻辑:用户在A域名登录后,跳转至B域名时,在URL参数中携带一次性加密校验令牌,B域名拿到令牌后到中心化存储校验有效性,校验通过后主动在B域名下写入对应Session的Cookie
- 安全要求:校验令牌必须是一次性、有效期控制在1分钟以内,同时绑定用户IP、UA特征,防止令牌被窃取盗用
方案2:使用JWT替代原生Session鉴权
- 改造身份鉴权逻辑为JWT模式,用户登录后获取加密的JWT令牌
- 用户切换域名时,通过URL参数或者前端跨域安全逻辑传递JWT,每个域名拿到有效JWT后即可识别用户身份,不需要依赖Cookie共享
- 安全要求:JWT需配置短有效期,全链路启用HTTPS防止传输窃听,敏感信息不要存入JWT的Payload字段
方案3:iframe静默授权
- 搭建统一的授权中心域名,用户登录后在授权中心域名下存储有效会话
- 其他业务域名加载时,嵌入隐藏的授权中心iframe,通过postMessage安全传递会话身份信息,业务域名拿到有效身份后生成本地会话
- 安全要求:必须严格校验postMessage的来源域名,防止恶意站点窃取身份信息
通用安全要求
无论使用哪种方案,都需要完成以下配置避免安全风险:
- 所有域名全链路启用HTTPS,禁止HTTP访问,防止会话数据被窃听
- 开启
SESSION_HTTP_ONLY配置为true,禁止前端JS读取Session Cookie,防范XSS攻击窃取会话 - Session中不要存储明文敏感信息,所有敏感数据需做加密处理
- 定期轮换
APP_KEY,轮换时做好旧Session的兼容逻辑,避免用户批量掉线
内容的提问来源于stack exchange,提问作者hereForLearing
相关产品推荐
相关产品推荐

