题干与适用场景
Gateway API v1.5 将 HTTPRoute CORS 过滤器提升到 Standard channel。它允许在路由规则上声明允许的来源、方法、请求头、暴露头和预检缓存时间。题目考察你能否把跨域策略放在合适的网关边界,同时保留服务端鉴权和实现差异的验证。
面试官考察点
面试官会看你是否区分浏览器 CORS 保护、网关响应头和真正的身份授权。强回答会说明 preflight 的 OPTIONS 路径、凭据与来源配置、通配符风险、不同路由的最小权限,以及 Gateway 实现是否支持该过滤器。只写 allowOrigins: "*" 无法证明安全设计。
回答前需要澄清的问题
哪些来源和资源需要跨域
列出生产来源、预览来源、管理后台和本地开发地址,按路由而不是整个域名空间授权。来源列表应可审计、可过期,并避免把测试域名带入生产。
是否携带凭据
确认请求是否带 Cookie、HTTP 身份验证或其他凭据。凭据请求需要更严格的来源和响应头策略,不能把任意来源与凭据组合成默认配置。
谁负责鉴权与策略发布
明确 Gateway、应用服务和身份服务的职责。CORS 只决定浏览器是否允许脚本读取响应,不能代替 Token 校验、租户隔离或资源授权。
30 秒回答框架
“我先按 HTTPRoute 和业务资源划分来源,不在全局 Gateway 上放宽权限。对每条路由配置明确的 origins、methods、headers、exposeHeaders 和 maxAge;有凭据时使用受控来源并验证响应头。然后测试 OPTIONS 预检、实际请求、错误响应和缓存过期,确认 Gateway 实现支持该过滤器。最后把 CORS 作为浏览器访问控制,与服务端鉴权、审计和回滚流程分开验证。”
分步骤深入解答
第一步:按路由建立最小权限
为每个 HTTPRoute 记录资源、来源、允许方法和头部需求。公共只读资源与带凭据的账户资源应使用不同规则,避免一条宽松策略覆盖整个域名。
第二步:配置过滤器字段
根据需求设置 allowOrigins、allowMethods、allowHeaders、exposeHeaders 和 maxAge。来源模式要经过实现文档和安全评审,优先列出明确 origin,避免不必要的通配符。
第三步:正确处理预检
浏览器会发送带 Origin、Access-Control-Request-Method 和可能的 Access-Control-Request-Headers 的 OPTIONS。网关必须返回与策略一致的 CORS 响应头,并在不允许时明确拒绝,而不是把预检转发到不理解 CORS 的后端。
第四步:分离凭据和鉴权
凭据策略应与 Cookie 属性、CSRF 防护、Token 校验和服务端授权一起设计。即使浏览器阻止脚本读取响应,服务端也必须对请求本身执行身份与权限检查。
第五步:验证实现差异与发布回滚
确认使用的 Gateway controller 支持 v1.5 Standard CORS 过滤器及字段语义。用真实浏览器和 curl 复现预检、实际请求、失败状态、重定向和缓存行为,记录策略变更、指标和回滚步骤。
高质量示范回答
我会先把来源按每个 HTTPRoute 划分,公共搜索接口和带 Cookie 的账户接口不共用一条 CORS 策略。对每条规则明确允许的来源、方法、请求头、暴露头和预检缓存时间;如果需要凭据,我只允许经过审核的生产 origin。发布前用浏览器测试 OPTIONS 预检和实际请求,确认错误响应、重定向和缓存过期都不会泄露过宽权限,再用 curl 和 Gateway controller 的状态条件确认配置已生效。CORS 只负责浏览器读取边界,服务端仍执行身份、租户和资源授权;任何 controller 字段语义不一致,都先在兼容性矩阵中标记并保留应用层回退。
常见错误
- 错误表现: 全局允许任意来源。→ 失败原因: 任何路由都可能被浏览器脚本读取,审计和撤销困难。→ 修正方法: 按 HTTPRoute 建立最小来源集合。
- 错误表现: 只配置实际请求,不处理 OPTIONS。→ 失败原因: 复杂方法或请求头会先被预检阻断。→ 修正方法: 对预检和实际请求分别测试响应头与状态码。
- 错误表现: 把 CORS 当成鉴权。→ 失败原因: 非浏览器客户端仍可直接调用服务。→ 修正方法: 保留服务端身份、租户和资源授权检查。
- 错误表现: 未验证 controller 就上线 v1.5 字段。→ 失败原因: 实现可能忽略、拒绝或解释不同。→ 修正方法: 检查支持矩阵、状态条件和真实流量回放。
追问及应对
追问一:为什么不直接在应用服务设置 CORS?
应用层仍可负责资源特有策略;Gateway 适合统一处理路由级预检和跨服务边界。两层同时设置时要定义优先级,避免重复或冲突响应头。
追问二:maxAge 设置得越长越好吗?
不是。更长的预检缓存可减少 OPTIONS 流量,但会延迟策略撤销。应按变更频率、风险和浏览器行为选择,并在紧急撤销时准备版本化来源或更短 TTL。
追问三:通配符来源何时可接受?
只在资源确实公开、没有凭据且风险评估允许时考虑。账户、管理和租户数据应使用明确来源,并验证实现对通配符和凭据的处理。
追问四:如何发现某个来源被误放行?
记录 Origin、路由、预检结果和策略版本,建立来源变更审计;用自动化矩阵从允许、未允许和过期来源发起请求,发现响应头与预期不一致就阻断发布。