HTTP 상태코드

1xx부터 5xx까지 모든 응답 상태코드. 각 코드의 의미·발생 상황·원인·해결·예시를 확인하세요.

2xx성공 (Success)10
200OK 자주 쓰임200 OK는 요청이 성공했음을 나타내는 가장 기본적이고 흔한 상태 코드입니다. 응답 본문의 의미는 사용한 메서드에 따라 달라지는데, GET이면 조회한 리소스, POST/PUT이면 처리 결과가 담깁니다.201Created 자주 쓰임201 Created는 요청이 성공했고 그 결과로 새 리소스가 생성되었음을 나타냅니다. 보통 POST나 PUT 요청에 대한 응답으로 쓰이며, 새로 만들어진 리소스의 URL을 Location 헤더에 담아 알려 줍니다.202Accepted202 Accepted는 요청이 처리 대상으로 접수되었지만 아직 완료되지 않았음을 뜻합니다. 서버가 요청을 큐에 넣거나 비동기 작업으로 넘겼을 때, 최종 결과를 기다리지 않고 즉시 응답하기 위한 코드입니다.203Non-Authoritative Information203 Non-Authoritative Information은 반환된 메타데이터(헤더 등)가 원본 서버가 아니라 중간의 프록시나 로컬 복사본에서 수집·변형된 것임을 알립니다. 상태 자체는 성공(2xx)이지만 응답이 원본과 다를 수 있다는 경고성 신호입니다.204No Content 자주 쓰임204 No Content는 요청이 성공했지만 응답 본문으로 돌려줄 내용이 없음을 나타냅니다. 서버가 작업을 정상 처리했고, 클라이언트가 현재 화면이나 상태를 그대로 유지하면 된다는 신호입니다.205Reset Content205 Reset Content는 요청이 성공했으며, 클라이언트가 이 요청을 보낸 문서 뷰를 초기 상태로 되돌려야 함을 지시합니다. 대표적으로 입력 폼을 비워 다음 입력을 받을 준비를 시키는 용도입니다.206Partial Content206 Partial Content는 클라이언트가 Range 헤더로 요청한 리소스의 일부(바이트 구간)만 서버가 전달했음을 나타냅니다. 응답의 Content-Range 헤더가 어떤 구간을 전체 크기 중 어디까지 보냈는지 알려 줍니다.207Multi-Status207 Multi-Status는 WebDAV에서 하나의 요청이 여러 리소스에 영향을 줄 때, 각 리소스별 개별 상태를 하나의 XML 본문에 모아 전달합니다. 전체 요청은 200으로 성공했지만 내부 항목마다 결과가 다를 수 있다는 점이 핵심입니다.208Already Reported208 Already Reported는 WebDAV의 바인딩(binding) 확장에서 사용되며, 어떤 리소스가 이미 응답의 다른 위치에서 열거되었으므로 그 멤버를 반복해서 다시 나열하지 않겠다는 신호입니다. 주로 207 Multi-Status 본문 안에서 개별 항목의 상태로 등장합니다.226IM Used226 IM Used는 서버가 리소스 전체가 아니라 인스턴스 조작(instance manipulation), 즉 델타 인코딩을 적용한 결과를 응답으로 돌려주었음을 나타냅니다. 클라이언트가 가진 이전 버전과의 차이(delta)만 전송해 대역폭을 줄이는 기법입니다.
3xx리다이렉션 (Redirection)8
300Multiple Choices300 Multiple Choices는 요청한 리소스에 가능한 표현(representation)이 여러 개 있어, 클라이언트나 사용자가 그중 하나를 선택해야 함을 나타냅니다. 서버가 콘텐츠 협상만으로는 자동으로 하나를 고르지 못할 때 후보 목록을 제시합니다.301Moved Permanently 자주 쓰임301 Moved Permanently는 리소스가 새 URL로 영구히 이동했음을 알리고, 새 위치를 Location 헤더로 제공합니다. 브라우저와 검색엔진은 이를 영구 이전으로 이해해, 이후 요청을 새 URL로 보내고 링크 자산(랭킹·평판)을 새 주소로 옮깁니다.302Found 자주 쓰임302 Found는 리소스가 일시적으로 다른 URL에 있음을 알리며, 원래 URL은 계속 유효하니 앞으로도 그 주소를 사용하라는 뜻입니다. 영구 이전이 아니므로 검색엔진은 링크 자산을 새 URL로 옮기지 않습니다.303See Other303 See Other는 응답이 다른 URL에 있으며, 그 URL을 반드시 GET으로 가져오라고 지시합니다. 원래 요청이 POST였더라도 리다이렉트된 요청은 GET으로 바뀌는 것이 명세상 보장됩니다.304Not Modified 자주 쓰임304 Not Modified는 조건부 요청에 대해 클라이언트가 캐시한 사본이 여전히 유효하므로 본문을 다시 보내지 않는다는 응답입니다. 클라이언트는 If-None-Match(ETag 기반)나 If-Modified-Since(시각 기반)로 자신이 가진 버전을 서버에 알립니다.305Use Proxy305 Use Proxy는 요청한 리소스에 Location 헤더가 가리키는 프록시를 통해서만 접근해야 한다는 의미로 정의되었습니다. 그러나 보안상 문제로 폐지(deprecated)되어 현대 브라우저와 클라이언트는 이 코드를 따르지 않습니다.307Temporary Redirect307 Temporary Redirect는 리소스가 일시적으로 다른 URL에 있으며, 클라이언트가 원래 요청 메서드와 본문을 그대로 유지한 채 새 URL로 재요청해야 함을 뜻합니다. 즉 POST는 POST로, PUT은 PUT으로 다시 보내집니다.308Permanent Redirect308 Permanent Redirect는 리소스가 영구히 새 URL로 이동했음을 알리면서, 클라이언트가 원래의 HTTP 메서드와 본문을 그대로 유지해 재요청하도록 요구합니다. 한마디로 301의 메서드 보존 버전입니다.
4xx클라이언트 오류 (Client Error)29
400Bad Request 자주 쓰임400 Bad Request는 요청이 잘못되어 서버가 처리할 수 없음을 나타내는 범용 클라이언트 오류입니다. 구문이 깨진 본문, 잘못된 프레이밍, 기본 검증 실패 등 요청 자체에 문제가 있을 때 반환됩니다.401Unauthorized 자주 쓰임401 Unauthorized는 인증이 필요한데 자격 증명이 없거나 잘못되어 요청이 거부되었음을 뜻합니다. 이름은 "Unauthorized"지만 실제 의미는 "인증되지 않음(unauthenticated)"으로, 서버가 요청자의 신원을 확인하지 못한 상태입니다.402Payment Required402 Payment Required는 원래 미래 사용을 위해 예약(reserved)된 코드로, HTTP 표준에서 공식적으로 확정된 용법은 없습니다. 그럼에도 일부 API·SaaS는 유료 결제나 크레딧 충전이 필요함을 알리는 용도로 실용적으로 사용합니다.403Forbidden 자주 쓰임403 Forbidden은 서버가 요청을 이해했지만 권한이 없어 처리를 거부한다는 뜻입니다. 401과 달리 신원 확인(인증)은 되었을 수 있으나, 그 신원에게 이 리소스에 대한 권한(인가)이 없는 상태이므로 다시 로그인해도 해결되지 않습니다.404Not Found 자주 쓰임404 Not Found는 서버가 요청한 리소스를 찾을 수 없음을 나타내는, 가장 널리 알려진 상태 코드입니다. URL은 서버에 도달했지만 그 경로에 대응하는 리소스가 존재하지 않을 때 반환됩니다.405Method Not Allowed 자주 쓰임405 Method Not Allowed는 서버가 요청의 HTTP 메서드 자체는 알지만, 해당 리소스에 대해서는 그 메서드를 허용하지 않을 때 반환됩니다. 예를 들어 POST만 받는 엔드포인트에 GET을 보내는 경우입니다.406Not Acceptable406 Not Acceptable은 서버가 요청의 Accept 계열 헤더가 요구하는 형식으로 응답을 만들 수 없을 때 반환됩니다. 즉 콘텐츠 협상(content negotiation)이 실패한 상황입니다.407Proxy Authentication Required407 Proxy Authentication Required는 요청을 계속 진행하기 전에 중간 프록시에 대한 인증이 필요함을 뜻합니다. 401이 원본 서버에 대한 인증을 요구하는 것과 달리, 407은 클라이언트와 서버 사이의 프록시가 자격 증명을 요구하는 것입니다.408Request Timeout408 Request Timeout은 서버가 클라이언트로부터 완전한 요청을 받기까지 기다리다가 제한 시간을 넘겨 연결을 정리했음을 뜻합니다. 클라이언트가 요청 라인·헤더·본문을 너무 느리게 보내는 것이 원인입니다.409Conflict 자주 쓰임409 Conflict는 요청이 리소스의 현재 상태와 충돌하여 처리할 수 없음을 나타냅니다. 요청 자체는 형식적으로 유효하지만, 서버의 현재 상태와 양립할 수 없는 변경을 시도할 때 반환됩니다.410Gone410 Gone은 리소스가 영구적으로 삭제되었고 대체 주소도 없다는 것을 명확히 선언하는 상태 코드입니다. 404 Not Found가 "지금은 못 찾겠다"라는 다소 모호한 신호라면, 410은 "여기에 있었지만 의도적으로 영구히 제거했으며 다시 돌아오지 않는다"는 확정적인 신호입니다.411Length Required411 Length Required는 서버가 요청 본문의 크기를 미리 알아야 하는데 Content-Length 헤더가 없어서 처리를 거부한다는 뜻입니다. 서버가 chunked transfer encoding을 지원하지 않거나, 정책상 본문 길이를 명시하도록 요구할 때 발생합니다.412Precondition Failed412 Precondition Failed는 요청 헤더에 담긴 전제 조건(If-Match, If-Unmodified-Since 등)이 서버에서 거짓으로 평가되어 요청을 수행하지 않았음을 뜻합니다. 주로 낙관적 동시성 제어(optimistic concurrency)에서 다른 사람이 먼저 리소스를 수정한 경우 발생합니다.413Content Too Large413 Content Too Large(옛 이름 Payload Too Large)는 요청 본문이 서버가 처리하도록 허용한 크기 한도를 넘어섰다는 뜻입니다. 파일 업로드, 대용량 JSON, base64 인코딩된 데이터 전송에서 흔히 만납니다.414URI Too Long414 URI Too Long은 요청한 URI가 서버가 해석할 수 있는 최대 길이를 넘었다는 뜻입니다. 대부분 GET 쿼리 스트링에 너무 많은 데이터를 실었을 때 발생합니다.415Unsupported Media Type415 Unsupported Media Type는 요청 본문의 형식(Content-Type)을 서버가 지원하지 않아 거부했다는 뜻입니다. 예를 들어 JSON만 받는 엔드포인트에 XML이나 text/plain을 보내면 발생합니다.416Range Not Satisfiable416 Range Not Satisfiable는 클라이언트가 Range 헤더로 요청한 바이트 구간이 리소스의 실제 크기를 벗어났다는 뜻입니다. 예를 들어 5MB 파일에서 100MB 지점의 바이트를 요구하면 발생합니다.417Expectation Failed417 Expectation Failed는 요청의 Expect 헤더에 담긴 기대(가장 흔하게는 Expect: 100-continue)를 서버가 충족할 수 없다는 뜻입니다. 클라이언트는 큰 본문을 보내기 전에 서버가 받아줄지 미리 확인하려고 Expect: 100-continue를 보냅니다.418I'm a teapot418 I'm a teapot는 1998년 만우절 농담으로 정의된 상태 코드입니다(RFC 2324, Hyper Text Coffee Pot Control Protocol). '커피를 내려달라'는 요청을 받은 주전자(teapot)가 '나는 주전자라 커피를 못 만든다'며 거절하는 상황을 표현합니다.421Misdirected Request421 Misdirected Request는 요청이 그 scheme/authority(호스트)에 대한 응답을 만들 수 없는 서버에 도달했다는 뜻입니다. 즉 '잘못 배달된 요청'입니다.422Unprocessable Content 자주 쓰임422 Unprocessable Content(옛 이름 Unprocessable Entity)는 요청의 문법(JSON 구조 등)은 올바르지만 담긴 값이 의미상 잘못되어 처리할 수 없다는 뜻입니다. 이메일 형식 오류, 음수 나이, 필수 필드 누락 같은 검증 실패에 사용됩니다.423Locked423 Locked는 접근하려는 리소스가 잠겨 있어(WebDAV lock) 요청을 수행할 수 없다는 뜻입니다. WebDAV는 협업 편집 시 여러 사용자가 같은 파일을 동시에 덮어쓰지 못하도록 명시적 잠금(LOCK) 메커니즘을 제공합니다.424Failed Dependency424 Failed Dependency는 요청이 의존하고 있던 다른 작업이 먼저 실패했기 때문에, 이 요청도 수행할 수 없다는 뜻입니다. WebDAV의 배치·체인 작업에서 앞 단계가 실패하면 그에 의존하는 뒤 단계에 이 코드가 붙습니다.425Too Early425 Too Early는 서버가 재전송(replay) 위험이 있는 요청을 처리하기를 거부했다는 뜻입니다. TLS 1.3의 0-RTT '이른 데이터(early data)' 기능과 관련이 있습니다.426Upgrade Required426 Upgrade Required는 서버가 현재 프로토콜로는 요청을 처리하지 않으며, 클라이언트가 다른 프로토콜로 전환해야 한다는 뜻입니다. 응답의 Upgrade 헤더에 요구되는 프로토콜이 명시됩니다.428Precondition Required428 Precondition Required는 서버가 이 요청을 반드시 조건부(conditional)로 보내도록 요구한다는 뜻입니다. 클라이언트가 If-Match 같은 전제 조건 헤더 없이 쓰기 요청을 보내면, 서버가 이를 거부하고 조건을 붙이라고 요구합니다.429Too Many Requests 자주 쓰임429 Too Many Requests는 클라이언트가 정해진 시간 안에 너무 많은 요청을 보내 속도 제한(rate limiting)에 걸렸다는 뜻입니다. API 남용·과도한 폴링·봇 트래픽으로부터 서버를 보호하기 위한 코드입니다.431Request Header Fields Too Large431 Request Header Fields Too Large는 요청 헤더가 개별적으로 또는 전체적으로 서버가 허용하는 크기를 넘었다는 뜻입니다. 가장 흔한 범인은 지나치게 커진 쿠키와 비대한 Authorization/커스텀 헤더입니다.451Unavailable For Legal Reasons451 Unavailable For Legal Reasons는 법적 요구(검열, 법원 명령, 정부 규제 등)로 인해 리소스에 접근할 수 없다는 뜻입니다. 코드 번호 451은 정보 검열을 다룬 레이 브래드버리의 소설 『화씨 451』에서 따온 것입니다.
5xx서버 오류 (Server Error)11
500Internal Server Error 자주 쓰임500 Internal Server Error는 서버가 요청을 처리하다가 예상치 못한 상황을 만나 실패했음을 알리는 포괄적(catch-all) 오류입니다. 클라이언트 요청 자체는 문제가 없을 수 있으며, 원인은 서버 코드나 그 의존성 쪽에 있습니다.501Not Implemented501 Not Implemented는 서버가 요청을 처리하는 데 필요한 기능 자체를 지원하지 않는다는 뜻입니다. 서버가 인식하지 못하는 요청 메서드이거나, 아직 구현되지 않은 기능을 호출했을 때 반환됩니다.502Bad Gateway 자주 쓰임502 Bad Gateway는 게이트웨이나 프록시 역할을 하는 서버가 상위(upstream) 서버로부터 유효하지 않은 응답을 받았다는 뜻입니다. 사용자가 접속한 리버스 프록시(Nginx, 로드밸런서, CDN) 자체는 정상이지만, 그 뒤의 실제 백엔드가 죽었거나 깨진 응답을 돌려줄 때 발생합니다.503Service Unavailable 자주 쓰임503 Service Unavailable는 서버가 과부하나 유지보수 때문에 일시적으로 요청을 처리할 수 없다는 뜻입니다. 서버 자체는 살아 있지만 지금은 요청을 받을 수 없는, 의도적이거나 일시적인 상태를 나타냅니다.504Gateway Timeout 자주 쓰임504 Gateway Timeout은 게이트웨이나 프록시가 상위(upstream) 서버로부터 제때 응답을 받지 못해 기다리다 포기했다는 뜻입니다. 백엔드가 완전히 죽은 것은 아니지만, 프록시가 정한 제한 시간 안에 응답을 끝내지 못한 경우입니다.505HTTP Version Not Supported505 HTTP Version Not Supported는 요청에 사용된 HTTP 주 버전을 서버가 지원하지 않는다는 뜻입니다. 클라이언트가 서버가 처리할 수 없는 HTTP 버전으로 요청 라인을 구성했을 때 발생합니다.506Variant Also Negotiates506 Variant Also Negotiates는 서버 설정 오류를 나타냅니다. 투명한 콘텐츠 협상(transparent content negotiation)에서 협상 대상으로 선택된 변형(variant)이 그 자체로 또 협상 가능한 리소스여서, 협상이 순환에 빠졌음을 뜻합니다.507Insufficient Storage507 Insufficient Storage는 서버가 요청을 완료하는 데 필요한 표현(representation)을 저장할 공간이 부족하다는 뜻입니다. WebDAV에서 정의된 코드로, 파일 업로드나 저장 작업 중 디스크나 할당량(quota)이 가득 찼을 때 반환됩니다.508Loop Detected508 Loop Detected는 서버가 요청을 처리하는 도중 무한 루프를 발견했다는 뜻입니다. WebDAV에서 바인딩(binding, 심볼릭 링크와 유사)이 서로를 순환 참조하는 구조를 깊이 탐색(Depth: infinity)하다가 끝없이 반복될 때 반환됩니다.510Not Extended510 Not Extended는 서버가 요청을 처리하려면 추가적인 확장(extension)이 필요한데 그 확장이 요청에 선언되지 않았다는 뜻입니다. RFC 2774의 실험적 HTTP 확장 프레임워크(Mandatory Extensions)에서 정의되었습니다.511Network Authentication Required511 Network Authentication Required는 네트워크 접근을 얻으려면 클라이언트가 먼저 인증해야 한다는 뜻입니다. 카페·공항·호텔의 공용 Wi-Fi에서 흔히 보는 '캡티브 포털(captive portal)' 로그인 페이지가 대표적인 사례입니다.