HTTP 응답 코드에 대해 알아보자

cansweep·2022년 9월 11일
post-thumbnail

얼마 전 면접에서 나왔던 질문 중 하나였다.

200부터 500까지 HTTP 응답 코드에 대해 설명해 주실래요?

질문을 듣자마자 머릿 속에서는 아주 당연한 답변밖에 내놓지 못했다.

200번대는 성공이고 400번대는 에러고... 아, 500은 서버 에러 입니다.

그동안 궁금해약 프로젝트를, 또 많은 프로젝트를 진행하며 401, 403등 응답 코드를 무수히 많이 봐왔지만 면접장에서는 메세지가 무슨 영어로 되어있었는데? 할 뿐 기억이 나지 않아 제대로 된 답변을 내놓지 못했다.

그래서 오늘은 HTTP 응답 코드에 대해 알아보고자 한다.

HTTP 응답 상태 코드란?

HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지를 알려준다.
응답은 5개의 그룹으로 나누어져 있다.

  • 정보를 제공하는 응답
  • 성공적인 응답
  • 리다이렉트
  • 클라이언트 에러
  • 서버 에러

100번대

100 Continue

지금까지의 상태가 괜찮으며 클라이언트가 계속해서 요청을 하거나 이미 요청을 완료한 경우 무시해도 된다.

101 Switching Protocol

클라이언트가 보낸 Upgrade 요청 헤더에 대한 응답이 들어간다.
서버에서 프로토콜을 변경할 것임을 알려준다.

103 Early Hints

주로 Link 헤더와 함께 사용된다.
서버가 응답을 준비하는 동안 user agent가 사전 로딩을 시작할 수 있도록 한다.

200번대

200 OK

요청이 성공적으로 이루어졌다.
성공의 의미는 HTTP 메소드에 따라 달라진다.

  • GET : 리소스를 불러오는데 성공하였으며 이 리소스는 메세지의 바디에 존재한다.
  • POST/PUT : 수행 결과에 대한 리소스가 메세지의 바디에 존재한다.
  • HEAD : 개체 헤더가 메세지의 바디에 존재한다.
  • TRACE : 메세지의 바디는 서버에서 수신한 요청 메세지를 포함하고 있다.

201 Created

요청은 성공적이었으며 그 결과로 새로운 리소스가 생성되었다.

202 Accepted

요청을 성공적으로 접수하였으나 해당 요청에 대해 처리 중이거나 처리 시작 전임을 의미한다.
즉, 다른 프로세스에서 처리 또는 서버가 요청을 다루고 있거나 배치 프로세스를 하고 있는 경우에 해당한다.
요청이 처리 중 실패할 수도 있기 때문에 요청의 실행 여부는 장담할 수 없다.

203 Non-Authoritative Information

요청은 성공했지만 origin server의 200 ok 응답이 proxy에 의해 수정되었기에 응답을 신뢰할 수 없다.

204 No Content

요청에 대해 보내줄 리소스가 없다.
다만 헤더는 의미있을 수 있다.
user agent는 리소스가 캐시된 헤더를 업데이트할 수 있다.

205 Reset Content

요청이 끝난 이후 form의 내용을 지우거나, 캔버스의 상태를 재설정하거나, UI를 새로 고치는 등 client의 문서 뷰를 새로고침하라고 알려준다.

206 Partial Content

Range 헤더에 기술된 데이터 범위에 대한 요청이 성공적으로 응답되어 메세지 바디에 리소스를 담고있다는 것을 알려준다.

300번대

300 Multiple Choice

요청에 대해 하나 이상의 응답이 가능하다.
user agent 또는 user는 그 중 하나를 반드시 선택해야 한다.

301 Moved Permanently

요청한 리소스의 URI가 변경되었음을 의미한다.
요청한 리소스의 새 URI가 응답에서 주어질 수도 있다.

302 Found

요청한 리소스의 URI가 일시적으로 변경되었음을 의미한다.

303 See Other

클라이언트가 요청한 리소스를 다른 URI에서 GET 요청을 통해 얻어야함을 알려준다.

304 Not Modified

요청한 리소스를 재전송할 필요가 없음을 나타낸다.
즉, 클라이언트에게 응답이 수정되지 않았음을 알려준다.

307 Temporary Redirect

클라이언트가 요청한 리소스가 다른 URI에 있으며 이전 요청과 동일한 메소드를 사용해 요청해야 할 때 서버가 클라이언트에 이 응답을 보낸다.
302 Found와 동일한 의미를 가지지만 HTTP 메소드를 변경하지 말아야 한다는 점이 다르다.

308 Permanent Redirect

리소스가 HTTP 응답 헤더의 Location에 명시된 다른 URI에 영구히 위치하고 있음을 의미한다.
301 Moved Permanently와 동일한 의미를 가지지만 HTTP 메소드를 변경하지 말아야 한다는 점이 다르다.

400번대

400 Bad Request

잘못된 문법으로 인해 서버가 요청을 이해할 수 없다.

401 Unauthorized

클라이언트가 요청한 응답을 받기 위해서는 스스로를 인증해야 한다.

403 Forbidden

클라이언트가 리소스에 접근할 권리를 가지고 있지 않다.
401 Unauthorized와 다른 점은 서버가 클라이언트가 누구인지 알고있다는 점이다.

404 Not Found

브라우저에서 알려지지 않은 URL에 접근해 서버가 요청받은 리소스를 찾을 수 없는 경우이다.

405 Method Not Allowed

요청한 메소드를 서버에서 알고있지만 제거되어 사용할 수 없는 경우이다.

406 Not Acceptable

서버가 Content negotiation을 수행한 이후 user agent에서 정해준 규격에 따른 어떠한 콘텐츠도 찾지 못했을 경우이다.

407 Proxy Authentication Required

401 Unauthorized와 비슷하지만 프록시에 의한 인증이 필요한 경우이다.

408 Request Timeout

서버가 사용하지 않는 연결을 끊고 싶다는 것을 의미한다.
서버가 클라이언트의 요청 없이도 유휴 상태인 연결에 전송한다.

409 Conflict

요청이 현재 서버의 상태와 충돌된다.

410 Gone

요청한 리소스가 서버에서 영구적으로 삭제되었으며 전달해 줄 수 있는 주소도 존재하지 않음을 의미한다.

411 Length Required

서버에서 필요로 하는 Content-Length 헤더 필드가 정의되지 않은 요청이기 때문에 서버가 요청을 거절하는 경우이다.

412 Precondition Failed

클라이언트의 헤더에 있는 전제 조건이 서버의 전제 조건에 적절하지 않다.

413 Payload Too Large

요청한 리소스가 서버에서 정의한 제한보다 큰 경우이다.
서버는 연결을 끊거나 Retry-After 헤더 필드로 돌려보낼 수 있다.

414 URI Too Long

클라이언트가 요청한 URI가 서버에서 해석하려는 것보다 긴 경우이다.

415 Unsupported Media Type

요청한 미디어 포맷을 서버에서 지원하지 않는 경우이다.

416 Requested Range Not Satisfiable

Range 헤더 필드에 요청한 범위를 만족시킬 수 없는 경우이다.
범위가 타겟 URI 데이터의 크기를 벗어났을 가능성이 있다.

417 Expectation Failed

Expect 헤더 필드에 요청한 예상이 서버에서는 적당하지 않은 경우이다.

422 Unprocessable Entity

요청은 잘 만들어졌지만 문법 오류로 인해 따를 수 없는 경우이다.

426 Upgrade Required

서버가 지금의 프로토콜을 사용하여 요청을 처리하는 것을 거절한 경우이다.
다만 클라이언트가 다른 프로토콜로 업그레이드하면 처리할 가능성이 있다.
서버는 Upgrade 헤더와 필요로 하는 프로토콜을 알려준다.

428 Precondition Required

origin 서버가 조건부 요청을 요구한다는 것을 알려준다.
클라이언트가 리소스를 GET하고, 수정하고, PUT하는 동안 서드파티가 서버의 상태를 수정하여 발생하는 충돌인 '업데이트 상실'을 예방하기 위한 목적이다.

429 Too Many Requests

사용자가 지정된 시간동안 너무 많은 요청을 보낸 경우이다.

431 Request Header Fields Too Large

요청한 헤더 필드가 너무 크기 때문에 서버가 요청을 처리하지 않을 경우이다.
요청 헤더의 크기를 줄인 다음 다시 요청해야 한다.

사용자가 요청한 리소스가 정부에 의해 검열된 웹 페이지와 같은 불법적인 리소스일 경우이다.

500번대

500 Internal Server Error

서버가 처리할 방법을 모르는 경우이다.

501 Not Implemented

요청 방법이 서버에서 지원되지 않아 처리할 수 없는 경우이다.

502 Bad Gateway

서버가 게이트웨이나 프록시 서버 역할을 수행하며 업스트림 서버로부터 유효하지 않은 응답을 받았음을 의미한다.

503 Service Unavailable

서버가 요청을 처리할 준비가 되지 않은 경우이다.
일반적으로 503 Service Unavailable의 원인에는 유지보수를 위해 작동이 중단되거나 과부하가 걸렸을 때이다.
이 응답은 일시적인 상황을 위해 사용되어야 하며 가능하다면 서비스 복구를 위한 예상 시간을 포함해야 한다.

504 Gateway Timeout

서버가 게이트웨이나 프록시 서버 역할을 수행하며 업스트림 서버로부터 요청을 마치기 위해 필요한 응답을 받지 못한 경우이다.

505 HTTP Version Not Supported

요청에 사용된 HTTP 버전이 서버에서 지원되지 않는 경우이다.

506 Variant Also Negotiates

서버에 내부 구성 오류가 있는 경우이다. Transparent Content Negotiation에서 제공될 수 있다.

507 Insufficient Storage

서버에 내부 구성 오류가 있는 경우이다. WebDAV 프로토콜에서 제공될 수 있다.

508 Loop Detected

서버가 요청을 처리하는 동안 무한 루프를 감지한 경우이다.

510 Not Extended

서버가 요청을 이행하기 위해 요청에 대한 추가 확장이 필요한 경우이다.

511 Network Authentication Required

클라이언트가 네트워크 액세스를 얻기 위해 인증을 받아야 할 필요가 있는 경우이다.

결론

HTTP 응답 코드는 HTTP 요청이 어떻게 처리되었는지에 대한 대답이라고 할 수 있다.

200번대는 요청이 성공적으로 전달되었고 원하는 리소스가 있을 경우 줄 수 있다는 뜻이다.

300번대는 요청은 전달되었으나 원하는 리소스를 줄 가능성이 있을 경우이다.
예를 들어 원하는 리소스의 URI가 달라졌고 이를 인지하고 있거나 리소스의 변경 사항이 없을 때가 있다.

400번대는 요청이 전달되었으나 원하는 리소스를 줄 수 없을 경우이다.
원하는 리소스를 얻기 위해 인증이 필요할 수도 있고 리소스 자체를 찾을 수 없을 수도 있다.

500번대는 요청이 실패한 경우이다.
서버가 처리할 방법을 모르거나 다운되었을 경우에 해당한다.

++
418 I'm a teapot도 있다.
1998년 만우절 농담으로 나온 응답 코드라는데 서버는 찻주전자라 커피를 내릴 수 없다는 의미이다.
실제로 https://www.google.com/teapot 에 들어가면 418 응답 코드를 반환한다.
ㅎㅎ...재밌...다...

📎 관련 링크

MDN - HTTP 상태 코드

profile
하고 싶은 건 다 해보자! 를 달고 사는 프론트엔드 개발자입니다.

0개의 댓글