콘텐츠로 건너뛰기

HTTP 상태 코드 완벽 가이드|일반적인 오류 원인 및 해결 방법

카테고리: HTTP·웹 개발

API를 개발하다가 422가 반환되었습니다. 프로덕션에서 갑자기 502가 나타나기 시작했습니다. 리다이렉트가 301인지 302인지에 따라 SEO 영향이 바뀝니다. HTTP 상태 코드는 웹 개발의 공용 언어이며, 이를 올바르게 이해하는 것이 문제 해결의 첫 단계입니다.

스테이터스 코드의 5 가지 카테고리

레인지카테고리의미
1xxInformational요청 수신 및 처리 중
2xxSuccess요청 성공
3xxRedirection추가 작업 필요 (리다이렉트)
4xxClient Error클라이언트 측 문제
5xxServer Error서버 측의 문제

개발자가 가장 자주 만나는 코드

200 OK — 성공

가장 기본적인 성공 응답입니다. API가 예상대로 작동하고 있습니다.

301 Moved Permanently — 영구 리다이렉트

URL이 영구적으로 변경되는 경우에 사용합니다. SEO 관점에서 기존 URL의 평가가 새 URL로 인계되므로 사이트 이전 및 HTTPS화에 필수입니다. Google은 301을 「시그널 전달」로 처리합니다.

흔한 문제: 301을 의도했는데 302를 반환하는 경우. Apache의 Redirect는 기본값이 302. Redirect 301로 명시.

302 Found — 임시 리다이렉트

임시 리다이렉트. A/B 테스트나 유지보수 중 우회에 사용됨. SEO 평가는 전달되지 않음.

304 Not Modified — 캐시 유효

브라우저가 If-Modified-Since 또는 If-None-Match 헤더로 조건부 요청을 보낸 결과 리소스가 변경되지 않았을 때 반환됩니다. 본문이 전송되지 않으므로 대역폭을 절약할 수 있습니다.

400 Bad Request — 잘못된 요청

서버가 요청을 분석할 수 없습니다. 원인: 잘못된 JSON, 필수 매개변수 누락, Content-Type 불일치.

# よくあるミス: Content-Type を指定していない
curl -X POST https://api.example.com/users -d '{"name":"Alice"}'
# → 400 (Content-Type: application/json が必要)

# 正しい
curl -X POST https://api.example.com/users \
  -H 'Content-Type: application/json' \
  -d '{"name":"Alice"}'

401 Unauthorized — 인증 필요

인증 정보가 없거나 유효하지 않습니다. Bearer 토큰의 만료, API Key 오류 등입니다.

403 Forbidden — 접근 거부

인증은 통과했지만 권한이 없습니다. 일반 사용자가 관리자 전용 엔드포인트에 접근한 경우 등입니다. 401과의 차이는 「인증 유무」vs「권한 유무」입니다.

404 Not Found — 리소스 없음

가장 유명한 오류입니다. URL 오타, 삭제된 페이지, 라우팅 설정 오류로 인해 발생합니다. SEO 측면에서 「의도적으로 삭제함」을 나타내기 위해 410 Gone을 사용하는 것이 바람직한 경우도 있습니다.

413 Payload Too Large — 크기 초과

파일 업로드에서 자주 나타납니다. Nginx의 client_max_body_size (기본값 1MB), PHP의 upload_max_filesize, API Gateway 제한을 확인하세요.

422 Unprocessable Entity — 유효성 검사 에러

JSON 구문은 올바르지만 비즈니스 로직상 유효하지 않음 (잘못된 이메일 형식, 필수 필드가 비어 있음 등). REST API의 유효성 검사 오류는 이것을 반환하는 것이 일반적입니다.

429 Too Many Requests — 속도 제한

짧은 시간에 너무 많은 요청을 보냈습니다. Retry-After 헤더에 대기할 초 단위 시간이 표시됩니다. 대책: 지수 백오프 (exponential backoff)를 구현합니다.

500 Internal Server Error — 서버 내부 에러

처리되지 않은 예외, NULL 참조, 설정 파일 오류. 가장 위험한 오류. 서버 로그를 반드시 확인하세요.

502 Bad Gateway — 업스트림 서버 이상

리버스 프록시 (Nginx)가 업스트림 PHP-FPM / Node.js / Python WSGI에 연결하지 못했거나 잘못된 응답을 받았습니다. 업스트림 프로세스 재시작, 메모리 부족, 소켓 연결 타임아웃을 확인하십시오.

503 Service Unavailable — 서비스 일시 중단

유지 관리 중이거나 과부하 상태. Retry-After 헤더를 포함하여 클라이언트에 대기를 알립니다.

504 Gateway Timeout — 업스트림 타임아웃

업스트림 서버가 시간 내에 응답하지 않았음. 무거운 DB 쿼리, 외부 API 지연. Nginx의 proxy_read_timeout을 확인하세요.

DevLab 상태 코드 검색 도구

HTTP 상태 코드 검색 도구에서는 코드 번호나 키워드 (예: "redirect", "forbidden", "timeout")로 즉시 검색할 수 있으며, 각 코드의 의미・원인・대처법을 목록에서 확인할 수 있습니다. 브라우저에서 완결되며 등록이 필요 없습니다.

관련 도구: HTTP 헤더 검증, 리다이렉트 체인 추적, 보안 진단.

요약

HTTP 상태 코드는 서버와 클라이언트의 공통 언어입니다. 특히 301 vs 302의 SEO 영향, 400 vs 422의 검증 구분, 5xx의 인프라 진단은 빈출 지식입니다. 막히면 먼저 상태 코드를 확인하고 위의 대처법을 적용하세요.

❓ 자주 묻는 질문

401 과 403 은 어떻게 구분해 쓰나요?
401 은 당신이 누구인지 모른다, 403 은 누구인지는 알지만 권한이 없다는 뜻입니다. 401 을 반환할 때는 WWW-Authenticate 헤더를 붙이는 것이 사양상 요건이며, 클라이언트는 재인증하면 통과할 수 있다고 판단합니다. 403 은 재인증해도 결과가 바뀌지 않으므로 로그인 화면으로 보내는 것은 잘못입니다.
301 과 308, 302 와 307 의 차이는 무엇인가요?
메서드를 유지하는지 여부만 다릅니다. 301 과 302 는 역사적 경위 때문에 브라우저가 POST 를 GET 으로 바꿔 버리지만 308 과 307 은 원래 메서드와 본문을 그대로 유지합니다. 폼 전송 대상을 옮길 때 301 을 쓰면 본문이 사라지므로 API 리다이렉트에는 308 / 307 을 고르세요.
오류 시 200 을 반환하고 본문에 에러를 쓰면 안 되나요?
피하세요. CDN, 재시도 로직, 모니터링, 검색 엔진은 모두 상태 코드만 보고 판단합니다. 200 을 반환하면 실패 응답이 캐시되고 에러율 그래프에는 아무것도 나오지 않으며 존재하지 않는 페이지가 검색 결과에 실립니다. 검증 실패는 422, 권한 부족은 403 처럼 의미에 맞는 코드를 반환하는 것이 가장 저렴한 관측성입니다.