HTTP 상태코드 정리표
HTTP/1.1 표준 상태코드를 분류별로 정리했습니다. 자주 쓰는 코드는 굵게 표시되어 있습니다.
| 코드 | 이름 | 설명 |
|---|
상태코드 분류
- 1xx 정보: 요청을 받았으며 처리 중임을 나타냅니다.
- 2xx 성공: 요청이 정상적으로 처리되었습니다.
- 3xx 리다이렉션: 요청 완료를 위해 추가 동작이 필요합니다.
- 4xx 클라이언트 오류: 요청 자체에 문제가 있습니다.
- 5xx 서버 오류: 서버가 요청을 처리하지 못했습니다.
흔히 헷갈리는 상태 코드 페어
의미가 비슷해 보이지만 사용처와 의도가 다른 상태 코드 쌍입니다. SEOㆍAPI 설계ㆍ디버깅에서 자주 잘못 사용됩니다.
200 OK vs 204 No Content
- 200 - 응답 본문에 내용이 있음. 일반 GETㆍPOST 응답.
- 204 - 처리는 성공했지만 응답 본문 없음. DELETEㆍPUT 후 재조회 없이 끝낼 때.
- 흔한 실수 - DELETE 성공 시 200으로 빈 객체
{}를 보내는 것보다 204가 의도를 더 잘 표현합니다.
301 vs 302 vs 307 vs 308 - 리다이렉트 4종
- 301 Moved Permanently - 영구 이동. 검색엔진이 새 URL로 권위ㆍ인덱스를 이전. URL 변경ㆍ도메인 이전에 사용.
- 302 Found - 임시 이동. 권위 이전 안 됨. A/B 테스트ㆍ일시 점검 페이지에 사용.
- 307 Temporary Redirect - 302와 같지만 메서드(POST 등)를 그대로 유지. 302는 일부 클라이언트가 GET으로 바꾸므로 안전한 대안.
- 308 Permanent Redirect - 301과 같지만 메서드 유지. POST 영구 리다이렉트에 사용.
- 흔한 실수 - 영구 이전인데 302를 쓰면 새 URL이 검색에 색인되지 않아 SEO 손실이 큽니다.
401 Unauthorized vs 403 Forbidden
- 401 - "당신이 누구인지 모르겠다" - 인증(로그인) 필요. 자격증명 제공 시 접근 가능.
- 403 - "당신이 누구인지 알지만 권한이 없다" - 인증은 됐지만 권한 부족. 자격증명을 다시 보내도 결과 동일.
- 흔한 실수 - 로그인 안 된 사용자에게 403을 주면 클라이언트가 재로그인 유도를 못 합니다.
404 Not Found vs 410 Gone
- 404 - 현재 없음. 일시적일 수도, 영구일 수도. 검색엔진은 한동안 재방문.
- 410 - 영구 삭제. 검색엔진이 빠르게 인덱스에서 제거. 폐쇄된 콘텐츠는 410이 정확.
- 흔한 실수 - 폐쇄한 페이지를 404로 두면 검색결과에 오래 남습니다. 410으로 명시하면 정리가 빠릅니다.
500 vs 502 vs 503 vs 504 - 서버 오류 4종
- 500 Internal Server Error - 애플리케이션 코드 오류ㆍ예외. 디버깅 대상.
- 502 Bad Gateway - 게이트웨이(NginxㆍCDN)가 백엔드로부터 잘못된 응답을 받음. 백엔드 다운ㆍ타임아웃 의심.
- 503 Service Unavailable - 일시적 과부하ㆍ점검 중.
Retry-After헤더와 함께 사용. - 504 Gateway Timeout - 게이트웨이가 백엔드 응답을 기다리다 타임아웃. 502와 달리 응답 자체가 안 옴.
- 흔한 실수 - 점검 페이지를 200으로 응답하면 검색엔진이 점검 페이지를 정상 콘텐츠로 색인합니다. 503 + Retry-After가 정답.
400 Bad Request vs 422 Unprocessable Entity
- 400 - 요청 형식(문법) 자체가 잘못. JSON 파싱 실패ㆍ필수 헤더 누락 등.
- 422 - 형식은 맞지만 의미상 처리 불가. 필수 필드 누락ㆍ검증 실패.
- 흔한 실수 - 입력 검증 오류를 모두 400으로 처리하면 클라이언트가 파싱 오류와 검증 오류를 구분 못 합니다.
자주 묻는 질문
401과 403의 차이는 무엇인가요?
401(Unauthorized)은 인증이 필요한 상태(로그인 안 됨), 403(Forbidden)은 인증은 됐지만 권한이 없는 상태입니다.
301과 302의 차이는 무엇인가요?
301(Moved Permanently)은 영구 이동, 302(Found)는 임시 이동입니다. SEO에서는 영구 이동인 경우 301을 써야 검색엔진이 새 URL의 권위를 이전합니다.
500과 502의 차이는 무엇인가요?
500(Internal Server Error)은 서버 내부 오류, 502(Bad Gateway)는 게이트웨이/프록시가 백엔드 서버로부터 잘못된 응답을 받았을 때 발생합니다.
418 I'm a teapot이 진짜 표준인가요?
1998년 만우절에 정의된 농담 RFC(RFC 2324)이지만 실제로 IANA에 등록된 코드입니다. 표준 사용은 아니며 일부 서비스가 이스터에그로 활용합니다.