HTTP 상태코드 정리표
HTTP/1.1 표준 상태코드를 분류별로 정리했습니다. 자주 쓰는 코드는 굵게 표시되어 있습니다.
| 코드 | 이름 | 설명 |
|---|---|---|
| 100 | Continue | 요청의 일부를 받았으며, 클라이언트는 계속 요청을 진행해야 합니다. |
| 101 | Switching Protocols | 서버가 클라이언트 요청에 따라 프로토콜을 전환합니다(예: WebSocket). |
| 102 | Processing | 요청을 받았으나 아직 처리 중임을 나타냅니다(WebDAV). |
| 200 | OK | 요청이 성공적으로 처리되었습니다. |
| 201 | Created | 요청이 성공적으로 처리되어 새로운 리소스가 생성되었습니다. |
| 202 | Accepted | 요청이 접수되었으나 처리는 완료되지 않았습니다. |
| 204 | No Content | 요청은 성공했으나 응답 본문이 없습니다. |
| 206 | Partial Content | 범위 요청(Range)에 대한 일부 응답입니다. |
| 301 | Moved Permanently | 요청한 리소스가 영구적으로 이동되었습니다. SEO에서 가장 많이 쓰입니다. |
| 302 | Found | 요청한 리소스가 임시적으로 다른 위치에 있습니다. |
| 303 | See Other | 다른 URI에서 GET으로 요청해야 합니다(POST 후 리다이렉트 패턴). |
| 304 | Not Modified | 캐시된 버전이 여전히 유효합니다. 본문을 전송하지 않습니다. |
| 307 | Temporary Redirect | 임시 리다이렉트. 메소드를 유지합니다. |
| 308 | Permanent Redirect | 영구 리다이렉트. 메소드를 유지합니다. |
| 400 | Bad Request | 요청 구문이 잘못되어 서버가 처리할 수 없습니다. |
| 401 | Unauthorized | 인증이 필요합니다. 로그인되지 않았거나 토큰이 유효하지 않습니다. |
| 403 | Forbidden | 인증은 됐지만 해당 리소스에 접근할 권한이 없습니다. |
| 404 | Not Found | 요청한 리소스를 찾을 수 없습니다. |
| 405 | Method Not Allowed | 허용되지 않은 HTTP 메소드입니다. |
| 408 | Request Timeout | 요청 시간이 초과되었습니다. |
| 409 | Conflict | 요청이 현재 서버 상태와 충돌합니다. |
| 410 | Gone | 요청한 리소스가 영구적으로 삭제되었습니다. |
| 413 | Payload Too Large | 요청 본문이 너무 큽니다. RFC 9110에서 명칭이 Content Too Large로 변경됐습니다(기존 명칭도 통용). |
| 415 | Unsupported Media Type | 지원하지 않는 미디어 타입입니다. |
| 418 | I'm a teapot | 농담 코드(RFC 2324). 실제 표준은 아닙니다. |
| 422 | Unprocessable Entity | 요청 형식은 맞지만 의미적으로 처리할 수 없습니다(검증 실패 등). RFC 9110에서 명칭이 Unprocessable Content로 변경됐습니다(기존 명칭도 통용). |
| 429 | Too Many Requests | 요청 횟수가 제한을 초과했습니다(Rate Limit). |
| 500 | Internal Server Error | 서버 내부 오류가 발생했습니다. |
| 501 | Not Implemented | 요청한 기능을 서버가 지원하지 않습니다. |
| 502 | Bad Gateway | 게이트웨이/프록시가 백엔드로부터 잘못된 응답을 받았습니다. |
| 503 | Service Unavailable | 서버가 일시적으로 요청을 처리할 수 없습니다(과부하ㆍ점검). |
| 504 | Gateway Timeout | 게이트웨이/프록시가 백엔드 응답을 기다리는 동안 시간이 초과되었습니다. |
| 505 | HTTP Version Not Supported | 요청한 HTTP 버전을 서버가 지원하지 않습니다. |
상태코드 분류
- 1xx 정보: 요청을 받았으며 처리 중임을 나타냅니다.
- 2xx 성공: 요청이 정상적으로 처리되었습니다.
- 3xx 리다이렉션: 요청 완료를 위해 추가 동작이 필요합니다.
- 4xx 클라이언트 오류: 요청 자체에 문제가 있습니다.
- 5xx 서버 오류: 서버가 요청을 처리하지 못했습니다.
흔히 헷갈리는 상태 코드 페어
의미가 비슷해 보이지만 사용처와 의도가 다른 상태 코드 쌍입니다. 스키마 마크업ㆍJSON 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에 등록된 코드입니다. 표준 사용은 아니며 일부 서비스가 이스터에그로 활용합니다.