HTTP Status Code 초보자 가이드

블로그의 내용은 다음과 같습니다.

  • HTTP란 무엇인가요?
  • 상태 코드(Status Code)란 무엇인가요?
  • HTTP 코드의 종류는 무엇인가요?
  • 각 HTTP 코드에 대한 간략한 설명.

HTTP란 무엇인가요?

HTTP(Hypertext Transfer Protocol)은 HTML과 같은 하이퍼미디어 문서를 전송하기 위한 애플리케이션 계층 프로토콜입니다. 웹 브라우저와 웹 서버 간의 통신을 위해 설계되었습니다.

각각의 개별 요청은 서버로 전송되며, 서버는 이를 처리하고 응답이라는 답변을 제공합니다.

상태 코드(Status Code)란 무엇인가요?

클라이언트의 요청이 있을 때마다 서버는 요청의 상태를 전달하는 데 도움이 되는 코드를 응답으로 보냅니다. 이는 응답 본문에 투자하지 않고도 요청이 성공했는지 여부를 빠르게 검사할 수 있는 방법입니다.

HTTP 코드의 유형은 무엇인가요?

응답은 5가지 클래스로 분류됩니다.

  • 정보성 응답(100-199)
  • 성공적인 응답(200-299)
  • 리디렉션 메시지(300-399)
  • 클라이언트 오류 응답(400-499)
  • 서버 오류 응답(500-599)

정보(Information) 응답

  • 100 Continue: 클라이언트가 요청을 계속하거나 요청이 이미 완료된 경우 응답을 무시해야 함을 나타냅니다.
  • 101 Switching Protocols: 클라이언트의 업그레이드 요청 헤더에 대한 응답으로 전송되며 서버가 전환 중인 프로토콜을 나타냅니다.
  • 102 Processing: 서버가 요청을 수신하여 처리 중이지만 아직 응답이 없음을 나타냅니다.
  • 103 Early Hints: 주로 링크 헤더와 함께 사용되며, 서버가 응답을 준비하는 동안 사용자 에이전트가 리소스 사전 로딩을 시작할 수 있도록 합니다.

성공적인(Successful) 응답

  • 200 OK: 요청이 성공했습니다. "성공"의 결과 의미는 HTTP 메서드에 따라 다릅니다:

    • GET: 리소스를 가져와 메시지 본문으로 전송했습니다.
    • HEAD: 메시지 본문 없이 표현 헤더가 응답에 포함됩니다.
    • PUT 또는 POST: 작업 결과를 설명하는 리소스가 메시지 본문으로 전송됩니다.
    • TRACE: 메시지 본문에는 서버가 수신한 요청 메시지가 포함됩니다.
  • 201 Created: 요청이 성공했으며 그 결과 새 리소스가 생성되었습니다. 일반적으로 POST 요청 또는 일부 PUT 요청 후에 전송되는 응답입니다.

  • 202 Accepted: 요청이 수신되었지만 아직 처리되지 않았습니다. HTTP에서는 나중에 요청 결과를 나타내는 비동기 응답을 전송할 방법이 없기 때문에 비커밋 상태입니다. 다른 프로세스나 서버가 요청을 처리하는 경우 또는 일괄 처리를 위한 것입니다.

  • 203 Non-Authoritative Information: 반환된 메타데이터가 원본 서버에서 사용할 수 있는 것과 정확히 동일하지 않고 로컬 또는 타사 사본에서 수집되었음을 의미합니다. 주로 다른 리소스의 미러 또는 백업에 사용됩니다. 이러한 특별한 경우를 제외하고는 이 상태보다 200 OK 응답이 선호됩니다.

  • 204 No Content: 이 요청에 대해 보낼 콘텐츠가 없지만 헤더가 유용할 수 있습니다. 사용자 에이전트는 이 리소스에 대해 캐시된 헤더를 새 헤더로 업데이트할 수 있습니다.

  • 205 Reset Content: 사용자 에이전트에게 이 요청을 보낸 문서를 재설정하라고 알려줍니다.

  • 206 Partial Content: 클라이언트에서 리소스의 일부만 요청하기 위해 범위 헤더를 보낼 때 사용되는 응답 코드입니다.

  • 207 Multi-Status: 여러 상태 코드가 적절할 수 있는 상황에 대해 여러 리소스에 대한 정보를 전달합니다.

  • 208 Already Reported: 동일한 컬렉션에 대한 여러 바인딩의 내부 멤버를 반복적으로 열거하지 않기 위해 응답 요소 내부에서 사용됩니다.

  • 226 IM used (HTTP Delta encoding): 서버가 리소스에 대한 GET 요청을 처리했으며, 응답은 현재 인스턴스에 적용된 하나 이상의 인스턴스 조작 결과를 나타냅니다.

리디렉션 메시지

  • 300 Multiple Choice: 요청에 가능한 응답이 두 개 이상 있습니다. 사용자 에이전트 또는 사용자는 그 중 하나를 선택해야 합니다. (응답 중 하나를 선택하는 표준화된 방법은 없지만 사용자가 선택할 수 있도록 가능성에 대한 HTML 링크를 제공하는 것이 좋습니다.)

  • 301 Moved Permanently: 요청된 리소스의 URL이 영구적으로 변경되었습니다. 새 URL은 응답에 제공됩니다.

  • 302 Found: 요청된 리소스의 URI가 일시적으로 변경되었음을 의미합니다. 향후 URI가 추가로 변경될 수 있습니다. 따라서 클라이언트는 향후 요청 시 동일한 URI를 사용해야 합니다.

  • 303 See Other: 서버가 이 응답을 전송하여 클라이언트가 GET 요청을 통해 다른 URI에서 요청된 리소스를 가져오도록 안내합니다.

  • 304 Not Modified: 캐싱 목적으로 사용됩니다. 응답이 수정되지 않았음을 클라이언트에 알려주므로 클라이언트는 동일한 캐시된 버전의 응답을 계속 사용할 수 있습니다.

  • 305 Use Proxy: 요청된 응답이 프록시를 통해 액세스되어야 함을 나타내기 위해 이전 버전의 HTTP 사양에서 정의되었습니다. 프록시의 대역 내 구성과 관련된 보안 문제로 인해 더 이상 사용되지 않습니다.

  • 306 unused: 더 이상 사용되지 않습니다. 이전 버전의 HTTP/1.1 사양에서 사용되었습니다.

  • 307 Temporary Redirect: 서버는 이전 요청에 사용된 것과 동일한 방법으로 클라이언트가 요청된 리소스를 다른 URI에서 가져오도록 지시하기 위해 이 응답을 보냅니다. 302 HTTP를 찾을 수 없음 응답 코드와 의미는 동일하지만 사용자 에이전트가 사용된 HTTP 방법을 변경해서는 안 된다는 점, 즉 첫 번째 요청에서 POST를 사용했다면 두 번째 요청에서는 POST를 사용해야 한다는 점을 제외하면 동일한 의미를 가집니다.

  • 308 Permanent Redirect: 리소스가 이제 위치에서 지정한 다른 URI에 영구적으로 위치하게 되었음을 의미합니다: HTTP 응답 헤더로 지정된 다른 URI에 리소스가 영구적으로 배치되었음을 의미합니다. 이는 301 영구적으로 이동됨 HTTP 응답 코드와 동일한 의미를 갖지만 사용자 에이전트가 사용된 HTTP 방법을 변경해서는 안 된다는 점을 제외하면 첫 번째 요청에서 POST를 사용했다면 두 번째 요청에서도 POST를 사용해야 한다는 점만 다릅니다.

클라이언트 오류 응답

  • 400 Bad Request: 잘못된 구문으로 인해 서버가 요청을 이해할 수 없습니다.

  • 401 Unauthorized: HTTP 표준은 "Unauthorized"을 명시하고 있지만, 의미상 이 응답은 "unauthenticated"을 의미합니다. 즉, 클라이언트가 요청된 응답을 받으려면 자신을 인증해야 합니다.

  • 402 Payment Required: 향후 사용을 위해 예약되어 있습니다. 이 코드를 만든 초기 목적은 디지털 결제 시스템에 사용하기 위한 것이었지만, 이 상태 코드는 거의 사용되지 않으며 표준 규칙도 존재하지 않습니다.

  • 403 Forbidden: 클라이언트에 콘텐츠에 대한 액세스 권한이 없습니다. 즉, 권한이 없으므로 서버가 요청된 리소스 제공을 거부합니다. 401 Unauthorized과 달리 클라이언트의 신원이 서버에 알려져 있습니다.

  • 404 Not Found: 서버가 요청된 리소스를 찾을 수 없습니다. 브라우저에서는 URL이 인식되지 않음을 의미합니다. API에서는 엔드포인트는 유효하지만 리소스 자체가 존재하지 않음을 의미할 수도 있습니다. 서버는 권한이 없는 클라이언트로부터 리소스의 존재를 숨기기 위해 403 Forbidden 대신 이 응답을 보낼 수도 있습니다. 이 응답 코드는 웹에서 자주 발생하기 때문에 가장 잘 알려져 있습니다.

  • 405 Method Not Allowed: 요청 메서드가 서버에서 알고 있지만 대상 리소스에서 지원되지 않습니다. 예를 들어, 리소스를 제거하기 위해 DELETE를 호출하는 것을 허용하지 않는 API가 있을 수 있습니다.

  • 406 Not Acceptable: 웹 서버가 서버 기반 콘텐츠 협상을 수행한 후 사용자 에이전트가 지정한 기준에 맞는 콘텐츠를 찾지 못한 경우 이 응답이 전송됩니다.

  • 407 Proxy Authentication Required: 401 Unauthorized과 유사하지만 프록시를 통한 인증이 필요한 경우입니다.

  • 408 Request Timeout: 이 응답은 클라이언트의 사전 요청 없이도 일부 서버가 유휴 연결 상태에서 전송합니다. 이는 서버가 사용하지 않는 연결을 종료하고자 함을 의미합니다. 이 응답은 크롬, 파이어폭스 27+ 또는 IE9와 같은 일부 브라우저에서 서핑 속도를 높이기 위해 HTTP 사전 연결 메커니즘을 사용하기 때문에 훨씬 더 많이 사용됩니다. 또한 일부 서버는 이 메시지를 보내지 않고 단순히 연결을 종료하기도 합니다.

  • 409 Conflict: 요청이 서버의 현재 상태와 충돌할 때 이 응답이 전송됩니다.

  • 410 Gone: 요청된 콘텐츠가 서버에서 전달 주소 없이 영구적으로 삭제된 경우 이 응답이 전송됩니다. 클라이언트는 캐시 및 리소스에 대한 링크를 제거해야 합니다. HTTP 사양에서는 이 상태 코드를 "limited-time, promotional services"에 사용하도록 의도하고 있습니다. API는 이 상태 코드로 삭제된 리소스를 표시해야 할 필요는 없습니다.

  • 411 Length Required: Content-Length 헤더 필드가 정의되지 않았고 서버에서 이를 요구하기 때문에 서버가 요청을 거부했습니다.

  • 412 Precondition Failed: 클라이언트가 헤더에 서버가 충족하지 않는 전제 조건을 표시했습니다.

  • 413 Payload Too Large: 요청 엔티티가 서버에서 정의한 제한보다 큽니다. 서버가 연결을 닫거나 재시도 후 헤더 필드를 반환할 수 있습니다.

  • 414 URI Too Long: 클라이언트에서 요청한 URI가 서버가 해석할 수 있는 것보다 깁니다.

  • 415 Unsupported Media Type: 요청된 데이터의 미디어 형식이 서버에서 지원되지 않으므로 서버가 요청을 거부합니다.

  • 416 Range Not Satisfiable: 요청의 범위 헤더 필드에 지정된 범위를 충족할 수 없습니다. 범위가 대상 URI의 데이터 크기를 벗어났을 수 있습니다.

  • 417 Expectation failed: 이 응답 코드는 서버에서 기대 요청 헤더 필드에 표시된 기대치를 충족할 수 없음을 의미합니다.

  • 421 Misdirected Request: 응답을 생성할 수 없는 서버로 요청이 전송되었습니다. 요청 URI에 포함된 체계와 권한의 조합에 대한 응답을 생성하도록 구성되지 않은 서버에서 보낼 수 있습니다.

  • 422 Unprocessable Entity: 요청은 잘 형성되었지만 의미론적 오류로 인해 요청을 따를 수 없습니다.

  • 423 Locked: 액세스 중인 리소스가 잠겼습니다.

  • 424 Failed Dependency: 이전 요청의 실패로 인해 요청이 실패했습니다.

  • 425 Too Early: 서버가 재생될 수 있는 요청을 처리할 위험을 감수하지 않으려 함을 나타냅니다.

  • 426 Upgrade Required: 서버가 현재 프로토콜을 사용하여 요청을 수행하는 것을 거부하지만 클라이언트가 다른 프로토콜로 업그레이드한 후에는 요청을 수행할 의향이 있을 수 있습니다. 서버는 426 응답에 업그레이드 헤더를 전송하여 필요한 프로토콜을 표시합니다.

  • 428 Precondition Required: 원본 서버는 요청이 조건부일 것을 요구합니다. 이 응답은 클라이언트가 리소스의 상태를 가져와서 수정한 후 서버에 다시 넣을 때 제3자가 서버의 상태를 수정하여 충돌이 발생하는 ‘업데이트 손실’ 문제를 방지하기 위한 것입니다.

  • 429 Too Many Requests: 사용자가 주어진 시간 동안 너무 많은 요청을 보냈습니다(“속도 제한”).

  • 431 Request Header Fields Too Large: 서버가 헤더 필드가 너무 커서 요청을 처리할 수 없습니다. 요청 헤더 필드의 크기를 줄인 후 요청을 다시 제출할 수 있습니다.

  • 451 Unavailable For Legal Reasons: 사용자 에이전트가 정부에서 검열하는 웹 페이지 등 법적으로 제공할 수 없는 리소스를 요청했습니다.

서버 오류 응답

  • 500 Internal Server Error: 서버가 처리할 수 없는 상황이 발생했습니다.

  • 501 Not Implemented: 요청 메서드가 서버에서 지원되지 않아 처리할 수 없습니다. 서버가 지원해야 하는(따라서 이 코드를 반환해서는 안 되는) 유일한 메서드는 GET과 HEAD입니다.

  • 502 Bad Gateway: 서버가 요청을 처리하는 데 필요한 응답을 얻기 위해 게이트웨이로 작동하는 동안 잘못된 응답을 받았음을 의미합니다.

  • 503 Service Unavailable: 서버가 요청을 처리할 준비가 되지 않았습니다. 일반적인 원인은 유지보수를 위해 서버가 다운되었거나 과부하가 걸린 경우입니다. 이 응답과 함께 문제를 설명하는 사용자 친화적인 페이지가 전송되어야 한다는 점에 유의하세요. 이 응답은 일시적인 상황에 사용해야 하며, 가능하면 서비스 복구 전 예상 시간을 Retry-After HTTP 헤더에 포함해야 합니다. 이러한 임시 상태 응답은 일반적으로 캐싱되지 않아야 하므로 웹 마스터는 이 응답과 함께 전송되는 캐싱 관련 헤더에도 주의해야 합니다.

  • 504 Gateway Timeout: 서버가 게이트웨이 역할을 하고 있는데 제시간에 응답을 받을 수 없는 경우 이 오류 응답이 표시됩니다.

  • 505 HTTP Version Not Supported: 요청에 사용된 HTTP 버전이 서버에서 지원되지 않습니다.

  • 506 Variant Negotiates: 서버에 내부 구성 오류가 있습니다. 선택한 변형 리소스가 투명한 콘텐츠 협상 자체에 참여하도록 구성되어 있으므로 협상 프로세스의 적절한 엔드포인트가 아닙니다.

  • 507 Insufficient Storage: 서버가 요청을 성공적으로 완료하는 데 필요한 표현을 저장할 수 없기 때문에 리소스에서 메서드를 수행할 수 없습니다.

  • 508 Loop Detected: 서버가 요청을 처리하는 동안 무한 루프를 감지했습니다.

  • 510 Not Extended: 서버가 요청을 처리하려면 요청에 대한 추가 확장이 필요합니다.

  • 511 Network Authentication Required: 클라이언트가 네트워크 액세스를 얻기 위해 인증이 필요함을 나타냅니다.

Share