CORS (Cross-Origin Resource Sharing) 是 Web 浏览器控制不同源之间资源共享的安全机制。源指协议、域名和端口的组合。它放宽同源策略,用于允许正当的跨源请求。
例如,从 `https://app.example.com` 的前端向 `https://api.example.com` 的 API 发送请求时,由于子域名不同,这属于「跨源」,若 API 服务器一侧不设置 CORS 响应头,浏览器就会拦截响应。要设置的响应头是 `Access-Control-Allow-Origin`,在其中指定允许的源。
CORS 中最容易被忽略的是预检请求。对于 `GET` 和 `POST` 之外的方法,或包含自定义请求头的请求,浏览器会在正式请求之前先用 `OPTIONS` 方法确认「这个请求可以发送吗?」。若服务器一侧没有对 `OPTIONS` 请求做出恰当响应,正式请求就不会被发送。在 API Gateway 或 Lambda 上配置 CORS 时忘记处理 `OPTIONS`,是实务中最常见的问题。
`Access-Control-Allow-Origin: *` 即允许所有源,开发阶段很方便,但生产环境中无法与包含认证信息 (Cookie) 的请求并用。需要认证的 API,必须明确指定允许的源,并设置 `Access-Control-Allow-Credentials: true`。
从外部调用短链接服务的 API 时,CORS 的设置是必不可少的。