흔한 에러들 — CORS, 404, 500 해결법
CORS 에러, 404, 500 — 웹 개발에서 가장 자주 만나는 에러의 원인과 해결법.
에러는 버그가 아니라 '단서'다. 에러 메시지를 읽을 수 있으면 문제 해결 속도가 10배 빨라진다. Claude Code에게 에러를 설명할 때도 '그냥 안 돼요'보다 '404가 뜹니다'가 훨씬 빠른 해결을 이끈다.
웹 개발을 하다 보면 반복적으로 만나는 에러가 있습니다. 이 에러들의 의미만 알면 절반은 해결된 셈입니다.
CORS 에러 — 가장 당혹스러운 에러 1위. `Access to fetch at 'https://api.example.com' from origin 'http://localhost:3000' has been blocked by CORS policy` 원인: 브라우저는 보안상 다른 출처(도메인)의 API를 호출하는 것을 기본적으로 차단합니다. `localhost:3000`에서 `api.example.com`은 다른 출처이므로 차단됩니다. 비유: 아파트 경비원이 '외부인 출입 금지'로 설정되어 있는 상황. 경비원(브라우저)에게 '이 사람은 허용된 사람이에요'라고 알려줘야 합니다.
// CORS 해결법 1: 백엔드에서 허용 헤더 추가 (가장 정석)
// Next.js API Route 예시
export async function GET() {
return new Response(JSON.stringify({ data: "hello" }), {
headers: {
"Access-Control-Allow-Origin": "http://localhost:3000",
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE",
},
});
}
// CORS 해결법 2: Next.js rewrites로 프록시 (프론트에서 해결)
// next.config.ts
const nextConfig = {
async rewrites() {
return [
{
source: "/api/external/:path*",
destination: "https://api.example.com/:path*",
},
];
},
};CORS는 백엔드에서 허용 헤더를 추가하거나, 프론트에서 프록시(rewrites)를 설정해서 해결한다.
| 에러 코드 | 의미 | 흔한 원인 | 해결 방향 |
|---|---|---|---|
| 404 Not Found | 페이지/API를 찾을 수 없음 | URL 오타, 라우트 미등록, 파일 이름 오류 | URL 확인 → 라우트 파일 존재 여부 확인 |
| 500 Internal Server Error | 서버 내부 오류 | 코드 버그, DB 연결 실패, 환경변수 누락 | 서버 로그 확인 → 에러 스택 트레이스 읽기 |
| 401 Unauthorized | 인증 실패 | API 키 만료, 토큰 누락 | 인증 토큰/API 키 확인 |
| 403 Forbidden | 권한 없음 | 관리자 전용 페이지에 일반 사용자 접근 | 권한 설정 확인 |
| CORS | 교차 출처 차단 | 다른 도메인 API 호출 시 허용 헤더 미설정 | 백엔드에 CORS 헤더 추가 |
디버깅 순서 체계 — 에러를 만났을 때 당황하지 않고 따라갈 수 있는 5단계: 1. 에러 메시지를 읽는다 — 90%의 답이 에러 메시지 안에 있습니다. 2. 브라우저 개발자 도구(F12) → Console 탭 — 프론트엔드 에러 확인. 3. 터미널 로그 — 백엔드(서버) 에러 확인. `npm run dev` 실행 중인 터미널에 빨간 글씨가 뜹니다. 4. Network 탭 — API 호출의 Status Code, Request/Response 확인. 5. Claude Code에게 에러 메시지를 그대로 붙여넣기 — Claude가 원인과 해결책을 알려줍니다. 가장 중요한 원칙: 에러 메시지를 무시하지 마세요. 에러는 '뭐가 잘못됐는지' 정확히 알려주는 친절한 메시지입니다.
실전 팁: Claude Code에게 에러를 물어볼 때, "안 돼요"보다 에러 메시지를 그대로 복사해서 보내세요. - 나쁜 예: "API가 안 돼요." - 좋은 예: "`GET /api/users` 호출 시 `500 Internal Server Error` 발생. 터미널에 `Error: connect ECONNREFUSED 127.0.0.1:5432` 출력." 두 번째 질문을 받은 Claude는 즉시 'DB 연결 실패 → PostgreSQL이 실행 중인지 확인'이라고 답할 수 있습니다.
브라우저에서 다른 출처의 API를 호출할 때 발생하는 보안 차단 에러는?
서버 내부 오류를 나타내는 HTTP 상태 코드는?
404 에러는 서버의 코드에 버그가 있을 때 발생한다.