네트워크
HTTP 상태 코드 목록
개발자를 위한 HTTP 상태 코드(1xx-5xx) 전체 목록으로, 의미와 흔한 원인, 해결 방법을 정리했습니다. 조회 도구가 내장되어 있어 코드 번호를 입력하면 바로 상세 정보를 확인할 수 있습니다.
| 코드 | 이름 | 의미 | 흔한 원인 |
|---|---|---|---|
| 1xx — 정보성 응답 | |||
| 100 | Continue (Continue) | 서버가 요청의 첫 부분을 수신했으며 클라이언트가 나머지를 계속 전송해야 함을 나타냅니다. | 클라이언트가 큰 요청 본문을 보내기 전에 Expect: 100-continue 헤더를 보낼 때 반환됩니다. |
| 101 | Switching Protocols (Switching Protocols) | 서버가 Upgrade 헤더 요청을 수락하여 다른 프로토콜로 전환하고 있음을 나타냅니다. | WebSocket 연결을 수립할 때 흔히 볼 수 있는 정상적인 응답입니다. |
| 102 | Processing (Processing) | 서버가 요청을 접수하여 처리 중이지만 아직 응답을 준비하지 못했음을 나타냅니다(WebDAV). | 장시간 실행되는 WebDAV 작업에서 타임아웃을 방지하기 위해 전송됩니다. |
| 103 | Early Hints (Early Hints) | 최종 응답 이전에 Link 등의 예비 헤더를 보내 브라우저가 리소스를 미리 로드할 수 있게 합니다. | CDN이나 리버스 프록시가 CSS/JS의 사전 로딩 속도를 높이기 위해 추가합니다. |
| 2xx — 성공 | |||
| 200 | OK (OK) | 가장 흔한 성공 응답으로, 요청이 정상적으로 처리되었음을 나타냅니다. | |
| 201 | Created (Created) | 요청의 결과로 새로운 리소스가 생성되었음을 나타냅니다. | POST로 리소스를 생성하는 API가 반환하며, 일반적으로 새 리소스를 가리키는 Location 헤더가 포함됩니다. |
| 202 | Accepted (Accepted) | 요청은 접수되었지만 처리가 아직 완료되지 않았음을 나타냅니다(비동기 처리). | 작업을 큐에 넣기만 하는 비동기 API나 일괄 처리 접수 엔드포인트에서 사용됩니다. |
| 204 | No Content (No Content) | 요청은 성공했지만 반환할 콘텐츠가 없음을 나타냅니다. | DELETE 요청 성공 후, 또는 API 설계상 응답 본문을 생략하는 PUT 업데이트에서 흔히 발생합니다. |
| 206 | Partial Content (Partial Content) | 클라이언트의 Range 헤더에 따라 리소스의 일부만 반환되었음을 나타냅니다. | 동영상 탐색(seek)이나 이어받기 다운로드 시의 정상적인 응답입니다. |
| 3xx — 리다이렉션 | |||
| 301 | Moved Permanently (Moved Permanently) | 리소스가 새로운 URL로 영구적으로 이동했음을 나타내며, 검색엔진은 순위 신호를 새 URL로 이전합니다. | URL 구조 변경이나 도메인 이전 후 이전 URL을 리다이렉트하는 데 사용됩니다. |
| 302 | Found (Found) | 리소스가 일시적으로 다른 URL에 있음을 나타냅니다. 영구 이동에는 301을 사용해야 합니다. | 점검 중의 임시 라우팅이나 로그인 후 리다이렉트에 흔히 사용됩니다. |
| 303 | See Other (See Other) | 결과를 다른 URL에서 GET으로 가져와야 함을 나타냅니다(Post-Redirect-Get 패턴). | 폼 제출(POST) 후 브라우저의 재제출 대화 상자를 방지하기 위해 사용됩니다. |
| 304 | Not Modified (Not Modified) | 캐시된 리소스가 변경되지 않았으므로 본문을 다시 전송하지 않음을 나타냅니다. | 캐시가 여전히 유효할 때 If-None-Match / If-Modified-Since를 사용하는 조건부 요청에 대해 반환됩니다. |
| 307 | Temporary Redirect (Temporary Redirect) | 302와 달리 재전송 시 원래의 메서드와 본문을 그대로 유지하는 임시 리다이렉트입니다. | 본문을 유지한 채 POST/PUT 요청을 리다이렉트해야 하는 API 설계에 사용됩니다. |
| 308 | Permanent Redirect (Permanent Redirect) | 301과 달리 재전송 시 원래의 메서드와 본문을 그대로 유지하는 영구 리다이렉트입니다. | 메서드를 유지하면서 영구 이동이 필요한 API 버전 마이그레이션에 사용됩니다. |
| 4xx — 클라이언트 오류 | |||
| 400 | Bad Request (Bad Request) | 요청의 구문이나 매개변수 형식이 잘못되어 서버가 이해할 수 없음을 나타냅니다. | 일반적으로 JSON 구문 오류, 필수 매개변수 누락, 타입 불일치 등으로 발생합니다. |
| 401 | Unauthorized (Unauthorized) | 인증 정보가 없거나 유효하지 않음을 나타냅니다(이름과 달리 실제로는 "미인증"을 의미합니다). | 토큰 만료, Authorization 헤더 누락, API 키 오류 등이 흔한 원인입니다. |
| 402 | Payment Required (Payment Required) | 향후 사용을 위해 예약된 코드로, 때때로 결제가 필요함을 나타내는 데 사용됩니다. | 일부 API는 사용량 한도 초과나 결제 플랜 만료를 알리는 용도로 이 코드를 재활용합니다. |
| 403 | Forbidden (Forbidden) | 서버가 요청을 이해했지만 권한 부여를 거부했음을 나타냅니다. | 권한 부족, IP 제한, CORS 정책 위반, 파일 권한 설정 오류 등이 흔한 원인입니다. |
| 404 | Not Found (Not Found) | 요청한 리소스를 찾을 수 없음을 나타냅니다. | 등록되지 않은 라우트, URL 오타, 이미 삭제된 리소스에 접근하는 경우 등으로 흔히 발생합니다. |
| 405 | Method Not Allowed (Method Not Allowed) | 리소스는 존재하지만 지정된 HTTP 메서드가 허용되지 않음을 나타냅니다. | GET 전용 엔드포인트에 POST를 보내는 등 메서드 불일치 시 흔히 발생합니다. |
| 406 | Not Acceptable (Not Acceptable) | 서버가 클라이언트의 Accept 헤더 요구 사항에 맞는 응답을 생성할 수 없음을 나타냅니다. | 예를 들어 JSON만 반환하는 API에 Accept: application/xml을 요청할 때 발생합니다. |
| 408 | Request Timeout (Request Timeout) | 서버가 클라이언트의 요청 완료를 기다리다 시간이 초과되었음을 나타냅니다. | 느린 네트워크 연결, 대용량 업로드, 요청 도중 멈춘 클라이언트 등이 흔한 원인입니다. |
| 409 | Conflict (Conflict) | 요청이 리소스의 현재 상태와 충돌함을 나타냅니다. | 동시 편집 시 발생하는 낙관적 잠금 충돌이나 중복 생성 시도 등에서 발생합니다. |
| 410 | Gone (Gone) | 리소스가 영구적으로 삭제되어 다시 돌아오지 않음을 나타냅니다(404보다 강력한 신호). | 콘텐츠가 의도적으로 삭제되어 폐기되었음을 검색엔진에 명확히 알리는 데 사용됩니다. |
| 413 | Payload Too Large (Payload Too Large) | 요청 본문의 크기가 서버가 허용하는 크기를 초과함을 나타냅니다. | 파일 업로드 크기 제한 초과나 Nginx/PHP의 본문 크기 설정 부족으로 흔히 발생합니다. |
| 414 | URI Too Long (URI Too Long) | 요청 URI의 길이가 서버가 처리할 수 있는 범위를 초과함을 나타냅니다. | GET 쿼리 매개변수에 많은 데이터를 담을 때 흔히 발생합니다. |
| 415 | Unsupported Media Type (Unsupported Media Type) | 서버가 요청 본문의 미디어 타입을 지원하지 않음을 나타냅니다. | JSON API에 Content-Type: text/plain을 보내는 등 헤더 설정 오류 시 흔히 발생합니다. |
| 422 | Unprocessable Entity (Unprocessable Entity) | 요청 구문은 올바르지만 의미론적 검증에 실패했음을 나타냅니다. | 필수 항목 누락이나 형식 오류 등 폼 검증 오류를 보고하는 데 자주 사용됩니다. |
| 425 | Too Early (Too Early) | 조기 데이터 위험으로 인해 재전송될 수 있는 요청의 처리를 서버가 거부함을 나타냅니다. | TLS 1.3의 0-RTT 데이터를 이용한 재전송 공격에 대한 방어 수단으로 반환될 수 있습니다. |
| 429 | Too Many Requests (Too Many Requests) | 클라이언트가 주어진 시간 내에 너무 많은 요청을 보냈음을 나타냅니다(속도 제한). | API 요청 한도 초과로 발생하며, Retry-After 헤더가 재시도까지 기다려야 할 시간을 알려주는 경우가 많습니다. |
| 451 | Unavailable For Legal Reasons (Unavailable For Legal Reasons) | 법원 명령과 같은 법적 요구로 인해 콘텐츠를 이용할 수 없음을 나타냅니다. | 콘텐츠 제공자가 저작권 클레임이나 특정 국가의 법령에 따라 접근을 차단할 때 반환됩니다. |
| 5xx — 서버 오류 | |||
| 500 | Internal Server Error (Internal Server Error) | 서버에서 예기치 않은 오류가 발생하여 요청을 처리할 수 없음을 나타냅니다. | 애플리케이션의 처리되지 않은 예외, 설정 오류, 데이터베이스 연결 실패 등 원인이 매우 다양합니다. |
| 501 | Not Implemented (Not Implemented) | 서버가 요청을 처리하는 데 필요한 기능을 지원하지 않음을 나타냅니다. | 구버전 서버 구현에 아직 구현되지 않은 HTTP 메서드(예: PATCH)를 보낼 때 발생합니다. |
| 502 | Bad Gateway (Bad Gateway) | 프록시나 게이트웨이가 업스트림 서버로부터 유효하지 않은 응답을 받았음을 나타냅니다. | 업스트림 애플리케이션 서버가 다운되었거나 충돌한 경우 흔히 발생합니다. |
| 503 | Service Unavailable (Service Unavailable) | 서버가 일시적으로 과부하 상태이거나 점검 중이어서 요청을 처리할 수 없음을 나타냅니다. | 주로 높은 부하로 인한 리소스 고갈이나 계획된 점검 시간으로 인해 발생합니다. |
| 504 | Gateway Timeout (Gateway Timeout) | 프록시나 게이트웨이가 업스트림 서버로부터 제때 응답을 받지 못했음을 나타냅니다. | 백엔드 처리 지연, 네트워크 지연, 응답이 멈춘 업스트림 서버 등으로 흔히 발생합니다. |
| 505 | HTTP Version Not Supported (HTTP Version Not Supported) | 서버가 요청에 사용된 HTTP 버전을 지원하지 않음을 나타냅니다. | 오래된 클라이언트나 설정이 잘못된 프록시가 예상치 못한 HTTP 버전으로 통신할 때 발생합니다. |
| 507 | Insufficient Storage (Insufficient Storage) | 서버에 요청을 완료할 충분한 저장 공간이 없음을 나타냅니다(WebDAV). | 디스크 공간 부족으로 파일 저장 작업이 실패할 때 반환됩니다. |
| 508 | Loop Detected (Loop Detected) | 서버가 요청 처리 중 무한 루프를 감지했음을 나타냅니다(WebDAV). | WebDAV 바인딩 설정에 순환 참조가 있을 때 발생합니다. |
| 511 | Network Authentication Required (Network Authentication Required) | 클라이언트가 네트워크 접근 권한을 얻으려면 인증이 필요함을 나타냅니다. | 공공 와이파이 등에서 캡티브 포털 로그인 페이지로 리다이렉트하는 데 사용됩니다. |
팁
- 404와 410은 비슷해 보이지만, 410은 콘텐츠가 의도적으로 삭제되었으며 다시 돌아오지 않는다는 것을 명확히 알립니다. 대체 콘텐츠가 없는 페이지에는 410을 사용해 검색엔진에 더 명확한 신호를 전달하세요.
- 301과 308, 302와 307은 각각 "영구 vs 임시"라는 동일한 구분을 공유하지만, 301과 302와 달리 308과 307은 재전송 시 원래의 POST 본문을 그대로 유지합니다.
- 429 Too Many Requests를 받으면
Retry-After헤더를 확인하고 그만큼 기다린 후 재시도하세요. 그렇지 않고 계속 요청을 보내면 완전히 차단될 수 있습니다. - 5xx 오류는 요청 자체의 문제가 아니라 서버 측 문제를 나타냅니다. 클라이언트 코드를 디버깅하기 전에 서버 로그와 가동 상태를 먼저 확인하세요.
- 브라우저 개발자 도구의 네트워크(Network) 탭은 각 요청의 상태 코드를 색상으로 구분해 표시합니다. 이 표와 함께 사용하면 디버깅 속도가 훨씬 빨라집니다.
자주 묻는 질문
-i 옵션을 사용하거나, 이 페이지의 조회 도구에 코드 번호를 입력하면 그 의미를 확인할 수 있습니다.
여담 ― HTTP 상태 코드의 역사
HTTP 상태 코드 체계는 1996년에 발표된 HTTP/1.0 규격인 RFC 1945에서 처음 표준화되었습니다. 1999년에 발표된 HTTP/1.1(RFC 2616)은 4xx, 5xx 계열을 포함해 오늘날 우리가 사용하는 코드 체계의 대부분을 확립했으며, 이후 RFC 7231(2014년)과 RFC 9110(2022년)을 거쳐 이어져 오고 있습니다.
유명한 농담 코드인 418 I'm a teapot은 1998년 만우절에 발표된 RFC 문서에서 유래했는데, 가상의 "하이퍼텍스트 커피포트 제어 프로토콜"(HTCPCP)을 설명하는 내용이었습니다. 이 코드는 찻주전자에게 커피를 끓이라고 요청했을 때 반환되도록 설계되었습니다.
앞자리 숫자가 큰 범주를 나타내는 이 설계 원칙은 이후 SMTP, FTP 등 다른 프로토콜의 응답 코드 체계에도 영향을 준 것으로 여겨집니다. "1xx = 정보성 응답, 2xx = 성공"이라는 단순한 분류 방식은 거의 30년 가까이 본질적으로 변하지 않았습니다.
451 Unavailable For Legal Reasons는 비교적 최근에 추가된 코드로, 2015년 RFC 7725에서 공식적으로 표준화되었습니다. 숫자 451은 검열을 주제로 한 레이 브래드버리(Ray Bradbury)의 디스토피아 소설 "화씨 451"(Fahrenheit 451)에 대한 오마주로 의도적으로 선택되었습니다.