출처: Medium, Revisiting HTTP status code

클라이언트와 서버가 통신을 할 때 요청이 성공적으로 완료되었는지, 오류가 있어 요청이 실패하였는지 알 수 있어야합니다. 위의 사진처럼 모든 응답에 대해 같은 HTTP 상태 코드를 반환하면 어떤 상황인지 알아보기 힘들어집니다. 그래서 서버는 클라이언트에 응답을 보낼 때 각각의 상황에 맞는 상태코드를 포함하여 응답합니다. HTTP 응답으로 주어지는 상태 코드를 통해 요청이 성공적으로 수행되었는지, 실패했다면 이유가 무엇인지에 대한 정보를 대략적으로 알 수 있습니다.

 

HTTP의 응답은 응답, 성공적인 응답, 리다이렉트, 클라이언트 에러, 그리고 서버 에러의 5개 그룹으로 나누어집니다.

상태코드는 세 자리의 숫자로 나타내며, 첫 번째 숫자는 그룹을, 나머지 숫자는 상세한 코드를 나타냅니다.

출처: reddit, HTTP!, https://www.reddit.com/r/ProgrammerHumor/comments/rwxc4o/http/

정보 응답 혹은 조건부 응답(1XX)

요청을 받았고, 작업을 진행 중이라는 의미입니다.

100 Continue

클라이언트가 서버로 보낸 요청에 문제가 없으니 다음 요청을 이어서 보내야 한다는 것을 의미합니다.서버는 이 코드를 제공하여 요청의 첫 번째 부분을 받았으며 나머지를 기다리고 있음을 나타냅니다. 만약 클라이언트 측에서 필요한 요청이 완료되어 추가적인 요청이 필요하지 않다면, 무시해도 됩니다.
클라이언트에서 서버가 문제없는지 확인하고 싶다면 첫 번째 요청에서 "Expect: 100-continue"를 헤더에 포함하여 보낼 수 있습니다.

101 Switching Protocols

요청자가 서버에 프로토콜 전환을 요청했으며 서버는 이를 승인하는 중이라는 의미입니다. 주로 Websocket으로 프로토콜을 전환할 때 사용합니다.

성공 응답(2XX)

클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 의미합니다.

200 OK

요청이 성공했음을 나타내는 성공 응답 상태 코드입니다. 대부분의 서버가 요청한 페이지를 제공했다는 의미입니다. 가장 흔하게 볼 수 있는 상태코드이기도 합니다. 요청된 HTTP method에 따라 성공의 의미는 조금씩 다를 수 있으며, 일반적으로 PUT과 DELETE의 성공은 200 OK가 아닌 203 No Content, POST를 통해 리소스를 새로 생성한 경우 201 Created가 응답으로 주어집니다.
200 OK의 상태코드는 기본적으로 캐시 가능합니다.

201 Created

요청이 성공적으로 처리되었으며, 자원이 생성되었음을 의미합니다. 응답을 반환하기 전에 서버에 새로운 리소스가 생성이 되었음을 알 수 있습니다. 일반적으로 응답 메세지의 본문(body)으로 새롭게 만들어진 리소스를 포함하거나 해당 리소스에 대한 설명과 링크가 포함될 수 있습니다.

202 Accepted

요청이 처리를 위해 수락되었으나, 아직 해당 요청에 대해 처리 중이거나 처리 시작되지 않았을 수 있다는 것을 의미합니다. 요청을 처리하는 중 실패할 수도 있기 때문에 요청은 성공할 수도 실패할 수도 있는 모호한 응답입니다. HTTP가 나중에 요청 처리 결과를 나타내는 비동기 응답을 보낼 방법이 없기때문에 요청이 받아들여진 사실만을 보내주는 경우입니다. 요청을 받은 서버가 직접 요청을 처리하지 않고 다른 서버에 요청을 보내어 처리하는 상황에서 사용됩니다.

203 Non-Authoritative Information

서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공하고 있음을 의미합니다. 서버에 저장된 리소스가 아닌 다른 곳에서 수집된 리소스를 응답으로 보내주었 다는 것을 알리기 위해 사용합니다. 일반적으로는 200 OK를 사용하여 응답하는 경우가 많다고 합니다.

204 No Content

요청이 성공했으나 클라이언트에게 전달할 콘텐츠가 없다는 것을 의미합니다. 처리한 결과를 클라이언트 측에서 알 필요가 없고 처리가 되었는지만 확인하면 되는 경우에 사용합니다. 예를 들어 삭제 요청에 대한 응답으로 제공될 수 있습니다.
204 No Content 응답은 기본적으로 캐시 가능하며, 캐시에서 가져온 응답인 경우 "ETag" 헤더를 포함합니다

205 Reset Content

form의 내용을 지우거나, 캔버스 상태를 재설정하거나, UI를 새로 고치려면 client의 문서 화면 요소를 새로고침하라고 알려줄 때 사용합니다.

206 Partial Content

컨텐츠의 일부 부분만 제공하고 있다는 것을 알릴 때 사용합니다. 클라이언트에서 범위를 설정하여 요청을 보냈을 경우에 사용합니다. 분할 다운로드등의 범위를 헤더에 포함하였을 때 해당 상태 코드를 응답 받을 수도 있습니다.

리다이렉션 메시지 또는 리다이렉션 완료(3XX)

클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다는 것을 의미합니다. 단축 도메인(단축 URL)서비스의 경우 접속 시 301 또는 302 코드를 보내고 헤더의 Location으로 리다이렉션할 실제 URL을 적어 보냅니다.

301 Moved Permanently

요청한 리소스가 Location 헤더에 주어진 URL로 완전히 옮겨졌다는 것을 의미합니다. 브라우저는 "Location" 헤더에 주어진 URL로 리다이렉트합니다. 이 응답 코드를 올바르게 사용한다면, 헤더에 "Locaion"으로 새로운 URL을 알려주어야 합니다. 리다이렉션을 수행할 때 메서드와 본문은 변경되지 않아야 하지만 301 Moved Permanently 상태 코드를 사용한다면 메서드가 변경될 수 있기 때문에, GET 또는 HEAD 메서드 외의 요청인 경우, 메서드 변경이 명시적으로 금지되어 있는 308 Permanent Redirect를 사용하여야 합니다.

302 Found

요청한 리소스가 "Location" 헤더에 지정된 URL로 일시적으로 이동되었음을 의미합니다. 브라우저는 이 페이지로 리디렉션되지만 검색 엔진은 리소스에 대한 링크를 업데이트하지 않습니다. 301 Moved Permanently와 마찬가지로 GET 또는 HEAD 메서드가 아닌 경우 307 Temporary Redirect를 사용하여야 합니다.

303 See Other

리소스가 다른 위치로 이동되었으므로 해당 새 위치로 GET 요청을 보내야 함을 의미합니다. 앞서 언급한 203 Non-Authoritative Information은 응답으로 보내준 리소스가 요청한 곳과 다른 주소에서 검색되었다는 것을 알려줍니다.

304 Not Modified

마지막 요청이후 요청한 리소스가 변환되지 않아 응답으로 보내 줄 본문이 이전과 똑같다는 것을 의미합니다. 주로 캐시를 목적으로 사용됩니다. 클라이언트가 해당 응답을 받으면 캐싱되어 있는 리소스를 사용하여도 된다는 것을 의미합니다. 해당 상태 코드는 200 OK와 더불어 흔하게 볼 수 있는 코드입니다.

307 Temporary Redirect

클라이언트가 요청한 리소스가 다른 URI에 있으며, 동일한 메소드를 사용하여 다른 URI에 요청해야할 때, 서버가 클라이언트에 해당 응답을 보냅니다. 307 Temporary Redirect는 302 Found HTTP 응답 코드와 동일한 의미를 가지고 있으나 307 Temporary Redirect에서는 요청의 메서드를 변경하지 못하도록 합니다.

처음에 302 Found가 도입되었을 때 리다이렉션 중에 원래 요청의 HTTP 메서드와 본문을 보존해야 하는지 여부에 대해 약간의 모호함이 있었습니다. HTTP 사양에서는 메서드를 변경하지 말라고 제안했지만 일부 사용자 에이전트와 서버에서 메서드 변경을 허용하는 방식(종종 GET)으로 처리했습니다. 그래서 HTTP 요청의 메서드와 본문을 변경하지 않고 리다이렉트를 요청하도록 보장하는 307 Temporary Redirect가 만들어졌습니다. 307 Temporary Redirect를 통해 GET이 아닌 다른 메서드에 대하여 웹에서의 동작을 예상할 수 있게 되었습니다. 아래에 설명될 308 Permanent Redirect도 마찬가지 이유로 탄생하였습니다.

308 Permanent Redirect

요청된 리소스가 "Location" 헤더에 지정된 URL로 완전히 이동되었음을 의미합니다. 301 Moved Permanently와 동일한 의미를 가지고 있으나 308 Permanent Redirect에서는 요청의 메서드를 변경하지 못하도록 합니다.

클라이언트 에러 응답 또는 요청 오류(4XX)

클라이언트 오류 또는 클라이언트의 요청에 오류가 있음을 의미합니다.

400 Bad Request

서버가 클라이언트 요청이 잘못되었기 때문에 요청을 처리할 수 없거나, 하지 않는다는 상태입니다. 따라서 클라이언트는 요청을 수정하여 다시 보내야 합니다.

401 Unauthorized

요청된 리소스에 대한 유효한 인증 자격 증명이 없기 때문에 클라이언트 요청이 완료되지 않았음을 나타냅니다. 상태 코드 이름이 권한 없음(Unauthorized)으로 되어 있지만 실제 뜻은 인증 안됨(Unauthenticated)에 더 가깝습니다. 예를 들어 로그인이 필요한 페이지에 로그인 없이 접근하는 경우 해당 상태 코드를 받을 수 있습니다.

403 Forbidden

서버에 요청이 전달되었지만, 권한 때문에 거절되었다는 것을 의미합니다. 사용자가 리소스에 대한 필요 권한을 갖고 있지 않을 때 서버가 해당 상태코드로 응답합니다. 사용자 인증이 되지 않았을 때 사용하는 401 Unauthorized와 달리 인증은 되었지만 권한은 없을 때 사용합니다. 예를 들어 로그인은 되어있지만 관리자 권한이 없어 관리자 페이지에 접근하려는 경우에 해당 응답을 사용할 수 있습니다. 물론 실제로는 로그인 여부와는 무관하게 권한이 없어 접근을 막을 필요가 있는 경우라면 사용할 수 있습니다.

404 Not Found

서버가 요청받은 리소스를 찾을 수 없다는 것을 의미합니다. 개발자가 아니더라도 인터넷 상에서 아주 쉽게 볼 수 있는 응답입니다. 404 페이지를 띄우는 링크는 대체로 브로큰 링크(broken link) 또는 데드 링크(dead link)라고 부릅니다. 만약 해당 주소의 리소스가 영구적으로 사라졌다면 404 Not Found가 아닌 410 Gone 상태코드를 사용하여야 합니다.

405 Method Not Allowed

요청에 지정된 메서드를 사용할 수 없다는 의미입니다. 예를 들어 POST 방식으로 요청을 받는 서버에 GET 요청을 보내는 경우나 읽기 전용 콘텐츠에 PUT 요청을 보내는 경우 해당 상태 코드를 사용할 수 있습니다.

410 Gone

원본 서버에서 대상 리소스에 대해 더 이상 접근할 수 없으며, 이 상태가 영구적일 가능성이 있음을 의미합니다. 만약 이 상태가 일시적인지 영구적인지 알 수 없는 경우라면 404 Not Found를 사용하여야 합니다. "일시적인 홍보용 서비스"에서 사용되는 것이 권장됩니다. 이 상태 코드 또한 캐시가능합니다.

411 Length Required

서버가 유효한 "Content-Length" 헤더 없이 요청을 수락하지 않음을 나타냅니다.

412 Precondition Failed

사용자가 서버로 조건부 요청(Conditional Requests)을 보낼 때 서버의 전제조건와 사용자의 전제조건이 맞지 않아 서버에서 응답 거부를 할때 쓰는 상태 코드입니다.

413 Content Too Large

요청 엔터티가 서버에 의해 정의된 제한보다 크다는 것을 의미합니다. RFC 9110 이전에는 이 상태 코드 이름이 Payload Too Large였습니다.

414 URI Too Long

클라이언트가 요청한 URI가 서버가 해석가능한 URI보다 더 길다는 것을 의미합니다. 클라이언트가 POST 요청을 부적절하게 긴 쿼리 정보를 가진 GET 요청으로 변환한 경우에 발생합니다.

415 Unsupported Media Type

클라이언트가 요청한 미디어타입이 서버에서 지원하지 않는 타입이라서 응답을 거부할 때 사용하는 코드입니다.

417 Expectation Failed

서버가 "Expect" 요청 헤더 필드에 지정된 요구 사항을 충족할 수 없을 때 사용하는 코드입니다.

429 Too Many Requests

사용자가 주어진 시간 동안 너무 많은 요청을 보냈음을 의미합니다. 얼마나 기다려야 새로운 요청을 할 수있는지를 알려주는 "Retry-After" 헤더가 이 응답에 포함될 수 있습니다.

431 Request Header Fields Too Large

HTTP 헤더의 크기가 너무 크기 때문에 처리가 불가능함을 의미합니다. 보통 크기가 큰 쿠키와 캐시가 너무 쌓여져 있는 상태에서 서버에 요청할 때 뜨는 오류입니다. 캐시 및 쿠키를 정리하면 대부분 정상적으로 서버에서 응답합니다.

서버 에러 응답 또는 서버 오류(5XX)

서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다.

500 Internal Server Error

요청을 처리하는 과정에서 서버가 예상하지 못한 오류가 발생하였다는 것을 알려줍니다.보통 서버가 응답할 500번대 에러 코드가 없다는 것을 의미합니다.

502 Bad Gateway

게이트웨이 또는 프록시 역할을 하는 서버가 클라이언트의 요청을 이행하려고 시도하는 동안 업스트림 서버로부터 잘못된 응답을 받았음을 나타냅니다. 쉽게 말하면, 서버 간의 통신에 문제가 있고, 일반적으로 다른 서버 앞에 있는 게이트웨이나 프록시 역할을 하는 서버가 해당 서버 중 하나로부터 예상치 못한 또는 잘못된 응답을 받았음을 의미합니다. 서버 과부하, 서버 구성 오류 또는 일시적인 사용 불가 등 다양한 이유 때문에 발생합니다.

503 Service Unavailable

서버가 요청을 처리할 준비가 되지 않은 것을 의미합니다. 일반적으로 서버가 점검을 위해 다운되거나 과부하 때문에 발생합니다. 이 응답은 일시적인 상황을 위해 사용되어야 하며, 가능하다면 서비스 복구를 위한 예상 시간을 "Retry-After"에 담아 HTTP 헤더로 보내주어야 합니다.

504 Gateway Timeout

서버가 게이트웨이 혹은 프록시의 역할을 하는 동안 지정된 시간 안에 업스트림 서버(upstream server)로부터 요청을 마치기 위해 필요한 응답를 받지 못했음을 나타냅니다.

참고 자료

MDN, HTTP 상태 코드
위키백과, HTTP 상태 코드

+ Recent posts