You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Cognito设置Cookie到自身域名而非目标域名的问题求助

解决Cognito自定义域名Cookie跨域携带问题(CloudFront分发场景)

方案1:改用OAuth授权码模式,不依赖Cookie

放弃依赖Cognito的会话Cookie,改用授权码(code)模式获取令牌,通过请求头携带认证信息:

  • 配置Cognito应用客户端,将OAuth响应类型设为code,回调URL设置为你的主域名(如https://mywebsite.com/callback)
  • 前端引导用户跳转至Cognito登录页,授权完成后Cognito会将授权码返回至回调URL
  • 前端调用Cognito令牌端点https://auth.mywebsite.com/oauth2/token,用授权码换取access_token和id_token
  • 后续向CloudFront发起的请求,在Authorization头中携带Bearer <token>,CloudFront可通过Lambda@Edge或WAF验证令牌有效性

方案2:通过Lambda@Edge修改Cookie域

利用CloudFront的Lambda@Edge在响应阶段改写Cognito设置的Cookie域,使其作用于主域名的泛域:

  • 在CloudFront中创建一个Lambda@Edge函数(需部署至us-east-1区域),绑定到查看器响应触发器
  • 函数逻辑:当请求路径匹配Cognito回调路径时,遍历响应头的Set-Cookie字段,将域从auth.mywebsite.com替换为.mywebsite.com,同时确保Cookie的Secure属性设为true,SameSite设为Lax或None(根据跨域场景调整)
  • 示例函数代码片段:
exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;
    const headers = response.headers;

    if (headers['set-cookie']) {
        headers['set-cookie'] = headers['set-cookie'].map(cookie => {
            return cookie.replace(/domain=auth\.mywebsite\.com/, 'domain=.mywebsite.com')
                .replace(/SameSite=Strict/, 'SameSite=Lax')
                .concat('; Secure');
        });
    }

    callback(null, response);
};
  • 注意:此方案仅适用于Cognito返回的会话Cookie,需确保CloudFront能处理回调请求的响应

关键注意事项

  • 所有场景必须启用HTTPS,否则Secure属性的Cookie无法跨域携带
  • 使用泛域名Cookie(.mywebsite.com)时,需注意子域的安全风险,避免敏感Cookie被其他子域读取
  • Lambda@Edge函数需具备CloudFront调用权限,且代码需符合边缘计算的资源限制

内容的提问来源于stack exchange,提问作者Danny Ellis Jr.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:22:20