고객사의 요청에 의해 API를 구현하다보면 항상 고민에 빠지는 구간이 있다.
성공이나 에러 발생 시, 결과값과 함께 어떤 상태코드를 내줘야하지?
성공을 함에도 다양한 status들이 있고, 오류가 발생했음에도 그에 상응하는 다양한 status들이 존재한다.
각 상황에 맞는 결과 코드를 제공하는 API를 구현하기 위해 또한 다른 API를 사용하다 마주치는 에러를 분석하기 위해 여기서 Http Status Code를 정리하려 한다.
Http Status Code란?
HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려줍니다.
Http Status Code 분류
상태 코드의 첫 번째 숫자는 응답의 클래스를 정의한다.
- 1xx (정보): 요청을 받았으며 프로세스를 계속하는 경우
- 2xx (성공): 요청을 성공적으로 받았으며 수용했을 경우
- 3xx (리다이렉션): 요청 완료를 위해 추가 작업 조치가 필요한 경우
- 4xx (클라이언트 오류): 요청의 문법이 잘못되었거나 요청을 처리할 수 없는 경우
- 5xx (서버 오류): 서버가 유효한 요청에 대해 충족을 실패했을 경우
Http Status Code 정리
✔ 1xx Status Code ( 조건부 응답 )
- 100 ( Continue )
- 지금까지의 상태가 괜찮으며 클라이언트가 계속해서 요청을 하거나 이미 요청을 완료한 경우에는 무시해도 되는 경우
- 101 ( Switching Protocol )
- 클라이언트가 보낸 Upgrade (en-US) 요청 헤더에 대한 응답에 들어가며 서버에서 프로토콜을 변경할 것임을 알려줄 경우
- 102 ( Processing )
- 서버가 요청을 수신하였으며 이를 처리하고 있지만, 아직 제대로 된 응답을 알려줄 수 없을 경우
- 103 ( Early Hints )
- 주로 Link (en-US) 헤더와 함께 사용되어 서버가 응답을 준비하는 동안 사용자 에이전트가(user agent) 사전 로딩(preloading)을 시작할 수 있도록 할 경우
✔ 2xx Status Code ( 성공 )
✔ 3xx Status Code ( 리다이렉션 완료 )
-
300 ( Multiple Choice (en-US) )
- 요청에 대해서 하나 이상의 응답이 가능할 경우
- 사용자 에이전트 또는 사용자는 그중에 하나를 반드시 선택해야 합니다
-
301 ( Moved Permanently )
- 요청한 리소스의 URI가 변경되었음을 의미
- 리소스에 대한 향후 참조는 반환 된 URI 중 하나를 사용해아 합니다
-
302 ( Found )
- 요청한 리소스의 URI가 일시적으로 변경되었음을 의미
- 새롭게 변경된 URI는 나중에 만들어질 수 있으니, 클라이언트는 향후의 요청도 반드시 동일한 URI로 해야합니다
-
303 ( See Other (en-US) )
- 클라이언트가 요청한 리소스를 다른 URI에서 GET 요청을 통해 얻어야 할 때, 서버가 클라이언트로 직접 보내는 응답
-
304 ( Not Modified )
- 캐시를 목적으로 사용
- 클라이언트에게 응답이 수정되지 않았음을 알려주며, 그러므로 클라이언트는 계속해서 응답의 캐시된 버전을 사용
- 304 응답은 메시지 본문을 포함해서는 안되며, 따라서 항상 헤더 필드 다음의 첫 번째 빈 줄로 종료되어야 합니다
-
305 ( Use Proxy )
- 이전 버전의 HTTP 기술 사양에서 정의되었으며, 요청한 응답은 반드시 프록시를 통해서 접속해야 하는 것을 알려줄 경우
- 프록시의 in-band 설정에 대한 보안상의 걱정으로 인하여 사라져가고 있습니다
-
307 ( Temporary Redirect )
- 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 할 경우
- 이것은 302 Found HTTP 응답 코드와 동일한 의미를 가지고 있으며, 사용자 에이전트가 반드시 사용된 HTTP 메소드를 변경하지 말아야 하는 점만 다릅니다: 만약 첫 요청에 POST가 사용되었다면, 두번째 요청도 반드시 POST를 사용해야 합니다
✔ 4xx Status Code ( 요청 오류 )
- 400 ( Bad Request )
- 잘못된 문법으로 인하여 서버가 요청을 이해할 수 없을 경우
- 401 ( Unauthorized )
- 403 ( Forbidden )
- 클라이언트는 콘텐츠에 접근할 권리를 가지고 있지 않을 경우
- 401과 다른 점은 서버가 클라이언트가 누구인지 알고 있습니다
- 404 ( Not Found )
- 405 ( Method Not Allowed )
- 요청에 지정된 방법을 사용할 수 없을 경우
- 예를 들어 POST 방식으로 요청을 받는 서버에 GET 요청을 보내는 경우, 또는 읽기 전용 리소스에 PUT 요청을 보내는 경우에 이 코드를 제공한다.
- 406 ( Not Acceptable (en-US) )
- 요청한 페이지가 요청한 콘텐츠 특성으로 응답할 수 없을 경우
- 407 ( Proxy Authentication Required (en-US) )
- 401과 비슷하지만 프록시에 의해 완료된 인증이 필요합니다
- 408 ( Request Timeout )
- 요청을 한지 시간이 오래된 연결에 일부 서버가 전송하며, 어떨 때에는 이전에 클라이언트로부터 어떠한 요청이 없었다고 하더라도 보내지기도 합니다
- 409 ( Conflict )
- 410 ( Gone (en-US) )
- 요청한 콘텐츠가 서버에서 영구적으로 삭제되었으며, 전달해 줄 수 있는 주소 역시 존재하지 않을 경우
- 411 ( Length Required )
- 서버에서 필요로 하는 Content-Length 헤더 필드가 정의되지 않은 요청이 들어왔기 때문에 서버가 요청을 거절할 경우
- 412 ( Precondition Failed (en-US) )
- 클라이언트의 헤더에 있는 전제조건은 서버의 전제조건에 적절하지 않을 경우
- 413 ( Payload Too Large )
- 요청 엔티티는 서버에서 정의한 한계보다 클 경우
- 서버는 연결을 끊거나 혹은 Retry-After 헤더 필드로 돌려보냅니다
- 414 ( URI Too Long (en-US) )
- 클라이언트가 요청한 URI는 서버에서 처리하지 않기로 한 길이보다 길 경우
- 415 ( Unsupported Media Type (en-US) )
- 요청한 미디어 포맷은 서버에서 지원하지 않을 경우
- 서버는 해당 요청을 거절합니다
- 416 ( Requested Range Not Satisfiable )
- Range 헤더 필드에 요청한 지정 범위를 만족시킬 수 없을 경우
- 417 ( Requested Range Not Satisfiable )
- Expect 요청 헤더 필드로 요청한 예상이 서버에서는 적당하지 않을 경우
- 429 ( Too Many Requests (en-US) )
- 사용자가 지정된 시간에 너무 많은 요청을 보냈을 경우
- 431 ( Request Header Fields Too Large )
- 요청한 헤더 필드가 너무 크기 때문에 서버는 요청을 처리하지 않을 경우
✔ 5xx Status Code ( 서버 오류 )
- 500 ( Internal Server Error )
- 501 ( Not Implemented )
- 서버에 요청을 수행할 수 있는 기능이 없을 경우
- 502 ( Bad Gateway )
- 서버가 요청을 처리하는 데 필요한 응답을 얻기 위해 게이트웨이로 작업하는 동안 잘못된 응답을 수신했을 경우
- 503 ( Service Unavailable )
- 서버가 요청을 처리할 준비가 되지 않았을 경우
- 일반적인 원인은 유지보수를 위해 작동이 중단되거나 과부하가 걸렸을 경우
- 504 ( Gateway Timeout )
- 서버가 게이트웨이 역할을 하고 있으며 적시에 응답을 받을 수 없을 경우
- 505 ( HTTP Version Not Supported )
- 요청에 사용된 HTTP 버전은 서버에서 지원되지 않을 경우
- 508 ( Loop Detected (en-US) (WebDAV (en-US)) )
- 서버가 요청을 처리하는 동안 무한 루프를 감지했을 경우
출처 및 참조