---
type: note
title: CORS error 원인 찾기
description: LB 의 5xx 도 앱의 404 도 브라우저에는 CORS error 로 보인다. preflight 의 status 와 server 헤더로 인프라·경로·CORS 를 가른다.
tags: ['cors', 'preflight', 'alb', 'http', 'debug']
status: release
ctime: 2026-09-04
mtime: 2026-09-29
generated: { by: claude/opus-5, at: 2026-09-04T00:00:00Z }
---

| 언제                                     | 왜                                                                                                                                                                                                              |
| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Console·Network 에 `CORS error`          | preflight 에 [`Access-Control-Allow-Origin`(ACAO)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Access-Control-Allow-Origin) 이 없으면 브라우저는 5xx·404·타임아웃을 전부 CORS 로 뭉갠다 |
| preflight 가 `server: awselb/2.0` 의 5xx | LB 가 타깃에 닿기 전에 직접 만든 응답이다 — 앱을 안 거쳤으니 CORS 헤더가 붙을 수 없다                                                                                                                           |

![정상이면 OPTIONS 가 LB 를 지나 앱에 닿고 앱이 204 와 access-control-allow-origin 을 돌려준다. 장애면 healthy 타깃이 0 이라 LB 가 CORS 헤더 없는 503 을 직접 만들어 돌려주고, 브라우저는 그걸 CORS error 로 표시한다.](/svg/cors_preflight_lb_503.svg)

preflight 의 status 와 `server` 헤더 둘로 가른다.

| preflight   | server     | ACAO | 갈래       | 원인                                                             |
| ----------- | ---------- | ---- | ---------- | ---------------------------------------------------------------- |
| `503`       | awselb/2.0 | 없음 | **인프라** | healthy target 0 — 서비스 다운·배포 실패·CrashLoop               |
| `502`       | awselb/2.0 | 없음 | **인프라** | 타깃이 끊거나 잘못 응답 — 크래시·OOM·포트 불일치                 |
| `504`       | awselb/2.0 | 없음 | **인프라** | LB idle timeout 초과 — 느린 쿼리·외부 연동 지연                  |
| `404`       | 앱         | 없음 | **경로**   | path 오타, ingress rule 불일치                                   |
| `204`·`200` | 앱         | 없음 | **CORS**   | CORS 미설정                                                      |
| `204`       | 앱         | 있음 | **CORS**   | `access-control-allow-headers` 에 요청 헤더가 빠짐               |
| `204`       | 앱         | `*`  | **CORS**   | `credentials: 'include'` 와 `*` 는 병용 불가 — 오리진을 명시한다 |
| `204`       | 앱         | 정상 | **정상**   | CORS 아님. 본 요청의 본문·인증·에러를 본다                       |
