如何在同域Angular应用间安全共享Access Token实现自动登录?
同主域名下Angular应用间自动登录的安全实现方案
因为两个应用属于同主域名(example.com)的子域名,完全可以通过以下几种安全方式实现自动登录:
方案一:利用主域名Cookie存储JWT(推荐)
sessionStorage是子域隔离的,无法跨app-a.example.com和app-b.example.com访问,但Cookie可以通过设置domain属性实现跨子域共享:
- 当用户在App A登录成功后,后端在设置JWT时,将Cookie的
domain设为.example.com(注意前面的点),同时添加以下安全属性:Secure:仅在HTTPS请求中传输,防止明文泄露HttpOnly:禁止前端JS读取Cookie,避免XSS攻击窃取令牌SameSite=Strict或Lax:阻止跨站请求携带Cookie,防范CSRF攻击
- App B加载时,浏览器会自动携带该Cookie到后端,后端验证Cookie中的JWT有效性后,直接完成用户登录,无需前端额外操作。
如果业务需要前端读取JWT(比如前端要做权限判断),可以不用HttpOnly,但必须做好XSS防护:比如对所有用户输入做转义、启用Content-Security-Policy(CSP)、避免使用eval等危险API。
方案二:一次性授权码跳转(适合无法用Cookie的场景)
如果不想用Cookie,可以通过一次性授权码间接传递身份信息,避免JWT直接暴露在URL中:
- 用户在App A点击跳转按钮时,先向后端请求生成一个短有效期、一次性的授权码(比如5分钟内有效,使用后立即作废)
- 将授权码作为URL参数(如
app-b.example.com/login?code=xxx)跳转到App B - App B加载后,立即用这个授权码向后端请求换取JWT,后端验证授权码有效后,返回JWT并作废该授权码
- App B将获取到的JWT存入自身的sessionStorage,完成自动登录
这种方式的优势是即使授权码被泄露,有效期短且只能使用一次,风险可控;缺点是多了一次后端请求。
方案三:跨子域页面通信(document.domain)
通过设置document.domain实现同主域名下的页面通信:
- 在App A和App B的页面中,都设置
document.domain = 'example.com'(注意:必须在页面加载早期执行) - App A跳转前,可以打开App B的隐藏iframe,通过
postMessage将JWT发送给iframe中的App B页面 - App B接收到消息后,验证消息的
origin为app-a.example.com,确认合法后将JWT存入sessionStorage,完成登录
这种方式需要注意:postMessage必须严格验证发送方的origin,避免恶意页面伪造消息;同时JWT在传输过程中要确保是HTTPS环境,防止被窃听。
通用安全注意事项
- 所有通信必须使用HTTPS,防止令牌被中间人窃取
- JWT设置较短的过期时间(比如15-30分钟),配合刷新令牌机制实现无感续期
- 对两个应用都启用XSS防护:开启CSP、过滤用户输入、避免不安全的DOM操作
- 后端对所有敏感接口启用CSRF验证(如果用Cookie的话,SameSite属性可以大幅降低风险,但仍建议配合CSRF令牌)
内容的提问来源于stack exchange,提问作者mar3g
相关产品推荐
相关产品推荐

