S3+CloudFront架构下限制仅自有网站访问负载均衡后API的问题咨询
S3+CloudFront架构下限制仅自有网站访问负载均衡后API的问题咨询
你完全猜对了!这里的流量路径确实是你后来想的那样:当用户打开xyz.com时,CloudFront只负责把S3上的静态资源(HTML、JS、CSS这些)返回给用户的浏览器;等页面加载完成后,浏览器会直接向你的API发起请求,而不是通过CloudFront中转这个API请求。这就是为什么你给负载均衡安全组配置CloudFront前缀列表后,网站反而无法访问API——因为实际的请求来源是用户的浏览器IP,根本不是CloudFront的IP段。
接下来给你几个可行的解决方案,根据你的场景选择:
基础防护:验证HTTP Referer/Origin头
在负载均衡或者后端API服务中添加逻辑,检查请求的Referer或Origin头是否匹配https://xyz.com(或者你的网站域名的相关前缀)。不过要注意,这类HTTP头是可以被篡改的,所以这只能作为基础的防护手段,适合非敏感的API场景。更可靠的防护:使用AWS WAF
把AWS WAF关联到你的负载均衡,创建自定义规则组合来限制访问:- 优先检查请求的
Origin头是否严格等于你的网站域名; - 辅助验证
Referer头作为补充; - 还可以结合IP限制、请求频率控制等规则,进一步提升安全性。WAF的规则是在负载均衡层面生效,不需要修改后端API代码,配置起来比较灵活。
- 优先检查请求的
推荐方案:将API也纳入CloudFront分发(端到端控制)
这是最规范的做法,能彻底解决你的访问控制问题:- 在CloudFront中添加新的源,指向你的负载均衡;
- 创建CloudFront行为,比如把
/api/*路径的请求转发到这个新源,同时设置缓存策略为“不缓存”(因为API请求通常是动态的); - 此时你就可以给负载均衡的安全组只开放CloudFront的前缀列表了——因为所有API请求都会先经过CloudFront,再转发到负载均衡;
- 最后在CloudFront中配置**Origin Access Control(OAC)**或者使用签名Cookie,确保只有你的xyz.com网站能触发这些API请求,从根源上限制非法访问。
另外要注意,如果采用第三种方案,需要在CloudFront或者后端API配置正确的CORS响应头,允许https://xyz.com的跨域请求,避免浏览器的跨域拦截。
备注:内容来源于stack exchange,提问作者April Henig
相关产品推荐
相关产品推荐

