컴퓨터 공학/Web

주요 HTTP 상태 코드 (feat. 맥도날드)

혼새미로 2022. 1. 14. 21:23
반응형

1XX : Information Response

상태코드가 1로 시작하는 경우는 서버가 클라이언트로부터 요청을 받았으며, 서버에 연결된 클라이언트는 작업을 계속 진행하라는 의미이다. 해당 코드는 HTTP 1.0 에서 지원되지 않는다.

식당에서 손님이 종업원에게 음식을 주문하는 상황을 생각할 수 있다. 손님이 음식을 주문한 후, 종업원이 1XX로 주문이 완료되었음을 응답해주는 상황을 생각하면 된다.

100 Continue

진행 중임을 의미하는 응답코드이다. 현재까지의 진행상태에 문제가 없으며, 클라이언트가 계속해서 요청을 하거나 이미 요청을 완료한 경우에는 무시해도 되는 것을 알려준다.

손님이 음식을 주문한 후에 오랫동안 음식이 나오지 않자, 종업원에게 "혹시 10번 테이블 음식 주문 들어갔나요?"라고 물어볼 수 있고, 종업원은 "현재 음식 조리 중에 있습니다"라고 응답할 수 있다.

102 Processing

이 응답 코드는 서버가 요청을 수신하였으며 이를 처리하고 있지만, 아직 제대로 된 응답을 알려줄 수 없음을 의미한다.

손님이 음식을 주문했고, 종업원이 요리사에게 주문내역을 전달했지만, 요리사가 갑자기 배탈이 나서 화장실에 있다. 요리사가 화장실에서 언제 나올지 모르기 때문에 음식 조리에 얼마나 걸릴지 불확실한 상황이다.

2XX : Successful Response

200 OK

요청이 성공적으로 수행되었다. 정보는 요청에 따른 응답으로 반환된다. 요청이 성공한 경우 포괄적으로 사용된다.

201 Created

요청이 성공적이었으며, 그 결과로 새로운 리소스가 생성되었다. 이 응답은 일반적으로 POST 요청에서 사용된다.

서브웨이에서는 들어온 손님 순서대로 주문한 음식이 조리 완료되어 음식을 제공하는데, 201은 이와 같다고 볼 수 있다. 요청을 한 즉시 작업을 처리하고 결과 데이터를 응답에 포함하여 전달한다.

202 Accepted

요청을 수신하였지만, 그에 응하여 행동할 수 없다. 이 응답은 요청 처리에 대한 결과를 이후에 HTTP로 비동기 응답을 보내는 것에 대해서 명확하게 명시하지 않는다. 이것은 다른 프로세스에서 처리 또는 서버가 요청을 다루고 있거나 배치 프로세스를 하고 있는 경우를 위해 만들어졌다.

일반적인 음식점에서 내가 음식을 주문했다고 해서 즉시 만들어주지 않는다. 종업원이 주문서를 작성해서 요리사에게 전달하고, 요리사는 다른 손님들로부터 받은 주문서를 먼저 조리한 다음, 나의 주문서를 보고 요리를 시작한다. 또한, 순수하게 요리하는 시간이 10분, 20분 넘게 소요될 수도 있다. 이 경우에는 우선 손님에게 주문이 들어갔다고만 알려주고, 이후 손님이 예상한 시간보다 오래 걸린다 싶으면 손님이 주기적으로 종업원에게 주문이 제대로 들어갔는지, 또는 요리가 어느정도 진행됐는지 물어볼 수 있다. 이때, 클라이언트가 요청할 때, 1XX로 응답을 해줄 수 있다.

204 No Content

요청에 대해서 보내줄 수 있는 컨텐츠가 없는 경우에 사용된다. 일반적으로 PUT 또는 DELETE 요청에 대한 응답으로 사용된다.

손님이 음식을 주문했는데, 마음이 바뀌어서 주문을 취소할 수 있다. 이때, 종업원은 손님에게 204 응답을 전달하고, 손님은 확인 후 식당을 나가면 된다.
손님이 맥도날드에서 더블 불고기 버거 세트 1개를 주문했는데, 이후 그 손님이 더블 불고기 버거 세트 1개로 메뉴를 변경 요청해도 바뀐 것이 없기 때문에 종업원은 204로 응답해줄 수 있다.

3XX : Redirection Messages

클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.

301 Moved Permanently

이 응답 코드는 요청한 리소스의 URI가 변경되었음을 의미한다. 새로운 URI가 응답에 주어진다.

 

HTTP/1.1 301 Moved Permanently
Location : https://www.google3.com

 

맥도날드 구로점에 갔더니 종업원이 오늘 보수공사로 휴점한다고 말하면서 가장 가까운 맥도날드의 위치를 알려주었다.

304 Not Modified

클라이언트에게 응답이 수정되지 않았음을 알려주며, 그러므로 클라이언트는 굳이 기존의 리소스를 다시 받아올 필요 없이 캐시된 버전을 사용할 수 있다. 폴링 방식을 통해 새로운 정보를 계속 요청할 때 사용한다.

4XX : Client Errors

클라이언트의 요청이 유효하지 않아 서버가 해당 요청을 수행하지 않았다는 의미이다.

400 Bad Request

클라이언트의 요청이 유효하지 않아 더 이상 작업을 진행하지 않는다.

손님이 맥도날드에가서 순대국밥을 주문하면 존재하지 않는 메뉴이기 때문에 종업원은 손님에게 "주문을 접수할 수 없습니다."라고 응답한다. 다만, 손님 입장에서는 왜 주문이 접수되지 않았는지 상태 코드만으로는 알 수 없기 때문에 정확한 문제점을 메시지 ("순대국밥이라는 메뉴가 없습니다.")를 함께 전달해야 한다.
맥도날드의 마감시간이 오후 9시인데, 손님이 8시에 와서 더블불고기 버거를 오후 10시에 가지러 가겠다고 할 수 있다. 이때, 메뉴는 존재하지만 시간이 유효하지 않기 때문에 종업원 입장에서는 400으로 응답할 수 있다.

401 Unauthorized

클라이언트가 인증되지 않았기 때문에 작업을 진행할 수 없다.

예를 들어, 맥도날드에 종업원만 주문할 수 있는 히든메뉴가 있다고 하자. 이 메뉴를 주문하기 위해서는 종업원에게만 주어지는 사원증을 보여주어야 한다. 만약, 일반 손님이 그 히든메뉴의 존재를 알고서 종업원에게 히든 메뉴를 주문해도, 사원증이 없기 때문에 종업원은 401로 응답할 수 있다.

403 Forbidden

클라이언트가 권한이 없기 때문에 작업을 진행할 수 없다.

내가 맥도날드의 히든메뉴를 먹기 위해 맥도날드 종업원으로 취직했다고 하자. 그런데 내가 원하는 히든메뉴를 먹기 위해서는 3급 종업원이 되어야 한다. 그러나, 나는 현재 5급 종업원이기 때문에 그 히든메뉴를 주문할 수 있는 권한이 없는 것이다. 즉, 내가 종업원이라는 것을 인증했으나, 권한이 되지 않아 주문이 불가능하다.

404 Not Found

클라이언트가 요청한 자원이 존재하지 않는다. 존재하지 않는 URI를 요청했을 경우 404 응답을 전달한다. 또는 URI에 해당하는 자원이 존재하지 않는 경우에도 404 응답을 전달한다.

손님이 맥도날드에 와서 순대국밥과 같이 존재하지 않는 메뉴를 주문하면 404로 응답을 해줄 수 있다.
손님이 택시를 탔는데, 평양으로 가달라고 하면 국내에 존재하지 않는 장소이기 때문에 404로 응답을 해줄 수 있다.

405 Method Not Allowed

클라이언트의 요청이 허용되지 않는 메소드인 경우 사용된다.

맥도날드에서 키오스크를 통해 더블 불고기 버거를 주문 (POST)하고 종업원에게 이 주문번호에 대해 어떤 메뉴를 주문했는지 물어볼 수 (GET)는 있지만, 이미 주문한 메뉴를 변경 (PUT) 하거나, 주문취소 (DELETE)를 하는 것은 불가능하다. 만약, 손님이 주문한 더블 불고기 버거를 주문취소 요청한다면 종업원은 405로 응답을 해줄 수 있다.

409 Conflict

클라이언트의 요청이 서버의 상태와 충돌이 발생한 경우에 사용된다. 400, 401, 403, 404, 405 응답이 되지 않기 위한 모든 조건을 충족하지만, 그 이외의 조건이 충족되지 않은 경우 사용된다.

맥도날드의 히든메뉴를 주문하기 위해 종업원이 되고, 히든메뉴를 주문할 수 있는 권한을 얻기 위해 3급 종업원이 되었다고 하자. 그 종업원이 오전 업무를 마치고 히든메뉴를 주문하려고 하는데, 히든메뉴를 만들기 위한 식재료가 모두 떨어져서 해당 메뉴를 주문할 수 없는 상황이다. 이때 "히든메뉴를 위한 식재료가 부족합니다."라는 메시지와 함께 409 응답을 전달할 수 있다.

410 Gone

클라이언트가 요청한 컨텐츠가 서버에서 영구적으로 삭제되었으며, 전달해 줄 수 있는 주소 역시 존재하지 않을 때 보낸다. 서버는 클라이언트가 그들의 캐시와 리소스에 대한 링크를 지우기를 기대한다. 이 코드는 일시적인 서비스, 홍보용 서비스에서 사용하는 것을 권장한다.

맥도날드에서 4월에 한시적으로 출시한 필레오 피쉬 버거가 있다. 어떤 손님이 필레오 피쉬 버거를 맛있게 먹어서 매주 먹으러 왔었는데, 5월이 되면서 해당 메뉴가 사라졌다. 그 손님은 그 사실을 모른채 필레오 피쉬 버거를 주문했는데, 종업원이 "해당 메뉴는 일시적인 메뉴로 현재 서비스하지 않습니다."라는 메시지와 함께 410 응답을 전달할 수 있다.

429 Too Many Requests

클라이언트가 일정 시간 동안 너무 많은 요청을 보낸 경우에 사용된다.

맥도날드 근처에 축제가 열리면서 관광객이 모두 맥도날드에 몰린다고 하자. 초반에 주문을 너무 많이 받아서 현재 받은 주문을 처리하기도 바쁜 상황인데, 손님이 끊임없이 들어온다. 이때, 종업원은 각 손님에게 번호표를 주면서 10분 후, 20분 후에 다시 방문해달라고 부탁할 수 있다. 이때 종업원은 해당 손님들에게 429 응답을 전달할 수 있다.
아이디와 비밀번호를 입력하는 웹사이트에서 사용자가 특정 아이디에 대해 비밀번호를 5회 이상 잘못 입력했을 때, 서버가 클라이언트에게 5분 후에 다시 시도해달라고 요청할 때 429 응답을 전달할 수 있다.

5XX : Server Errors

서버 오류로 인해 요청을 수행할 수 없다는 의미로 사용된다. API 서버의 응답에서 5XX 오류가 발생하면 안된다. 보통 개발 과정에서 예외 처리가 잘 되지 않은 경우에 많이 발생한다.

500 Interval Server Error

웹 사이트 서버에 문제가 있음을 의미하지만 서버는 정확한 문제에 대해 더 구체적으로 설명할 수 없다.

501 Not Implemented

서버가 요청을 수행하는데 필요한 기능이 구현되지 않았을 때 사용된다.

맥도날드에서 트리플 불고기 버거를 출시했지만, 맥도날드 구로점에 아직 트리플 불고기 버거 조리법을 종업원들이 배우지 않아 만들 수 없는 상황에서 종업원이 손님들에게 501 응답을 전달할 수 있다.

502 Bad Gateway

서버가 게이트웨이로부터 잘못된 응답을 수신한 경우에 사용된다. 인터넷 상의 서버가 다른 서버로부터 유효하지 않은 응답을 받은 경우 사용된다. 예를 들면, DB 서버가 죽은 경우 웹 서버는 필요한 데이터를 가져올 수 없는데, 이때 사용된다.

맥도날드에서 더블 불고기 버거를 주문했는데, 요리사가 아무도 출근하지 않아 주문한 음식을 만들지 못하는 경우, 종업원은 손님에게 "요리사가 존재하지 않습니다." 라는 메시지와 함께 502 응답을 전달할 수 있다.

503 Service Unavailable

서버가 요청을 처리할 준비가 되지 않았을 때 사용된다. 502와 비슷하지만, 503은 보다 "일시적인 상황"에서 사용되며, 일반적으로 서버에 부하가 심해서 현재 요청을 처리할 수 있는 여유가 없을 때 사용된다.

​429 상태 코드와 비슷하게 응답 헤더의 "Retry-After" 필드를 사용하여 쿨 타임을 전달해줄 수 있다.

맥도날드의 포스기와 키오스크가 모두 고장났다. 그래서 종업원은 요리사가 조리 가능할 때만 주문을 받기로 했다. 현재 3명의 요리사가 있는데, 현재 3개의 음식을 주문받아 모든 요리사가 음식을 만들고 있는 상황에서 내가 더블 불고기 버거를 주문하려고 하자, 종업원이 "현재 조리 가능한 요리사가 부족합니다."라는 메시지와 함께 503 응답을 전달할 수 있다.

504 Gateway Timeout

408 상태 코드와 마찬가지로 요청에 대한 타임아웃을 의미한다. 그러나 504 상태 코드는 클라이언트에서 보낸 요청 때문에 발생한 것이 아니라 백엔드 내부적인 처리로 인해 발생한다. 예를 들어, 웹 서버와 DB 서버간 통신에서 지연이 발생할 수 있다.

맥도날드에서 더블 불고기 버거를 주문하면 보통 1분 안에 음식이 나왔다. 그래서 어떤 손님은 재빨리 더블 불고기를 가져갈 마음으로 드라이브 스루를 통해 더블 불고기 버거를 주문했는데, 요리사가 실수로 다 만든 더블 불고기 버거를 땅 바닥에 떨어뜨리는 바람에 다시 처음부터 만들어야 했고 이로 인해 1분 넘게 시간이 소요되었다. 이때, 종업원은 손님에게 504 응답을 전달할 수 있다.

참고

HTTP 상태 코드 정리 - WhaTap

REST API 관점에서 바라보는 HTTP 상태 코드 - sanghaklee

서버의 상태를 알려주는 HTTP 상태 코드 - evanMoon

반응형

'컴퓨터 공학 > Web' 카테고리의 다른 글

Hexagonal Architecture 소개  (0) 2022.07.02
HOL (Head Of Line) 블로킹 문제  (1) 2022.01.14