네트워크

HTTP 상태 코드 목록

개발자를 위한 HTTP 상태 코드(1xx-5xx) 전체 목록으로, 의미와 흔한 원인, 해결 방법을 정리했습니다. 조회 도구가 내장되어 있어 코드 번호를 입력하면 바로 상세 정보를 확인할 수 있습니다.

HTTP 상태 코드 참조표
코드 이름 의미 흔한 원인
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) 탭은 각 요청의 상태 코드를 색상으로 구분해 표시합니다. 이 표와 함께 사용하면 디버깅 속도가 훨씬 빨라집니다.

자주 묻는 질문

둘 다 리소스를 찾을 수 없음을 나타내지만, 404는 일시적일 수도 있는 일반적인 "찾을 수 없음"인 반면, 410은 리소스가 영구적으로 삭제되어 다시는 돌아오지 않는다는 것을 명확히 알립니다. 의도적으로 삭제한 콘텐츠에는 410을 사용해 SEO 측면에서 더 명확한 신호를 보내세요.

301(영구) 리다이렉트는 이전 URL의 순위 신호 대부분을 새 URL로 이전합니다. 302(임시) 리다이렉트는 검색엔진에게 이전 URL을 계속 정규 URL로 취급하도록 지시하므로, 영구적인 이동에는 항상 301을 사용해야 합니다.

401 Unauthorized는 실제로는 "인증되지 않음"을 의미합니다. 즉 클라이언트가 자신의 신원을 증명하지 못한 상태입니다. 403 Forbidden은 클라이언트가 인증은 되었지만 권한이 없는 경우를 의미합니다. 이름과 달리 401은 인증(authentication), 403은 인가(authorization)에 관한 것입니다.

502는 리버스 프록시나 로드 밸런서가 백엔드 애플리케이션 서버로부터 유효하지 않은 응답을 받았음을 의미합니다. 먼저 애플리케이션 서버 프로세스가 실행 중인지, 충돌하지 않았는지 확인하세요.

브라우저 개발자 도구의 네트워크(Network) 탭, curl의 -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)에 대한 오마주로 의도적으로 선택되었습니다.