...
HTTP Status Code
HTTP의 상태 코드는 클라이언트가 보낸 HTTP 요청이 성공했는지 실패했는지를 서버에서 알려주는 숫자 코드다.
개발자 도구의 네트워크 탭을 보면 아래와 같이 Status 숫자 코드로 요청의 결과를 간략하게 나타내주는데, 클라이언트를 다루는 우리들은 이 숫자를 보고 결과를 단번에 유추할수 가 있게 된다. (물론 각 코드가 무엇을 의미하는지 별도의 공부가 필요하다)
HTTP 상태 코드는 3자리 숫자로 이루어져 있으며, 총 100번대 ~ 500번대 까지 존재한다. 그리고 각 상태코드의 첫 번째 자리는 최상위 코드가 되어 다음과 같이 5 개의 그룹으로 나뉘어 관리된다.
1XX : 요청이 수신되어 처리중
2XX : 요청 정상 처리
3XX : 요청을 완료하려면 추가 행동이 필요
4XX : 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음
5XX : 서버 오류, 서버가 정상 요청을 처리하지 못함
이후에 따라오는 아래의 숫자들은 동일한 기능을 수행하지만 내부 동작이나 원인에 있어 차이를 가지게 된다. 예를들어 403 과 404 는 클라이언트 오류를 의미하는 것은 동일하지만, 그 세부적인 원인은 다르다고 볼 수 있다.
각 상태 코드의 의미는 하나하나 정해져 있지만, 서버와 클라이언트가 선택한 약속에 의해 다르게 적용될 수 있다는 점은 숙지하고 넘어가자.
예를 들면 상태 코드 200은 요청이 성공적으로 완료되었다는 의미를 갖고 있지만, 이를 응용해 클라이언트에 다음 작업을 이어 나가도 좋다는 신호의 목적으로도 쓰일 수 있다. 따라서 각 상태 코드는 제공자에 따라 다른 목적으로 클라이언트에 제공될 수 있다.
한가지 오해하지 말아야 할점은, 2XX 코드라고해서 200 ~ 299 까지 모두 쓰이지 않는다는 점이다. 거의 절반 이상이 아직 의미를 부여받지 않아 쓰이지 않는 코드들이 수두룩 하다. 그래서 만일 정식적으로 등록되지 않아 클라이언트가 이해할 수 없는 상태 코드를 반환 받게 되더라도 최상위 코드로 해석해서 처리하기 때문에 그렇게 큰 문제는 되지 않는다. 또한 미래에 새로운 상태코드가 추가된다고 하더라도 최상위 코드의 5 개 그룹 내에 포함될 것이기 때문에 큰 변동사항은 없을 것이다.
1XX Informational
1xx 번대의 상태 코드들은 요청이 수신되어 처리 중이라는 의미를 가진다.
다만 협업에서도 잘 사용되지 않는 상태코드이기 때문에 깊게 다루어 지지는 않는다.
상태 코드 | 상태 메세지 | 설명 |
100 | Continue | 처리가 되었으니 다음으로 진행 |
101 | Switching Protocols | 서버가 프로토콜을 전환중 |
102 | Processing | 서버가 요청을 아직 처리중이라 제대로된 응답을 알려줄수 없음 |
103 | Early Hints | 웹페이지에 필요한 리소스에 대한 힌트를 제공하여 리소스를 사전 로드하여 로딩을 빠르게 |
2XX Success
2xx 번대의 상태 코드들은 요청이 정상적으로 처리되었다는 의미를 가진다.
단순히 요청에 대한 성공을 나타내지만, 클라이언트가 어떠한 행위에 대한 성공인지에 대한 것을 나타내기 때문에, 응답을 받고 클라이언트가 취할 행위를 결정하는데 중요하면서도 정말 자주 보게될 상태 코드일 것이다.
상태 코드 | 상태 메세지 | 설명 |
200 | OK | 클라이언트의 요청을 서버가 정상적으로 처리 |
201 | Created | 클라이언트의 요청을 서버가 정상적으로 처리했고 새로운 리소스가 생김 |
202 | Accepted | 클라이언트의 요청은 정상적이나, 서버가 아직 처리를 완료하지 못해서 일단 알았다는 표시 (요청이 크고 무거운 경우) |
203 | Non-Authoritative Information | 웹사이트가 프록시 서버(CDN 또는 VPN 또는 기타)를 사용할 때 반환되는 상태 코드 |
204 | No Content | 클라이언트의 요청은 정상적이다. 하지만 제공할 컨텐츠가 없다. |
205 | Reset Content | 브라우저를 새로 고침하라는 의미 |
206 | Partial Content | 리소스 범위의 일부 부분만 반환 |
207 | Multi-Status | 응답 바디가 여러개 혼합되어 응답됨 - WebDAV에 사용되는 상태코드 |
208 | Already Reported | 이미 앞에서 열거되었음을 의미 - WebDAV에 사용되는 상태코드 |
218 | This is fine | 오류가 발생했지만 여긴(apache 서버) 괜찮아~ 의미 아파치(Apache) 웹 서버 에서 사용되는 비공식 HTTP 응답 코드 |
226 | IM Used | 서버가 GET 요청에 대한 응답 의무를 다했다는 의미 HTTP Delta Encoding 기법을 이용한 부분 수정 리소스만 반환하여 네트워크 다운로드를 아낌 |
3XX Redirection
3xx 번대의 상태 코드들은 리다이렉션을 의미하며, 이는 요청을 완료하려면 추가적인 작업이 필요함을 의미한다.
클라이언트가 관심 있어 하는 리소스에 대해 다른 위치를 사용하라고 말해주거나 그 리소스의 내용 대신 다른 대안 응답을 제공한다.
리다이렉션(Redirection)은 클라이언트가 요청한 URL에 대해 다른 URL을 다시(re) 지시(direct)하여 다른 주소로 이동할 수 있게 하는 기술이다. HTTP 에 사용되는 리다이렉션은 크게 3가지 종류로 나눌 수 있다.
- 영구 리다이렉션(Permanent) : 특정 리소스의 URL 이 영구적으로 이동
- 일시 리다이렉션(Temporary) : 특정 리소스의 URL 이 일시적으로 이동
- 특수 리다이렉션(Special) : 캐시를 활용할 것인지에 대한 여부
상태 코드 | 상태 메세지 | 설명 |
300 | Multiple Choices | 요청에 대해서 둘 이상의 가능한 응답이 있음을 나타낸다. - 실무에서 거의 사용하지 않음 |
301 | Moved Permanently | 영구적으로 이동 - 영구 리다이렉션 - 메서드가 GET으로 바뀜 |
302 | Found | 다른 URL에서 리소스를 찾음 - 일시 리다이렉션 - 메서드가 GET으로 바뀜 |
303 | See Other | 다른 URL에서 리소스를 찾음 - 일시 리다이렉션 - 메서드가 GET으로 바뀜 |
304 | Not Modified | 리소스 복사본 상태가 수정 되지 않아 최신 상태이므로 캐시를 이용 - 특수 리다이렉션 |
305 | Use Proxy | 리소스가 프록시를 통해서만 액세스될 수 있음을 표현 - 보안 문제로 더이상 사용되지 않음 |
306 | Switch Proxy / Undefined | 클라이언트가 대체 프록시를 사용하도록 리다이렉션(switch) 시킨다 - 보안 문제로 더이상 사용되지 않음 |
307 | Temporary Redirect | 임시로 이동 - 일시 리다이렉션 - 메서드가 유지됨 |
308 | Permanent Redirect | 영구 이동 - 영구 리다이렉션 - 메서드가 유지됨 |
헷갈리는 3XX 상태코드 특징 정리
301 | 308 | 302 | 303 | 307 | |
리다이렉션 종류 | 영구(Permanent) | 영구(Permanent) | 일시(Temporary) | 일시(Temporary) | 일시(Temporary) |
리다이렉션시 메소드를.. | 변경 | 유지 | 변경 | 변경 (보장) | 유지 |
4XX Client Error
4xx 번대의 상태 코드들은 클라이언트 오류를 의미하며, 잘못된 문법 등의 오류로 인해 서버가 요청을 수행할 수 없고 그 원인이 클라이언트에게 있음을 뜻한다. 잘못 구성된 요청 메세지 같은 것이 있을 수 있으며, 존재하지 않은 URL 요청도 있을 수 있다.
상태 코드 | 상태 메세지 | 설명 |
400 | Bad Request | 클라이언트가 잘못된 요청을 보냄을 의미 주로 요청 구문, 메시지 등의 문법 오류로 인한 문제가 해당 |
401 | Unauthorized | 요청자는 인증(authentication) 되지 않아 수행할 수 없음을 표현 참고로 401 응답은 Unauthorized 가 아닌 Unauthenticated 가 알맞는 단어이다. |
402 | Payment Required | 나중에 사용될 것을 대비해 예약된 비표준 응답 코드 |
403 | Forbidden | 요청자는 승인(autorization)되지 않아 작업을 진행할수 없음 인증 자격(로그인)은 증명되었으나, 회원 등급에 의해 접근 권한이 불충분할때 사용 |
404 | Not Found | 클라이언트가 요청한 자원이 존재하지 않음 |
405 | Method Not Allowed | 요청이 허용되지 않은 메소드임을 의미 서버에서 해당 요청 HTTP 메소드에 대해 기능을 제한/금지 함 |
406 | Not Acceptable | 콘텐츠 협상에 일치하는 것이 없음 현업에서는 이 오류 코드를 거의 사용하지 않는다. |
407 | Proxy Authentication Required | 프록시 인증을 요구 401 Unauthorized 와 같으나, 프록시 버전이라고 보면 된다. |
408 | Request Timeout | 요청이 너무 커 처리 시간이 초과되어 서버에서 요청을 처리하지 아니하고 연결을 닫음 |
409 | Conflict | 크라이언트의 요청이 서버의 상태와 충돌이 발생 요청 처리 중 비지니스 로직상 불가능하거나 모순이 생긴 경우 사용된다. |
410 | Gone | 리소스가 영구히 삭제됨 404 Not Found와 비슷하나 410 응답은 요청한 컨텐츠가 서버에서 영구히 삭제되어 전달해 줄 주소가 존재하지 않을때 사용된다. |
411 | Length Required | 요청 메시지에 |
412 | Precondition Failed | 클라이언트의 조건부 요청 실패 클라이언트가 캐시에 대한 조건부 요청을 했는데 실패했을 때 응답된다. (Etag나 수정일짜 불일치) - 304 응답은 GET 과 HEAD 메소드에만 동작한다. - 412 응답은 이를 제외한 POST, PUT, PATCH 등 메소드에만 동작한다. |
413 | Payload Too Large Request Entity Too Large |
요청 본문이 서버에서 정의한 한계보다 너무 커 처리할수 없음 |
414 | URI Too Long Request URI Too Long |
요청 URI이 너무 길어 처리할수 없음 |
415 | Unsupported Media Type | 요청한 미디어 포맷은 서버에서 지원하지 않음 |
416 | Range Not Satisfiable | |
417 | Expectation Failed | |
418 | I’m a teapot | 만우절 농담 상태 코드 |
420 | Method Failure or Enhance your calm | 클라이언트 오류를 나타내기 위해 서버에서 반환하는 비공식 클라이언트 오류 Spring Framework에서 메서드가 실패했음을 나타내는 비공식 응답코드로도 쓰였음 (지금은 안쓰임) |
421 | Misdirected Request | 의도하지 않은 요청을 받아 서버가 응답을 생성할 수 없음을 나타냄 |
422 | Unprocessable Entity | 이 응답은 서버가 요청을 이해하고 요청 문법도 올바르지만 요청된 지시를 따를 수 없음을 나타냄 |
423 | Locked | 요청에 대한 대상 파일 또는 폴더가 잠겨 있을때 반환 - WebDAV에 사용되는 상태코드 |
424 | Failed Dependency | 이전 요청이 실패하였기 때문에 지금의 요청도 실패하였음을 의미 - WebDAV에 사용되는 상태코드 |
426 | Upgrade Required | HTTP 프로토콜 업그레이드 권고 |
428 | Precondition Required | 조건부 요청이 요구됨 서버가 클라이언트에게 요청을 조건부로 해야 함을 나타낸다. |
429 | Too Many Requests | 클라이언트가 일정 시간 동안 너무 많은 요청을 보낸 경우 |
431 | Request Header Fields Too Large | 헤더 필드가 너무 커서 요청을 처리하지 않음 |
451 | Unavailable For Legal Reasons | 법적인 이유로 비허용됨 |
5XX Server Error
5xx 번대의 상태 코드들은 서버 오류를 의미하며, 400 번대와 동일하게 오류로 인한 요청 처리 실패를 의미하지만 원인이 서버에게 있음을 뜻한다.
4XX 상태코드와 5XX 상태코드 모두 오류를 반환하는 응답 코드이지만, 4XX는 클라이언트의 요청에 문제가 있는 것이기에 요청 메세지를 검토하여 수정한 뒤 재전송하면 해결이 가능하지만, 5XX 는 서버에 문제가 있는 것이기 때문에 서버 자체의 상태를 보아야 하는 차이가 있다.
상태 코드 | 상태 메세지 | 설명 |
500 | Internal Server Error | 서버 내부 문제 발생 서버 사용량의 폭주로 인해 서비스가 일시적으로 중단되거나, 백엔드 스크립트의 오류 등 원인은 다양하다. 웹 서버에 문제가 있음을 의미하지만, 정확한 문제에 대해 더 구체적으로 설명할 수 없을때 내뱉는 응답 코드이다. |
501 | Not Implemented | 요청에 대해 구현되지 않아 수행하지 아니함 다만 앞으로 영원히 기능을 지원하지 않는 다는 의미보다는, 추후에 기능이 개발되면 지원한다는 의미가 더 크다. |
502 | Bad Gateway | 게이트웨이가 잘못되어, 서버가 잘못된 응답을 수신함을 의미 보통은 접속이 폭주하는 등의 원인으로 서버에서 어떤 이유로 통신장애가 발생하였을 경우에 발생 |
503 | Service Unavailable | 서비스 이용 불가 (일시적) |
504 | Gateway Timeout | 게이트웨이 시간 초과로, 서버에서 요청을 처리하지 아니하고 연결을 닫음 408 Request Timeout 과 비슷해 보이지만, 다른 서버에게 요청을 보내고 응답을 기다리다 타임아웃이 발생한 게이트웨이나 프록시 서버에서 온 응답이라는 점이 다르다. |
505 | HTTP Version Not Supported | 서버에서 지원되지 않는 HTTP 버전이라 처리 불가 |
506 | Variant Also Negotiates | 실험적인 프로토콜이며 공식적으로 표준으로 채택하지 않은 응답 코드 |
507 | Insufficient Storage | 스토리지 공간 부족 - WebDAV에 사용되는 상태코드 |
508 | Loop Detected | 무한 루프를 감지 - WebDAV에 사용되는 상태코드 |
510 | Not Extended | 실험적인 프로토콜이며 공식적으로 표준으로 채택하지 않은 응답 코드 |
511 | Network Authentication Required | 네트워크 인증 요구 ex) 공공 와이파이 인증 |
599 | Network Connect Timeout Error | 네트워크 연결 시간 초과 오류 일부 프록시에서 사용하는 비공식 HTTP 상태 코드 |
그림으로 알아보는 상태코드
화장실 그림으로 HTTP 상태 코드에 비유해 재미있게 이해하는 짤이 있어서 가져와 보았다. 그림의 아이콘들이 표현한 의미와 HTTP 상태 코드 의미를 대입하여 공감이 되면 상태 코드에 대해서 잘 숙지하고 있음을 나타내는 것일 것이다.
# 참고자료
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
https://www.monkeyuser.com/2017/http-status-codes/
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.