Reference

CORS Headers Cheat Sheet

Quick reference for every CORS header — what the browser sends, what your server must return, and what each one does.

Request headers (browser → server)

HeaderWhen sentExample
OriginEvery cross-origin requestOrigin: https://app.example.com
Access-Control-Request-MethodPreflight OPTIONS onlyAccess-Control-Request-Method: POST
Access-Control-Request-HeadersPreflight OPTIONS onlyAccess-Control-Request-Headers: Authorization, Content-Type

Response headers (server → browser)

HeaderRequired?ExampleNotes
Access-Control-Allow-OriginYeshttps://app.example.com or *Cannot use * with credentials
Access-Control-Allow-MethodsOn preflightGET, POST, PUT, DELETE, OPTIONSMust include the requested method
Access-Control-Allow-HeadersOn preflightAuthorization, Content-TypeMust include requested headers
Access-Control-Allow-CredentialsWith cookies/authtrueOnly valid with explicit origin, not *
Access-Control-Max-AgeOptional86400Seconds to cache preflight. Default varies by browser.
Access-Control-Expose-HeadersOptionalX-Request-ID, X-Rate-LimitHeaders JavaScript can read beyond the safe list
VaryWith explicit originsOriginPrevents CDN from serving one origin's response to another

The safe response headers (no Expose-Headers needed)

By default, JavaScript can only read these response headers without Access-Control-Expose-Headers:

To expose other headers (like X-Rate-Limit, X-Request-ID), add them to Access-Control-Expose-Headers.

Minimal working CORS for a public API

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type

CORS for authenticated API with cookies

Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Authorization, Content-Type
Access-Control-Max-Age: 86400
Vary: Origin
Test your CORS headers live → CORSFixer