HTTP 상태 코드

sangyeon217·2021년 2월 6일
2
post-thumbnail

지난 2020.12.14에 발생한 유튜브 오류 화면 입니다.
구글 서버 오류로, 상태 코드는 503 이라고 하네요.
이미지 출처 : https://www.onews.tv/news/articleView.html?idxno=41819

HTTP 상태 코드란?

HTTP 상태 코드는 클라이언트가 보낸 HTTP 요청에 대한 서버의 응답 코드로, 상태 코드에 따라 요청의 성공/실패 여부를 판단합니다.

HTTP 상태 코드 분류

상태 코드의 첫 번째 숫자에 따라 크게 5가지로 분류 됩니다.

  • 1xx : Informational
  • 2xx : Success
  • 3xx : Redirection
  • 4xx : Client Error
  • 5xx : Server Error

HTTP 상태 코드 상세

자주 사용되는 HTTP 상태 코드 위주로 정리하였습니다.
모든 HTTP 상태 코드를 알고 싶다면, MDN이나 위키백과를 참고해 주세요.

1xx : 조건부 응답

Request received, continuing process
요청을 받았으며 작업을 계속함 을 의미합니다.(이 상태 코드를 만날 일은 거의 없다고 합니다)

상태 코드요약설명
100Continue클라이언트가 서버로 보낸 요청에 문제가 없으니 다음 요청을 이어서 보내도 된다는 것을 의미합니다. 만약 클라이언트의 작업이 완료되었다면 이 응답은 무시해도 됩니다.

2xx : 성공

The action was successfully received, understood, and accepted
요청을 성공적으로 받았으며, 인식했고, 수용함 을 의미합니다.

상태 코드요약설명
200OK요청이 성공적으로 수행되었음을 의미합니다. 주로 GET 요청에 대한 응답 입니다.
201Created요청이 성공적으로 수행되었으며, 그 결과로 새로운 리소스가 생성됨을 의미합니다. 주로 POST 요청에 대한 응답 입니다.
202Accepted요청은 접수되었지만, 처리는 완료되지 않음을 의미합니다. 배치 처리와 같이 요청 접수 후 일정 시간이 지난 후 요청을 처리하는 경우의 응답 입니다.
203Non-Authoritative Information요청이 성공적으로 수행되었으나, 요청에 대한 검증이 되지 않음을 의미합니다.
204No Content요청이 성공적으로 수행되었고, 응답 payload에 보낼 데이터가 없음을 의미합니다. 주로 삭제 요청에 대한 응답으로 사용된다고 합니다.
205Reset Content서버가 요청을 성공적으로 처리했지만 콘텐츠를 표시하지 않습니다. 클라이언트가 콘텐츠를 재설정할 것을 요구합니다.
206Partial Conent서버가 GET 요청의 일부만 성공적으로 처리했음을 의미합니다.

3xx : 리다이렉션 완료

Further action must be taken in order to complete the request
요청 완료를 위해 추가 작업 조치가 필요함 을 의미합니다.

상태 코드요약설명
300Multiple Choices요청에 대해 하나 이상의 리소스가 존재함을 의미합니다.
301Moved Permanently요청한 리소스의 URI가 변경되었음을 의미합니다. 해당 응답을 받으면, 브라우저는 HTTP 헤더에 들어있는 Location 필드를 찾아 해당 필드가 존재할 경우, Location 필드에 담긴 URL로 자동으로 리다이렉션합니다.
302Found요청한 리소스의 URI가 일시적으로 변경되었음을 의미합니다.
303See Other요청한 리소스를 다른 URI에서 GET 요청을 통해 얻어야 할 때의 응답 입니다.
304Not Modified수정되지 않음을 의미합니다. 해당 응답을 받으면, 클라이언트는 서버로부터 리소스를 재전송 받지 않고, 캐싱된 리소스를 사용합니다.
307Temporary Redirect302와 유사하며, User-Agent가 반드시 HTTP 메소드를 변경하지 말아야 한다는 점만 다릅니다.
308Permanent Redirect301과 유사하며, User-Agent가 반드시 HTTP 메소드를 변경하지 말아야 한다는 점만 다릅니다.

301, 302 vs. 308, 307

307은 302와 유사하고, 308은 301과 유사합니다. 차이점은 307, 308은 전송 받은 HTTP Method를 유지한다는 것입니다. 301과 302는 리다이렉트시킬 때 HTTP 메소드를 GET으로 바꿔서 전송합니다. 따라서 GET 요청을 보낼 때는 문제가 없지만, POST 요청을 했을 때 문제가 발생할 수 있습니다.

예를 들어, HTTP -> HTTPS로 리다이렉트를 구현할 때, 301 또는 302를 쓰게 되면 HTTP 프로토콜을 통해 POST 요청한 것이 HTTPS 프토토콜을 통해 GET 요청으로 변경되면서 컨트롤러나 라우터에 매핑되는 URI가 없어서 오류가 나게 된다고 합니다. 따라서 301 대신에 308을, 302 대신에 307을 쓰면 좀 더 안전하게 리다이렉트시킬 수 있다고 합니다.

참고 : https://perfectacle.github.io/2017/10/16/http-status-code-307-vs-308/
(아직 무슨 말인지 이해하기 어렵네요..)

4xx : 요청 오류

The request contains bad syntax or cannot be fulfilled
요청의 문법이 잘못되었거나 요청을 처리할 수 없음 을 의미합니다.

상태 코드요약설명
400Bad Request잘못된 문법 등으로 인해 클라이언트가 올바르지 못한 요청을 보내 서버가 요청을 이해할 수 없음을 의미합니다.
401Unauthorized인증되지 않은 사용자가 인증이 필요한 리소스를 요청하는 경우의 응답 입니다. 보통 로그인이 필요한 API를 비로그인 사용자가 호출했을 때 사용됩니다.
403Forbidden클라이언트가 콘텐츠에 접근할 권한을 가지고 있지 않음을 의미합니다. 401과 다른 점은 서버가 클라이언트가 누구인지 알고 있다는 것입니다. 보통 특정 IP나 국가가 차단되어 있는 사이트에 접속을 시도한 경우 사용됩니다.
404Not Found요청한 리소스가 존재하지 않음을 의미합니다. 인증되지 않은 클라이언트로부터 리소스를 숨기기 위해 403 대신 이 응답을 전송하기도 합니다.
405Method Not Allowed현재 리소스에 맞지 않는 메소드를 사용했음을 의미합니다. 예로는 GET 요청만 허용되는데 POST 요청을 한 경우의 응답입니다.
406No Acceptable알맞은 컨텐츠 타입이 없음을 의미합니다. 서버의 리소스가 클라이언트의 HTTP 헤더에 들어있는 Accept 필드에 명시된 콘텐츠 타입이 아닌 경우의 응답입니다.
408Request Timeout요청에 응답하는 시간이 너무 오래 걸림을 의미합니다.
409Conflict요청이 현재 서버의 상태와 충돌될 때의 응답입니다.
412Precondition Failed서버가 요청자가 요청 시 부과한 사전조건을 만족하지 않을 때의 응답입니다.
413Payload Too Large요청이 너무 커서 서버가 처리할 수 없을 때의 응답입니다.
429Too many Requests클라이언트가 지정된 시간에 너무 많은 요청을 보낸 경우의 응답입니다.

5xx : 서버 오류

The server failed to fulfill an apparently valid request
서버가 명백히 유효한 요청에 대해 충족을 실패했음 을 의미합니다.

상태 코드요약설명
500Internal Server Error서버에 오류가 발생하여 응답할 수 없음을 의미합니다. 서버에 오류가 발생했으나 처리 방법을 알 수 없을 경우의 응답입니다.
501Not Implemented클라이언트 요청에 대한 서버의 응답 수행 기능이 없음을 의미합니다.
502Bad Gateway서버가 게이트웨이로부터 잘못된 응답을 수신했음을 의미합니다. 서버의 부모 서버에서 오류가 발생한 경우의 응답입니다. 보통 서버에 접속하는 사용자가 많아 과부하될 때 발생합니다.
503Service Unavailable서버가 요청을 처리할 준비가 되지 않음을 의미합니다. 일반적으로 유지보수를 위해 작동이 중단되거나 과부하가 걸린 경우의 응답입니다.
504Gateway Timeout서버가 게이트웨이 역할을 하고 있으며, 한 서버가 액세스하고 있는 다른 서버에서 적시에 응답을 받지 못했음을 의미합니다.

실습 사이트

HTTP 상태 코드가 어떤 게 있는지 아는 것으로는 감이 잘 안 잡혀서 실제로 HTTP 요청에 대한 응답 코드를 확인할 수 있는 사이트를 찾아보았습니다.

https://httpstat.us/

위 사이트에서 응답 지연 및 모든 응답값을 확인해볼 수 있습니다.

https://httpstat.us/{응답코드}?sleep={응답지연시간}

응답지연시간은 밀리 초(ms) 단위입니다.
예를 들어, 200 응답코드에 응답지연시간은 10초로 설정하여 테스트하고 싶다면,

https://httpstat.us/200?sleep=10000

로 접속하면 됩니다. 그러면 10초 pending된 후 아래와 같이 응답하는 것을 확인할 수 있습니다.

쉘로 응답코드 확인하기

httpstat 란 도구를 사용하여 쉘로 응답코드를 확인해보았습니다.
(설치 및 cURL 옵션은 github링크를 참고해주세요.)

$ httpstat https://httpstat.us/200\?sleep\=10000

응답코드와 함께 아래와 같이 어느 구간에서 지연이 발생하고 있는지 확인할 수 있습니다.(예시의 경우, 서버 처리 단계에서 발생하고 있네요)

(실습하다보니 HTTP response 헤더에 대해서도 궁금해졌는데, 이건 다른 포스팅으로 공부해볼 예정입니다.)

파이썬으로 응답코드 확인하기

import requests
from requests import ConnectionError
from requests import HTTPError


def example(url):
    try:
        response = requests.get(url)
        print(f'{url}, {response.status_code}')
        print(response.text)
        response.raise_for_status()
    except ConnectionError:
        print("Failed to connect")
    except HTTPError:
        print("HTTP Error")

아래는 200 응답코드의 출력결과 입니다.

response.raise_for_status()를 통해 응답코드가 4xx나 5xx인 경우(HTTPError가 발생한 경우)에 대한 예외처리를 할 수 있습니다.

아래는 503 응답코드의 출력결과 입니다.

Reference

profile
I'm a constant learner. "Long Learn for Long Run!"

1개의 댓글

comment-user-thumbnail
2021년 9월 28일

정말 깔끔하게 잘 정리하셨네요👍 잘보고갑니다!!

답글 달기