CORS Explained Properly, Once and For All

CORS errors are one of the most common sources of web developer confusion — the error appears in the browser, but the actual fix almost always belongs on the server, which is exactly where the confusion starts.

Why CORS Exists at All

The Same-Origin Policy is a browser security feature preventing a script on one origin from freely reading responses from a different origin — a genuinely important protection against a malicious site silently reading your bank’s API responses using your logged-in session. CORS is the mechanism that lets a server deliberately opt out of that restriction for specific, trusted origins.

# The SERVER must explicitly grant permission via response headers
Access-Control-Allow-Origin: https://myapp.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization

Why the Fix Belongs Server-Side

A CORS error means the server didn’t grant permission for your origin — there is no client-side JavaScript fix, because the entire point of the restriction is that the client can’t override it. Any “CORS fix” that lives purely in frontend code either isn’t a real fix, or is quietly proxying the request through your own backend to sidestep the restriction rather than actually resolving it.

The Preflight Request

For “non-simple” requests (custom headers, methods beyond GET/POST, certain content types), the browser automatically sends an OPTIONS preflight request first, checking permissions before sending the real request — a common source of “it works with curl but not the browser” confusion, since curl never sends this automatic preflight check at all.