如何限制AWS API Gateway仅允许特定域名访问?
仅允许特定域名访问AWS HTTP API Gateway:CORS vs Lambda授权器
核心差异先理清
- CORS的定位:这是浏览器层面的跨域安全机制,只约束浏览器发起的前端请求,对Postman、后端服务、爬虫这类非浏览器客户端完全无效。它的作用是让浏览器判断"是否允许当前页面域名调用该API",即便预检不通过,请求其实还是会到达API Gateway,只是浏览器会阻止前端代码获取响应。
- Lambda授权器的作用:这是网关层面的强制访问控制,不管请求来自什么客户端,都会校验
Origin请求头,不符合规则直接返回403,从根源上拦截非法请求。
选哪种?看你的实际需求
若仅需限制前端浏览器页面的跨域访问,且不介意非浏览器客户端直接调用API:用CORS配置足够,简单高效。
- 配置方式:在API Gateway的CORS设置中,将
Allowed Origins设为https://example.com,同时开启预检请求(OPTIONS)支持。
- 配置方式:在API Gateway的CORS设置中,将
若需要彻底禁止任何非指定域名的请求(包括后端服务、爬虫等):必须用Lambda授权器,CORS挡不住这类请求。
- Lambda授权器示例逻辑(Python):
def lambda_handler(event, context): origin = event['headers'].get('origin', '').lower() allowed_origins = ['https://example.com'] if origin in allowed_origins: return { 'principalId': 'valid-origin', 'policyDocument': { 'Version': '2012-10-17', 'Statement': [ { 'Action': 'execute-api:Invoke', 'Effect': 'Allow', 'Resource': event['methodArn'] } ] } } else: return { 'principalId': 'invalid-origin', 'policyDocument': { 'Version': '2012-10-17', 'Statement': [ { 'Action': 'execute-api:Invoke', 'Effect': 'Deny', 'Resource': event['methodArn'] } ] } } - 注意:HTTP API Gateway需选择Lambda类型授权器,绑定到所有需要保护的路由上。
- Lambda授权器示例逻辑(Python):
关键提醒:别把CORS当访问控制工具
很多人误以为CORS能拦截非法请求,实际上它只是浏览器的"安全提示"——恶意请求完全可以绕过浏览器直接调用API。要实现真正的访问源限制,Lambda授权器是唯一可靠的方案。
内容的提问来源于stack exchange,提问作者Domenico
相关产品推荐
相关产品推荐

