HTTP Status Code
HTTP의 상태 코드는 클라이언트가 보낸 HTTP 요청이 성공했는지 실패했는지 서버에 알려주는 숫자 코드다. 개발자 도구의 Network 탭을 보면 아래와 같이 Status 숫자 코드로 요청의 결과를 간략히 나타내 주는데 클라이언트를 다루는 입장에서는 이 숫자를 보고 곧바로 결과를 유추할 수 있게 된다.
HTTP 상태 코드는 3자리 숫자로 이루어져 있으며 100번대부터 500번대까지 존재한다. 그리고 각 상태코드의 첫 번째 자리는 최상위 코드가 되어 다음과 같이 5개의 그룹으로 나뉘어 관리된다.
1XX: 요청이 수신되어 처리중
2XX: 요청 정상 처리
3XX: 요청을 완료하려면 추가 행동이 필요
4XX: 클라이언트 오류. 잘못된 문법 등으로 서버사 요청을 수행할 수 없음
5XX: 서버 오류. 서버가 정상 요청을 처리하지 못함.
이후에 따라오는 숫자들은 동일한 기능을 수행하지만 내부 동작이나 원인에 차이가 있다. 예를 들어 403과 404는 클라이언트 오류를 의미한다는 점에서 동일하지만 그 세부적인 원인은 다르다고 볼 수 있는 것이다.
cf) 각 상태 코드의 의미는 하나하나 정해져 있지만 서버와 클라이언트가 선택한 약속에 의해 다르게 적용될 수 있다. 예를 들어 상태 코드 200은 요청이 성공적으로 완료되었다는 의미를 가지고 있지만 이를 응용해 클라이언트에 다음 작업을 이어나가도 좋다는 신호의 목적으로도 쓰일 수 있다. 따라서 각 상태 코드는 제공자에 따라 다른 목적으로 클라이언트에 제공될 수 있는 것이다.
여기서 한 가지 오해하지 말아야 할 점은 2XX 코드라고 해서 200 ~ 299까지 모두 쓰이지는 않는다는 것이다. 거의 절반 이상이 아직 의미를 부여 받지 않아 쓰이지 않는 코드들이 수두룩하다. 그래서 만약 정식적으로 등록되지 않아 클라이언트가 이해할 수 없는 상태 코드를 반환 받게 되더라도 최상위 코드로 해석해서 처리하기 때문에 그렇게 큰 문제는 되지 않는다. 또한 언젠가 새로운 상태 코드가 추가된다고 하더라도 최상위 코드와 5개 그룹 내에 포함될 것이기 때문에 큰 변동사항은 없을 것이다.
1XX Informational
1XX번대의 상태 코드들은 요청이 수신되어 처리 중이라는 의미를 가진다. 다만 협업에서도 잘 사용되지 않는 상태 코드이기 때문에 깊게 다뤄지는 편은 아니다.
상태 코드 | 상태 메시지 | 설명 |
100 | Continue | - 처리가 되었으니 다음으로 진행하라는 응답 코드. - 클라이언트가 서버에 본문을 전송하기 전에 서버가 받아들일 것인지 확인하려고 할 때 그 확인 작업을 최적화하기 위한 의도로 도입된 것. |
101 | Switching Protocols | - 서버가 프로토콜을 전환 중. - TCP 연결이 다른 프로토콜에 사용될 예정임을 나타내기 위해 서버에 사용되는 상태 코드. - 클라이언트가 upgrade 헤더에 지정한 프로토콜로 요청을 하게 되면 서버가 프로토콜 교체를 승인하게 된다. |
102 | Processing | - 서버가 요청을 수신하였으며 이를 처리 중임. - 서버가 요청을 아직 처리 중이라 아직 제대로 된 응답을 알려줄 수 없음을 의미 |
103 | Early Hints | - 웹 페이지에 필요한 리소스에 대한 힌트를 제공하여 리소스를 사전 로드하게 하는 최신 상태 코드. - 서버단에서 Link 헤더를 메시지에 포함하여 응답함으로써 브라우저에 어떤 리소스를 우선적으로 로드해야 할지를 알려준다. |
2XX Success
2XX번대의 상태 코드들은 요청이 정상적으로 처리되었다는 의미를 가진다.
단순히 요청에 대한 성공을 나타내지만 클라이언트가 어떠한 행위에 대한 성공인지에 대한 것을 나타내기 때문에 응답을 받고 클라이언트가 취할 행위를 결정하는데 중요하면서도 정말 자주 보게 될 상태 코드일 것이다.
상태 코드 | 상태 메시지 | 설명 |
200 | OK | - 클라이언트의 요청을 서버가 정상적으로 처리. |
201 | Created | - 클라이언트의 요청을 서버가 정상적으로 처리했고 새로운 리소스가 생김. - 응답 헤더에는 생성된 리소스에 대한 설명과 링크 제공. - 201 상태 코드는 POST, PUT 요청에 대한 응답에 주로 이용됨. |
202 | Accepted | - 클라이언트의 요청은 정상적이나 서버가 아직 처리를 완료하지 못해서 일단 알았다는 표시. - 보통 요청이 정상적이면 작업의 성공/실패로 알려주는 것이 일반적이나 요청 처리 자체가 무거워 오래 걸릴 경우 비동기로 처리하여 완료되면 나중에 알려주겠다는 의미. - 응답 본문에는 요청에 대한 상태와 요청의 처리가 언제 완료될 것인지에 대한 추정(혹은 그에 대한 정보를 어디서 얻을 수 있는지)을 포함해야 함. |
203 | Non-Authoritative Information | - 헤더에 들어 있는 정보가 원래 서버가 아닌 프록시의 사본에서 와서 신뢰할 수 없는 정보를 의미. - 웹 사이트가 프록시 서버(CDN 또는 VPN 또는 기타)를 사용할 때 반환되는 상태 코드. - 즉 요청은 성공했지만 payload가 원본 서버의 200(OK) 응답이 변환 프록시에 의해 수정되었음을 나타냄. |
204 | No Content | - 클라이언트의 요청은 정상적이나 제공할 콘텐츠가 없음. - 서버가 요청을 성공적으로 수행했지만 응답 페이로드 본문에 담을 데이터가 없음을 의미. |
205 | Reset Content | - 브라우저를 새로고침하라는 의미 - 현재 페이지에 있는 HTML 폼에 채워진 모든 값을 비우거나 캔버스 상태를 재설정하거나 할 때 브라우저에 화면의 UI를 새로고치도록 지시함. |
206 | Partial Content | - 요청된 리소스가 성공적으로 검색되었지만 리소스 범위의 일부 부분만 반환되고 있음을 나타냄. - 이미지나 동영상 등 대용량 미디어 파일을 요청했을 때 아직 완전히 로드되지 않았음에도 특정 범위에 대한 요청을 할 때 쓰임. 그러면 서버는 전체 파일 대신 요청된 범위만 반환함. - 대용량 파일을 조각으로 다운로드하거나 미디어 파일을 스트리밍할 때 유용함. |
207 | Multi-Status | - 여러 응답이 혼합되어 있을 때 나오는 상태 코드. - 요청이 다양한 리소스에 대한 여러 개의 응답을 207 Multi Status를 통해 한 번에 처리하는 것으로 보면 됨. - 이 여러 개의 응답은 기본적으로 XML로 이루어져 있어 하위 요청 수에 따라 여러 개의 개별 응답 코드를 포함할 수 있음(JSON으로도 응답 설정이 가능) - 해당 코드는 WebDAV(Web Distributed Authoring and Vesioning)에 이용됨. |
208 | Already Reported | - 이미 앞에서 열거되었음을 의미 - 즉 앞에서 이미 보고된 정보니까 이 정보를 다시 포함하지 않음을 의미. 따라서 클라이언트는 이전에 제공된 데이터를 참조하면 됨. - 208 상태 코드는 HTTP 응답 메시지로 나타나지 않고 페이로드 본문에만 쓰이는 특성이 있음. - 해당 코드는 WebDAV(Web Distributed Authoring and Vesioning)에 이용됨. |
218 | This is fine | - 오류가 발생했지만 여기(apache 서버)는 괜찮다는 의미. - Apache 웹 서버에서 사용되는 비공식 HTTP 응답 코드. - 따라서 218 상태 코드가 수신되면 클라이언트는 Apache 웹 서버와 통신하고 있음을 이해할 수 있음. - 보통 오류 상태 코드(4XX 또는 5XX)에 대해서 클라이언트는 오류 페이지를 표시하지만 218 응답을 이용하면 오류 페이지를 표시하지 않고 Apache가 하라는 대로 오류에 대한 행위가 변형될 수 있음. |
226 | IM Used | - 서버가 GET 요청에 대한 응답 의무를 다했다는 의미. 즉 요청이 현재 상태에 반영되었음을 뜻함. - HTTP Delta Encoding 기법을 이용하면 반환되는 상태 코드. - 여기서의 IM은 I am을 나타내는 것이 아닌 Instance Manipulation(인스턴스 조작)의 약자임. |
3XX Redirection
3XX번대의 상태코드들은 리다이렉션을 의미하며, 이는 요청을 완료하려면 추가적인 작업이 필요함을 의미한다. 클라이언트가 관심 있어 하는 리소스에 대해 다른 위치를 사용하라고 말해 주거나 그 리소스의 내용 대신 다른 대안 응답을 제공한다.
리다이렉션(redirection)은 클라이언트가 요청한 URL에 대해 다른 URL을 다시(re) 지시하여(direct) 다른 주소로 이동할 수 있게 하는 기술이다. HTTP에 사용되는 리다이렉션은 크게 3가지 종류로 나눌 수 있다.
- 영구 리다이렉션(Permanent): 특정 리소스의 URL이 영구적으로 이동
- 일시 리다이렉션(Temporary): 특정 리소스의 URL이 일시적으로 이동
- 특수 리다이렉션(Special): 캐시를 활용할 것인지에 대한 여부
상태 코드 | 상태 메시지 | 설명 |
300 | Multiple Choices | - 요청에 대해서 둘 이상의 가능한 응답이 있음을 나타냄. - 클라이언트가 동시에 여러 리소스를 가리키는 URL을 요청한 경우 그 리소스의 목록과 함께 반환됨. - 어떤 서버가 하나의 HTML 문서를 영어와 프랑스어 모두로 제공하는 경우 등에 사용할 수 있음. - 그러나 응답 중 하나를 선택하는 표준화된 방법이 없기 때문에 실무에서는 거의 사용하지 않음 |
301 | Moved Permanently | - 영구적으로 이동(영구 리다이렉션) - 요청된 리소스가 Location 헤더가 지정한 URL로 이동되었음을 나타냄. - 해당 URL로 리다이렉트되면 요청 메서드가 GET으로 변하고 본문이 제거될 수 있음. - 따라서 301 코드는 GET 또는 HEAD 방법에 대한 응답으로만 사용하고 대신 POST, PUT 같은 경우는 같은 영구 리다이렉션인 308을 사용하는 것이 좋음. |
302 | Found | - 다른 URL에서 리소스를 찾음(일시 리다이렉션) - 요청된 리소스가 Location 헤더가 지정한 URL로 일시적으로 이동되었음을 나타냄(말이 일시적이지 새 URL로 리다이렉트되는 건 같음). - 302는 리다이렉트 시 301과 같이 요청 메서드가 GET으로 변하고 본문이 제거될 수 있지만 무조건적으로 변경하지 않기 때문에 브라우저에 따라 작업 수행이 달라지는 불확실성을 가질 수 있다는 특징이 있음. - 이러한 불확실성으로 인해 303, 307 상태 코드가 추가됨. 따라서 만약 사용된 메서드를 GET으로 변경하려는 경우 대신 303을 사용하는 것이 좋음. |
303 | See Other | - 다른 URL에서 리소스를 찾음(일시 리다이렉션) - 302와 기능은 동일하게 일시 리다이렉트 시 요청 메서드가 GET으로 고정되고 본문을 제거함. - 다만 302와 달리 요청 메서드의 변경과 본문 제거 행위를 무조건적으로 보장함. - 따라서 클라이언트가 요청한 리소스를 다른 URI에서 GET 요청을 통해 얻어야 할 때 서버가 클라이언트로 보내는 응답으로 이용됨. - 보통 PUT 또는 POST의 결과로서 요청에 대한 응답으로 클라이언트에 리소스의 위치를 알려주는 용도로 쓰임. |
304 | Not Modified | - 리소스 복사본 상태가 수정되지 않아 최신 상태이므로 캐시를 이용하라는 특수 리다이렉션. - 클라이언트가 리소스를 요청했는데 서버로부터 304 응답이 오면 클라이언트가 요청한 리소스가 수정되지 않은 상태이니 캐시에 가지고 있는 리소스를 그대로 사용해도 된다는 의미를 가짐. - 따라서 클라이언트는 캐시에서 리소스를 재사용하게 되고 이를 통해 네트워크 트래픽을 줄일 수 있게 됨. - 주의할 점은 304 응답 메시지는 BODY 본문에 어떠한 데이터도 포함해서는 안 됨(클라이언트가 로컬에 있는 캐시에서 리소스를 가져와 사용해야 하기 때문). - 304 응답은 GET과 HEAD 메서드에면 동작함. - CSS, Javascript 또는 이미지와 같은 정적 콘텐츠를 보다 효율적으로 전달하기 위해 CDN에서 자주 사용되는 기법. |
305 | Use Proxy | - 리소스가 프록시를 통해서만 액세스될 수 있음을 표현. - 요청한 응답은 반드시 프록시를 통해 접속해야 하는 것을 알려줌. - 보안 문제로 더이상 사용되지 않음 |
306 | Switch Proxy / Undefined | - 클라이언트가 대체 프록시를 사용하도록 리다이렉션(switch)시킴. - 보안 문제로 더이상 사용되지 않음. 현재는 미래에 사용을 위해 예약되어 있음. |
307 | Temporary Redirect | - 일시 리다이렉션. - 302와 기능은 동일하지만 일시 리다이렉트 시 요청 메서드와 본문을 유지함. - 즉 클라이언트가 처음에 POST 메서드와 함께 생성할 리소스 정보를 Body에 담아 전송했다면 새로운 URL로 리다이렉트하더라도 그 메서드와 Body 내용이 유지되는 것. - 다만 첫 요청에 POST가 사용되었다면 두 번째 요청도 반드시 POST를 사용해야 함. - 클라이언트가 요청한 리소스가 다른 URI에 있으며 이전 요청과 동일한 메서드를 사용하여 요청해야 할 때 응답으로 이용됨. cf) 307과 308의 차이는 영구 리다이렉션이냐, 일시 리다이렉션이냐의 차이이며 둘 다 리다이렉트 시 요청 메서드와 본문 body를 유지한다는 점은 동일함. |
308 | Permanent Redirect | - 영구 리다이렉션 - 301과 기능은 동일하지만 영구 리다이렉트 시 요청 메서드와 본문을 유지함. - 클라이언트가 처음에 POST 메서드와 함께 생성할 리소스 정보를 body에 담아 전송했다면 새로운 URL로 리다이렉트하더라도 그 메서드와 body 내용이 유지되는 것. - 다만 첫 요청에 POST가 사용되었다면 두 번째 요청도 반드시 POST를 사용해야 함. - 클라이언트가 요청한 리소스가 다른 URI에 있으며 이전 요청과 동일한 메서드를 사용하여 요청해야 할 때 응답으로 이용됨. |
헷갈리는 3XX 상태 코드 특징 정리
301 | 308 | 302 | 303 | 307 | |
Redirection 종류 | 영구(Permanent) | 영구(Permanent) | 일시(Temporary) | 일시(Temporary) | 일시(Temporary) |
리다이렉션 시 메서드 변경 여부 |
변경 | 유지 | 변경 | 변경(보장) | 유지 |
4XX Client Error
4XX번대의 상태 코드들은 클라이언트 오류를 의미하며 잘못된 문법 등의 오류로 인해 서버가 요청을 수행할 수 없고 그 원인이 클라이언트에 있음을 뜻한다. 잘못 구성된 요청 메시지 같은 것이 있을 수 있으며 존재하지 않는 URL 요청도 있을 수 있다.
상태 코드 | 상태 메시지 | 설명 |
400 | Bad Request | - 클라이언트가 잘못된 요청을 보냄을 의미. 클라이언트의 잘못된 요청으로 서버가 이해할 수 없어 요청을 수행할 수 없음을 뜻함. - 주로 요청 구문, 메시지 등의 문법 오류로 인한 문제가 해당. 또한 요청 파라미터가 잘못되거나 API 스펙이 맞지 않는 경우에도 400 상태 코드를 내뱉음. 따라서 이를 해결하기 위해서는 클라이언트가 자신의 요청을 검토하고 재전송해야 함. - 서버는 상태 코드와 더불어 바디에 에러 이유를 구체적으로 명시하고 응답하는 것이 좋음. |
401 | Unauthorized | - 요청자는 인증(authentication)되지 않아 수행할 수 없음을 표현. - 클라이언트가 해당 리소스에 대한 인증이 없어 접근할 수 없다는 의미. 예를 들면 로그인하지 않으면 해당 서비스를 이용하지 못하는 것. - 서버는 클라이언트에 인증하라고 요구하는 내용의 응답을 WWW-Authenticate 헤더와 함께 반환함. 클라이언트는 이를 참고하여 인증을 거쳐 요청을 재전송하면 됨. - 참고로 401 응답은 Unauthorized 가 아닌 Unauthenticated가 알맞는 단어임 |
402 | Payment Required | - 원래는 디지털 결제 시스템에 사용하기 위해 만들어졌지만 현재 이 상태 코드는 쓰이지 않음. - 나중에 사용될 것을 대비해 예약된 비표준 응답 코드. |
403 | Forbidden | - 요청자는 승인(autorization)되지 않아 작업을 진행할수 없음 - 인증 자격(로그인)은 증명되었으나, 접근 권한이 불충분하여 서버가 요청의 승인을 거부했음을 의미. - 예를 들어 회원에도 등급이 존재하는데 만일 admin 등급이 아닌 사용자가 admin 등급의 리소스에 접근을 요청했을 때 403 메시지를 응답 받게 됨. - 401과 다른 점은 서버가 클라이언트가 누구인지 알고 있다는 점(인증되었기 때문). |
404 | Not Found | - 클라이언트가 요청한 자원이 존재하지 않음. - 서버가 요청한 URL을 찾을 수 없음을 알려주기 위해 사용함. - 404 페이지를 띄우는 링크는 대체로 broken link 또는 dead link라고 부름. - 다만 404를 마주쳤다고 해서 무조건적으로 해당 리소스가 서버에 존재하지 않는다는 의미는 아님. 서버는 인증 받지 않은 클라이언트로부터 리소스를 숨기기 위하여 이 응답을 403 대신에 404를 전송하는 케이스도 있기 때문. - 또한 404 상태 코드는 리소스가 일시적 또는 영구적으로 사라졌다는 것을 의미하지는 않는다. 만일 리소스가 영구적 삭제되었다면 404 상태 코드 대신에 410 상태 코드를 쓰는 것이 맞음. |
405 | Method Not Allowed | - 요청이 허용되지 않은 메소드임을 의미 - 요청 URL에 대해 지원하지 않은 메서드로 요청 받았을 때 사용함. - 예를 들어 어느 API에 대해서 리소스를 삭제하는 것을 금지하는 등에 사용될 수 있음. - 이때 요청한 리소스에 대해 어떤 메서드가 사용 가능한지 클라이언트에 알려주기 위해 응답에 Allow 헤더가 포함되어야 함. - 단 GET과 HEAD는 필수 메서드로 처리되기 때문에 405 응답으로 제한할 수 없음. |
406 | Not Acceptable | - 콘텐츠 협상에 일치하는 것이 없음. - 이 응답은 서버가 서버 주도 콘텐츠 협상을 수행한 후 사용자 에이전트에서 보낸 규격에 어떠한 콘텐츠도 찾지 못했을 때 보내는 응답임. - 종종 서버는 클라이언트에 왜 요청이 만족될 수 없었는지 알려주는 헤더를 포함시킴. - 현업에서는 이 오류 코드를 거의 사용하지 않음. |
407 | Proxy Authentication Required | - 프록시 인증을 요구. - 401과 같으나, 프록시 버전이라고 볼 수 있음. - 리소스에 대해 중개 프록시 서버에 의해 완료된 인증이 필요하다는 뜻. - 프록시 서버는 접근 정책을 중앙 관리할 수 있기 때문에 단일 관리 포인트로도 많이 사용되기 때문에 이에 관련된 상태 코드를 따로 지원하는 것임. - 단 프록시와 웹 서버 인증 헤더가 조금 다름. |
408 | Request Timeout | - 요청이 너무 커 처리 시간이 초과되어 서버에서 요청을 처리하지 아니하고 연결을 닫음. - 만일 클라이언트의 요청을 완수하기에 시간이 너무 많이 걸리는 경우 서버는 이 상태 코드로 응답하고 연결을 끊을 수 있음. - 인터넷 연결이 매우 느리거나 끊어졌기 때문에 발생할 수도 있으며, 서버의 타임아웃 기준은 서버 설정마다 다름. |
409 | Conflict | - 클라이언트의 요청이 서버의 상태와 충돌이 발생. - 요청 처리 중 비지니스 로직상 불가능하거나 모순이 생긴 경우 사용됨 - 여타 4XX 상태 코드처럼 요청에 있어 메서드 지원 유무나 자원 유무, 인증 유무와 같은 확실한 오류 상황들을 제외한 로직 오류 상황에서 쓰임. - 사실 충돌(conflict)은 추상적인 오류 현상이기 때문에 여타 4XX 상태 코드에 속하지 않은 애매한 오류의 상황들을 처리하는 데 이용됨. - 따라서 응답은 충돌에 대해 설명하는 구체적인 본문을 포함해야 함. |
410 | Gone | - 리소스가 영구히 삭제됨 - 404 Not Found와 비슷하나 410 응답은 요청한 컨텐츠가 서버에서 영구히 삭제되어 전달해 줄 주소가 존재하지 않을때 사용됨 |
411 | Length Required | - 요청 메시지에 Content-Length 헤더가 있을 것을 요구. - 서버에서 로직을 처리하는데 필요로 하는 Content-Length 헤더 필드가 없어 서버가 요청을 거절할 때 응답됨. - 클라이언트가 서버에 chunk 데이터를 보낼 때 인코딩을 받아들여주지 않을 경우에도 이용됨. - 클라이언트는 요청 헤더에 Content-Length를 포함하고 재요청하면 됨. |
412 | Precondition Failed | - 클라이언트의 조건부 요청 실패. - 클라이언트가 캐시에 대한 조건부 요청을 했는데 실패했을 때 응답된다. (Etag나 수정일짜 불일치) - 304 응답처럼 캐시 관련 요청에서 쓰이는 코드. - 단 POST, PUT, DELETE 메서드 등 GET과 HEAD 이외의 메서드에서만 요청했을 때만 사용됨. - 이 상태 코드를 따르면 업데이트 손실 문제를 피할 수 있음. 업데이트 손실은 여러 사람이 동일한 리소스를 쓰고 있고 한 명 이상이 오래된 버전으로 작업할 때 리소스가 수정되지 않았는지 확인함으로써 중간에 수정된 데이터를 덮어쓰거나 수정하지 않도록 보장함. |
413 | Payload Too Large Request Entity Too Large |
- 요청 본문이 서버에서 정의한 한계보다 너무 커 처리할수 없음. - 서버가 처리할 수 있는 한계를 넘은 크기의 본문을 포함한 요청을 클라이언트가 보냈을 때 사용함. - 서버는 연결을 끊거나 혹은 Retry-After 헤더 필드로 돌려보낼 것임. |
414 | URI Too Long Request URI Too Long |
- 요청 URI이 너무 길어 처리할수 없음. - 서버가 처리할 수 있는 한계를 넘은 길이의 요청 URI를 클라이언트가 보냈을 때 응답됨. |
415 | Unsupported Media Type | - 요청한 미디어 포맷은 서버에서 지원하지 않음. - 서버가 이해하거나 지원하지 못하는 내용 유형의 본문을 클라이언트가 보낼 때 응답됨. |
416 | Range Not Satisfiable | - Range 헤더 필드에 요청한 지정 범위를 만족시킬 수 없음. - 클라이언트가 리소스의 특정 범위를 요청했는데 그 범위가 잘못되었거나 맞지 않을 때 응답됨. |
417 | Expectation Failed | - Expect 요청 헤더 필드로 요청한 예상 반환 코드를 만족 시킬 수 없음. - Expect 요청 헤더와 연관 있는 상태 코드(성공 시 100, 실패 시 417) |
418 | I’m a teapot | - 만우절 농담 상태 코드. - 이 오류는 1998년 만우절 농담이었던 하이퍼 텍스트 커피 포트 제어 규약(Hyper Text Coffee Pot Control Protocol)의 레퍼런스임. |
420 | Method Failure or Enhance your calm | - 클라이언트 오류를 나타내기 위해 서버에서 반환하는 비공식 클라이언트 오류 - Spring Framework에서 메서드가 실패했음을 나타내는 비공식 응답코드로도 쓰였음 (지금은 안쓰임) |
421 | Misdirected Request | - 잘못된 방향의 요청. - 의도하지 않은 요청을 받아 서버가 응답을 생성할 수 없음을 나타냄 |
422 | Unprocessable Entity | - 서버에서 본문을 처리할 수 없음을 의미. - 이 응답은 서버가 요청을 이해하고 요청 문법도 올바르지만 요청된 지시를 따를 수 없음을 나타냄. - 요청 데이터에 대해 validation 처리를 하면서 적합하지 않은 데이터를 받았을 때 반환. |
423 | Locked | - 리소스는 접근하는 것이 잠겨 있음을 의미. - 요청에 대한 대상 파일 또는 폴더가 잠겨 있을때 반환 - WebDAV에 사용되는 상태코드 |
424 | Failed Dependency | - 요청된 작업이 실패한 다른 작업에 의존하기 때문에 수행할 수 없음. - 이전 요청이 실패하였기 때문에 지금의 요청도 실패하였음을 의미 - WebDAV에 사용되는 상태코드 |
426 | Upgrade Required | - HTTP 프로토콜 업그레이드 권고 - 서버가 현재 프로토콜을 사용하여 요청을 수행할 의사가 없음을 나타내기 위해 반환되는 응답 코드임. - 예를 들어 서버는 HTTP/1.1 버전은 받지 않고 HTTP/2.0 이상만 받는다고 할 때 클라이언트가 HTTP/1.1로 요청을 보내는 상황을 말할 수 있음. - 서버는 응답할 때 Upgrade 헤더에 필요로 하는 프로토콜을 클라이언트에 알려줌. |
428 | Precondition Required | - 조건부 요청이 요구됨 - 서버가 클라이언트에게 요청을 조건부로 해야 함을 나타냄 - 일반적으로 If-Match와 같은 필수 전제 조건부 헤더가 누락되었을 때 반환됨. - 만일 조건부 헤더가 서버 측 리소스 상태와 일치하지 않을 경우 응답은 412가 됨. |
429 | Too Many Requests | - 클라이언트가 일정 시간 동안 너무 많은 요청을 보낸 경우. - 서비스가 클라이언트의 요청량을 제한하려는 경우 이용됨. 예를 들어 API 사용 건수를 시간당 100개로 제한했을 때. - 혹은 디도스와 같은 비정상적인 방법으로 자원을 마구 요청하는 경우 서버는 가용성을 위해 요청 임시 제한을 걸 수 있음. - Retry-After 헤더를 이용하여 몇 초 뒤에 재시도할 것을 나타냄. |
431 | Request Header Fields Too Large | - 헤더 필드가 너무 커서 요청을 처리하지 않음. - 총 요청 헤더 필드 수가 너무 많은 경우 또는 단일 헤더 필드가 너무 큰 경우 응답됨. - 클라리언트는 요청 헤더 필드의 크기를 줄인 후 재요청하면 됨. |
451 | Unavailable For Legal Reasons | - 법적인 이유로 비허용됨을 의미. - 클라이언트가 법적 이유로 사용할 수 없는 불법적인 리소스를 요청했음을 나타냄(정부에 의해 검열된 웹페이지 등). |
5XX Server Error
5XX번대 상태 코드들은 서버 오류를 의미하며 400번대와 동일하게 오류로 인한 요청 처리 실패를 의미하지만 원인이 서버에 있음을 뜻한다. 4XX 상태 코드와 5XX 상태 코드 모두 오류를 반환하는 응답 코드지만 4XX는 클라이언트의 요청에 문제가 있는 것이기에 요청 메시지를 검토하여 수정한 뒤 재전송하면 해결이 가능하지만, 5XX는 서버에 문제가 있는 것이므로 서버 자체의 상태를 보아야 하는 차이가 있다.
즉 클라이언트가 유효한 요청을 보냈음에도 5XX가 발생하면 즉시 서버 상태를 확인하여 서버 복구를 진행해야 한다는 것이다. 그래서 서버가 복구된 후 같은 요청 메시지를 재전송하면 요청에 성공할 가능성이 있다.
또는 클라이언트와 원 서버 모두 정상이지만 중간 프록시 서버나 게이트웨이와 같은 서버의 보조 구성 요소에서도 문제가 생길 때 5XX 응답 코드를 내뱉는다. 따라서 만일 외부 호스팅 제공업체를 사용하는 경우 오류가 발생하면 외부 호스팅 제공업체에 문의하여 살펴볼 수 있도록 해야 한다.
상태 코드 | 상태 메시지 | 설명 |
500 | Internal Server Error | - 서버 내부 문제 발생 - 서버 사용량의 폭주로 인해 서비스가 일시적으로 중단되거나, 백엔드 스크립트의 오류 등 원인은 다양함. - 서버 내부의 문제라는 것은 범위가 추상적이기 마련임. 따라서 백엔드에서는 애매한 서버 문제들에 대해 500 응답 코드로 퉁친다고 볼 수 있음. - 웹 서버에 문제가 있음을 의미하지만, 정확한 문제에 대해 더 구체적으로 설명할 수 없을때 내뱉는 응답 코드. |
501 | Not Implemented | - 요청에 대해 구현되지 않아 수행하지 아니함. - 즉 클라이언트가 서버의 능력을 넘은 요청을 했을 때 서버가 기능을 지원하지 않음을 나타내는 것. - 다만 앞으로 영원히 기능을 지원하지 않는다는 의미보다는, 추후에 기능이 개발되면 지원한다는 의미가 더 큼. |
502 | Bad Gateway | - 게이트웨이가 잘못되어, 서버가 잘못된 응답을 수신함을 의미. - 서로 다른 프로토콜을 연결해 주는 장치가 잘못된 프로토콜을 연결하거나 어느 쪽에 문제가 있어 통신이 제대로 되지 않을 때 발생됨. - 보통은 접속이 폭주하는 등의 원인으로 서버에서 어떤 이유로 통신장애가 발생하였을 경우에 발생. - 인터넷상의 서버가 다른 서버로부터 유효하지 않은 응답을 받은 경우에도 발생됨. - 혹은 사용자 브라우저에 이상이 있거나 잘못된 네트워크 연결 혹은 설정 등을 했을 때도 발생. |
503 | Service Unavailable | - 서비스 이용 불가 (일시적). - 지금은 서버가 요청을 처리할 수 없지만 나중에 가능함을 나타내고자 할 때 응답됨. - 이 응답의 일반적인 원인으로는 갑작스러운 트래픽 급증으로 서버가 과부하되거나 특정 시간대에 서버 패치 및 업데이트 등 다양한 작업을 수행하기 위해 서버 다운을 시켰거나 서버가 재부팅되거나 방화벽 설정에 잘못된 구성이 있거나 하는 등 다양함. - 서버가 언제 그 리소스를 사용할 수 있게 될지 알고 있다면 서버는 Retry-After 헤더를 응답에 포함시켜 언제 그 리소스를 사용할 수 있는지에 대한 안내를 클라이언트에 해줄 수 있음. - 502 상태 코드와 달리 웹 크롤러의 검색 순위에 영향을 미치지 않음. |
504 | Gateway Timeout | - 게이트웨이 시간 초과로, 서버에서 요청을 처리하지 아니하고 연결을 닫음 - 408과 비슷해 보이지만, 다른 서버에게 요청을 보내고 응답을 기다리다 타임아웃이 발생한 게이트웨이나 프록시 서버에서 온 응답이라는 점이 다름. |
505 | HTTP Version Not Supported | - 서버에서 지원되지 않는 HTTP 버전이라 처리 불가 - 현업에 쓰이는 HTTP 버전은 HTTP/1.0, HTTP/1.1, HTTP/2.0, HTTP/3.0이 있는데, 이들 중 서버에서 지원하지 않는 버전의 프로토콜로 된 요청을 받았을 때 응답됨 |
506 | Variant Also Negotiates | - 콘텐츠 협상과 관련 있는 상태 코드. - 실험적인 프로토콜이며 공식적으로 표준으로 채택하지 않은 응답 코드 |
507 | Insufficient Storage | - 스토리지 공간 부족 - 서버에 HTTP 요청을 수용할 충분한 공간이 없음을 나타내는 응답 코드. - WebDAV에 사용되는 상태코드 |
508 | Loop Detected | - 무한 루프를 감지 - 서버가 요청을 처리하는 동안 무한 루프를 감지한 경우 요청을 종료함. - WebDAV에 사용되는 상태코드 |
510 | Not Extended | - 추가 확장이 필요. - 실험적인 프로토콜이며 공식적으로 표준으로 채택하지 않은 응답 코드 |
511 | Network Authentication Required | - 네트워크 인증 요구. - 클라이언트가 네트워크 액세스를 얻으려면 인증이 필요하다는 것을 나타냄. 보통 네트워크에 엑세스할 때 로그인이 필요한 경우를 들 수 있음. - 캡티브 포털에서 WiFi 네트워크에 연결한 후 일종의 로그인을 거쳐야 함을 컴퓨터에 알리는 데 사용됨. - 이 응답 코드는 원 서버에서 생성되는 것이 아니라, 네트워크에 대한 액세스를 제어하는 프록시 서버에서 생성됨. ex) 공공 와이파이 인증 |
599 | Network Connect Timeout Error | - 네트워크 연결 시간 초과 오류 - 일부 프록시에서 사용하는 비공식 HTTP 상태 코드 - 개발자는 이 상태 코드를 비공식적으로 사용하여 로컬 네트워크를 찾을 수 없거나 로컬 네트워크에 대한 HTTP 연결 시간이 초과되어 코드에서 실행한 HTTP 요청이 실패했음을 나타낼 수 있음. |
그림으로 보는 상태 코드
'WEB' 카테고리의 다른 글
[WEB] URL과 URI와 URN (2) | 2024.10.24 |
---|---|
[WEB] HTTP 메시지 (1) | 2024.10.23 |
[WEB] HTTP의 Connectionless (1) | 2024.10.14 |
[WEB] HTTP의 Stateful과 Stateless (0) | 2024.10.11 |
[WEB] 웹 접근성(Web Accessibility) (0) | 2024.10.07 |