HTTP 상태 코드

HTTP 404 generated by Apache on Debian displayed in Mozilla Firefox 39 with GNOME.png

개요[편집 / 원본 편집]

클라이언트와 서버 간 요청과 응답을 주고 받을 때 서버는 응답 결과가 어떤지 클라이언트에 알려줘야 합니다. 이 응답 결과를 3자리의 숫자로 결과를 나타낸 것이 HTTP 상태 코드입니다.

상태코드 앞자리 별 구분[편집 / 원본 편집]

상태 코드의 첫번째 자리는 1부터 5까지 있으며[1], 첫번째 자리별로 서버 또는 클라이언트 관련 코드입니다. 예시로 5xx는 서버 관련 상태 코드입니다.

1 : 정보 응답[편집 / 원본 편집]

클라이언트의 요청을 받았고, 프로세스를 계속 진행한다는 것을 의미합니다.

100 Continue[편집 / 원본 편집]

임시적인 응답으로 현재까지 문제없고 클라이언트가 계속해서 요청을 하거나 이미 요청을 완료한 경우에는 무시해도 됨을 뜻합니다.

101 Switching Protocol[편집 / 원본 편집]

클라이언트가 보낸 Upgrade 요청 헤더에 대한 응답에 사용되며 서버에서 프로토콜을 변경할 것을 뜻합니다.

102 Processing[편집 / 원본 편집]

서버가 요청을 수신하여 처리하고 있지만 아직 응답을 할 수 없는 상황을 뜻합니다.

103 Early Hints[편집 / 원본 편집]

이 상태 코드는 주로 Link 헤더와 함께 사용되어 서버가 응답을 준비하는 동안 사용자 에이전트가 사전 로딩을 시작할 수 있도록 합니다.

103 Early Hints 을 사용하면 원래의 응답을 보내기 전에 미리 클라이언트에게 이를 알릴 수 있습니다.

2 : 성공[편집 / 원본 편집]

클라이언트의 요청을 성공적으로 받았다는 것을 의미합니다.

200 OK[편집 / 원본 편집]

성공의 의미는 HTTP 메서드에 따라 다릅니다.

  • GET : 리소스를 불러와서 메세지 바디에 전송되었습니다.
  • HEAD : 개체 해더가 메세지 바디에 있습니다.
  • PUT | POST : 수행 결과에 대한 리소스가 메세지 바디에 전송되었습니다.
  • TRACE : 메세지 바디는 서버에서 수신한 요청 메세지를 포함하고 있습니다.

일반적으로 캐시 가능합니다.

201 Created[편집 / 원본 편집]

요청이 성공적이었으며 그 결과로 새로운 리소스를 생성하였습니다.

일반적으로 POST 요청 또는 일부 PUT 요청 이후에 따라옵니다. 일반적으로는 POST를 통해 새로운 리소스를 만들지만 PUT 요청을 통해서도 가능합니다.

둘의 결정적인 차이는 POST는 식별자를 보내지 않고 PUT은 식별자를 보냅니다.

그리고 명등성에서 차이가 있는데 POST는 여러 번 요청 시, 요청의 횟수만큼 리소스를 생성하고 PUT은 같은 리소스를 수정하기만 합니다.

202 Accepted[편집 / 원본 편집]

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

203 Non-Authoritative Information[편집 / 원본 편집]

클라이언트와 서버 사이에 프록시에서 사용할 수 있는 상태코드입니다. 프록시가 형식을 변환하거나 HTML 본문에 무언가를 추가할 경우, 프록시는 상태코드를 203 Non-Authoritative Information 로 변경하여 클라이언트에게 변경되었음을 알립니다.

하지만 이 경우, 기존의 상태 코드를 확인할 수 없는 문제가 발생하기 때문에 RFC에서는 Warning 헤더 사용할 것을 권유합니다.

일반적으로 캐시 가능합니다.

204 No Content[편집 / 원본 편집]

요청이 성공적이었으며 이를 수행했지만 응답 본문에 보낼 컨텐츠가 없습니다. 하지만 헤더는 의미있을 수 있습니다. 사용자-에이전트는 리소스가 캐시된 헤더를 새로운 것으로 업데이트 할 수 있습니다.

일반적으로 캐시 가능합니다.

205 Reset Content[편집 / 원본 편집]

요청을 완수한 이후에 사용자 에이전트에게 이 요청을 보낸 문서 뷰를 리셋하라고 알려줍니다.

예를 들어 사용자가 특정 Form을 작성하여 이를 서버에 제출할 경우, 해당 페이지를 새로고침하지 않고 해당 Form만 초기화 해야하는 경우가 있습니다. 이 때 Form의 정보들이 유효한 경우, 205 Reset Content 를 응답하여 사용자가 새로고침은 하지 않고 Form만 초기화 할 수 있도록 합니다.

206 Partial Content[편집 / 원본 편집]

클라이언트에서 복수의 스트림을 분할 다운로드를 하고자 범위 헤더를 전송했기 때문에 사용됩니다.

클라이언트가 범위 요청을 발행하고 서버가 이를 처리할 수 있는 경우, 206 Partial Content 와 Content-Range 헤더와 함께 특정 범위만 다시 전송하고 있음을 클라이언트에게 전달할 수 있습니다.

예를 들어 클라이언트가 test.mp4에 대해 bytes의 범위를 요구하면

GET /test.mp4 HTTP/1.1
Range: bytes=1048576-2097152

서버는 이에 대해 특정 범위에 대해서 응답합니다.

HTTP/1.1 206 Partial Content
Content-Range: bytes 1048576-2097152/3145728
Content-Type: video/mp4

207 Multi-Status (WebDAV)[편집 / 원본 편집]

여러 리소스가 여러 상태 코드인 상황이 적절한 경우에 해당되는 정보를 전달합니다.

208 Multi-Status (WebDAV)[편집 / 원본 편집]

DAV에서 사용됩니다: propstat(property와 status의 합성어) 응답 속성으로 동일 컬렉션으로 바인드된 복수의 내부 멤버를 반복적으로 열거하는 것을 피하기 위해 사용됩니다.

226 IM Used (HTTP Delta encoding)[편집 / 원본 편집]

서버가 GET 요청에 대한 리소스의 의무를 다 했고, 그리고 응답이 하나 또는 그 이상의 인스턴스 조작이 현재 인스턴스에 적용이 되었음을 알려줍니다. 여기서 IM은 Instance Manipulation을 의미합니다.

브라우저와 같은 클라이언트는 특정 리소스들에 대해서 캐시하게 됩니다. 이 때 리소스가 서버 측에서 변경되면 서버는 전체 리소스를 클라이언트에게 보내줘야하는데 약간의 리소스 변경에 대해 전체를 다시 보내는 것은 낭비입니다.

226 IM Used를 사용하면 서버가 변경 사항만 다시 보낼 수 있습니다.

3 : 리디렉션[편집 / 원본 편집]

요청을 완료하기 위해 추가 작업이 필요하다는 것을 의미합니다.

300 Multiple Choice[편집 / 원본 편집]

요청에 대해서 하나 이상의 응답이 가능합니다. 사용자 에이전트 또는 사용자는 그중에 하나를 반드시 선택해야 합니다. 응답 중 하나를 선택하는 방법에 대한 표준화 된 방법은 존재하지 않습니다.

301 Moved Permanently[편집 / 원본 편집]

요청한 리소스의 URI가 변경되었음을 의미합니다. 새로운 URI가 Location응답 헤더에 주어집니다. 브라우저는 이 페이지로 리디렉션하고 검색엔진은 해당 리소스로 연결되는 링크를 갱신합니다.

302 Found[편집 / 원본 편집]

요청한 리소스의 URI가 일시적으로 변경되었음을 의미합니다. 301이 Moved Permanently 였다면 302는 Moved Temporarily 입니다.

이는 검색엔진이 원래의 URI로 인지하게 하고 컨텐츠만 새로운 URI로 바꾸는데 사용됩니다.

자세한 내용은 HTTP 상태 코드/리디렉션 문서를 참고하세요!

303 See Other[편집 / 원본 편집]

클라이언트가 요청한 리소스를 다른 URI에서 GET 요청을 통해 얻어야 함을 의미합니다.

304 Not Modified[편집 / 원본 편집]

이것은 캐시를 목적으로 사용됩니다. 이것은 클라이언트에게 응답이 수정되지 않았음을 알려주며, 그러므로 클라이언트는 계속해서 응답의 캐시된 버전을 사용할 수 있습니다.

305 Use Proxy[편집 / 원본 편집]

서버는 클라이언트에게 요청한 응답은 반드시 프록시를 통해서 접속해야 함을 의미합니다.

현재는 보안 상의 문제로 사용하지 않습니다.

306 Switch Proxy[편집 / 원본 편집]

클라이언트가 이미 프록시를 사용한 경우 새 프록시를 통해서 접속해야 함을 의미합니다.

305 Use Proxy와 마찬가지로 현재는 사용하지 않습니다.

307 Temporary Redirect[편집 / 원본 편집]

클라리언트가 요청한 리소스가 다른 URI에 있으며, 이전 요청과 동일한 메소드를 사용하여 요청해야함을 의미합니다.

302 Found HTTP 응답 코드와 동일하지만 307 Temporary Redirect는 사용자가 반드시 사용된 HTTP 메소드를 변경하지 말아야 합니다. 만약 첫 요청에 POST가 사용되었다면, 두번째 요청도 반드시 POST를 사용해야 합니다.

308 Permanent Redirect[편집 / 원본 편집]

클라리언트가 요청한 리소스가 영구히 다른 URI에 있으며, 이전 요청과 동일한 메소드를 사용하여 요청해야함을 의미합니다.

301 Moved Permanently HTTP 응답 코드와 동일하지만 308 Permanent Redirect는 사용자가 반드시 HTTP 메소드를 변경하지 말아야 합니다. 만약 첫 요청에 POST가 사용되었다면, 두번째 요청도 반드시 POST를 사용해야 합니다.

4 : 클라이언트 오류[편집 / 원본 편집]

클라이언트의 요청의 문법이 잘못되었거나, 요청을 처리할 수 없다는 것을 의미합니다.

400 Bad Request[편집 / 원본 편집]

클라이언트 오류의 일반 오류코드로서 더 적합한 특정 코드가 없을 경우 사용하기에 적합합니다.

401 Unauthorized[편집 / 원본 편집]

401 Unauthorized 은 Unauthorized, 미승인이라는 이름으로 사용하고 있지만 의미상 unauthenticated, 비인증이 더 적합합니다.

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

402 Payment Required[편집 / 원본 편집]

디지털 결제 시스템에 사용하기 위하여 만들어졌지만 지금 사용되고 있지는 않습니다.

403 Forbidden[편집 / 원본 편집]

콘텐츠에 접근할 권한를 가지고 있지 않다는 의미입니다.

401 Unauthorized와의 차이는 HTTP 상태 코드/401과 403 차이 문서를 참고하세요!

404 Not Found[편집 / 원본 편집]

서버는 요청받은 리소스를 찾을 수 없습니다.

브라우저에서는 알려지지 않은 URL을 의미합니다. 이것은 API에서 종점은 적절하지만 리소스 자체는 존재하지 않음을 의미할 수도 있습니다.

서버들은 인증받지 않은 클라이언트로부터 리소스를 숨기기 위하여 이 응답을 403 대신에 전송할 수도 있습니다.

405 Method Not Allowed[편집 / 원본 편집]

요청한 메소드가 지원되지 않음을 의미합니다.

예를 들어 서버에서는 특정 URI에 대해서 GET 요청만을 지원하는데 클라이언트는 POST로 요청을 보낼 경우에 적합니다.

필수적인 메소드인 GETHEAD는 이 에러 코드를 리턴할 수 없습니다.

406 Not Acceptable[편집 / 원본 편집]

클라이언트가 서버가 지원하지 않는 리소스의 특정 표현을 요청할 때 서버가 이를 받아들이지 않음을 의미합니다.

HTTP에는 콘텐츠 협상이라는 개념이 존재합니다. 이는 클라이언트가 특정 버전의 리소스를 원할 때 서버와 협상을 하는 것입니다.

407 Proxy Authentication Required[편집 / 원본 편집]

401 Unauthorized 과 굉장히 유사하지만 인증을 받지 못한 곳이 Proxy입니다.

408 Request Timeout[편집 / 원본 편집]

클라이언트가 요청을 너무 느리게 보내 서버가 이를 종료시키고자 하는 의미입니다.

클라이언트는 인터넷 연결 불량 등 다양한 이유로 요청을 느리게 보낼 경우가 생기고 서버는 웹서핑 속도를 올리기 위해 오래된 요청에 대해 연결을 끊습니다.

409 Conflict[편집 / 원본 편집]

요청 자체는 유효하지만 서버의 현재 상태와 충돌이 있을 경우를 의미합니다.

충돌은 다양한 경우가 존재하겠지만 예를 들어 폴더에 파일을 추가하고자 할 경우, 폴더가 존재하지 않을 때 해당 코드가 적합합니다.

서버는 응답 본문에 클라이언트가 충돌을 해결하기 위해 어떤 조치를 취해야 하는지 포함할 것이 권장됩니다.

410 Gone[편집 / 원본 편집]

클라이언트가 요청한 리소스가 삭제되었고 다시 생기지 않을 경우에 적합합니다.

404 Not Found 도 리소스가 삭제되어 없는 경우지만 410 Gone 은 좀 더 구체적으로 리소스가 의도적으로 삭제된 경우입니다.

411 Length Required[편집 / 원본 편집]

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

412 Precondition Failed[편집 / 원본 편집]

클라이언트는 헤더에 있는 전제조건을 사용해 조건부 요청을 할 수 있으며 이 조건이 서버의 전제조건에 적절하지 않음을 의미합니다.

413 Payload Too Large[편집 / 원본 편집]

클라이언트의 요청 본문이 너무 커서 서버가 받아들일 수 없을 의미합니다. 클라이언트가 대용량 파일을 업로드할려고 시도할 때 서버가 이를 거부합니다.

만일 오류의 원인이 서버에서 미리 정한 임의의 크기를 넘어서가 아니라 서버에 디스크 공간이 부족한 것이라면 413 Payload Too Large 보다는 507 Insufficient Storage가 적합합니다.

414 URI Too Long[편집 / 원본 편집]

클라이언트가 요청한 URI는 서버에서 처리하지 않기로 한 길이보다 긴 것을 의미합니다.

HTTP 요청의 URI 또는 경로에는 허용되는 기간에 대한 엄격한 제한이 없지만 브라우저와 검색 엔진에는 제한이 있기 때문에 서버에서는 길이 제한을 하는 것이 좋습니다.

415 Unsupported Media Type[편집 / 원본 편집]

요청한 미디어 포맷은 서버에서 지원하지 않아 요청을 거부합니다.

POST /new-article HTTP/1.1
Content-Type: text/html
HTTP/1.1 415 Unsupported Media Type
Content-Type: application/json

{"error": "This endpoint only supports text/markdown for new articles"}

416 Requested Range Not Satisfiable[편집 / 원본 편집]

Range 헤더 필드에 요청한 지정 범위를 만족시킬 수 없음을 의미합니다. 클라이언트는 서버에게 Range 헤더 필드를 통해서 부분 응답을 요청할 수 있습니다.

예를 들어 동영상의 일부 구간이나 로그의 일부만을 원하는 경우가 있겠죠. 이 때 서버와 범위 요청을 지원하지 않으면 200 OK와 함께 전체 리소스를 반환하고, 범위 요청을 지원한다면 206 Partial Content와 함께 범위에 대한 응답을 합니다.

하지만 클라이언트의 범위가 잘못되었다면 416 Requested Range Not Satisfiable을 사용합니다.

417 Expectation Failed[편집 / 원본 편집]

이 응답 코드는 Expect 요청 헤더 필드로 요청한 예상이 서버에서는 적당하지 않음을 의미합니다.

클라이언트가 어떤 동작을 취하기 전에 100 Continue 를 기대하고 요청을 보낼 수 있습니다.

POST /foo/bar HTTP/1.1
Content-Type: application/gzip
Content-Length: 12345678765
Expect: 100-continue

하지만 서버가 이 기능을 지원하지 않는다면 417 Expectation Failed가 적합합니다.

HTTP/1.1 417 Expectation Failed
Content-Type: text/plain

We don't support 100-continue

418 I'm a teapot[편집 / 원본 편집]

서버는 커피를 찻 주전자에 끓이는 것을 거절한다는 뜻입니다.

너무 뜬금없지만 IETF는 매년 하나 이상의 만우절 RFC 문서를 게시하고 418 I'm a teapot는 그 중 하나입니다.

421 Misdirected Request[편집 / 원본 편집]

클라이언트에게 잘못된 서버에 연결되었음을 의미합니다.

http/1.1 이후 클라이언트는 Host 헤더를 포함해야 합니다.

GET /contact.html HTTP/1.1
Host: foo.example.org

서버의 도메인이 Host 헤더와 다르다면 클라이언트에게 잘못된 서버와 연결되어 있음을 알립니다.

HTTP/1.1 421 Misdirected Request
Content-Type: text/html

<h1>Switchboard operator error</h1>

422 Unprocessable Entity(WebDAV)[편집 / 원본 편집]

요청은 잘 만들어졌지만, 문법 오류로 인하여 따를 수 없는 경우에 적절합니다.

다음과 같은 클라이언트 요청이 들어왔을 경우를 고려해봅시다.

POST /new-article HTTP/1.1
Content-Type: application/json

{ "title": "Hello world!"}

application/json 을 지원하지 않는다면 415 Unsupported Media Type가 적합하고, JSON 자체가 깨진 경우에는 400 Bad Request가 적합합니다.

하지만 위 조건은 모두 충족하지만 json-schema에 의해서 유효성 검사를 통과하지 못한 경우에는 422 Unprocessable Entity가 적절합니다.

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/problem+json

{
  "type" : "https://example/errors/missing-property",
  "status": 422,
  "title": "Missing property: body"
}

423 Locked(WebDAV)[편집 / 원본 편집]

리소스는 접근하는 것이 잠겨있습니다.

클라이언트는 http LOCK 메서드 를 실행하여 리소스를 잠그고 나중에 UNLOCK 메서드를 사용하여 리소스를 잠금 해제 할 수 있습니다. LOCK이 걸린 리소스에 대해 수정을 하고자하면 오류가 발생하고 423 Locked가 적합합니다.

424 Failed Depeedency(WebDAV)[편집 / 원본 편집]

WebDAV는 PROPPATCH 메소드를 사용하여 단일 요청으로 많은 항목을 업데이트 할 수 있습니다.

이 때 항목들의 업데이트는 원자성을 가져야해서 하나라도 실패한다면 전부 실패로 돌아가고 그 때의 응답으로 424 Failed Depeedency 을 사용합니다.

426 Upgrade Required[편집 / 원본 편집]

지금의 프로토콜은 불가능하지만 프로토콜을 업그레이드를 하라는 의미입니다.

서버는 Upgrade 헤더와 필요로 하는 프로토콜을 알려주기 위해 426 Upgrade Required에 보냅니다.

HTTP/1.1 426 Upgrade Required
Upgrade: HTTP/3
Connection: Upgrade

To use this service, you must use HTTP version 3.

428 Precondition Required[편집 / 원본 편집]

여러 클라이언트가 같은 자원을 작성하고 서로의 변경 내용을 덮어쓰는 것을 방지하기 위해, 혹은 클라이언트와 서드파티간의 충돌을 막기 위해 서버에서 전제조건을 필요로 한다는 의미입니다.

다음과 같은 전제조건들이 있습니다. If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since

429 Too Many Requests[편집 / 원본 편집]

클라이언트가 제한된 요청의 양을 넘을 경우, 클라이언트에게 이 사실을 알립니다.

431 Request Header Fields Too Large[편집 / 원본 편집]

요청한 헤더 필드가 너무 크기 때문에 서버는 요청을 처리하지 않을 것을 의미합니다.

요청은 크기를 줄인 다음에 다시 전송해야하며 보통 쿠키에 원인이 있습니다.

451 Unavailable For Legal Reasons[편집 / 원본 편집]

서버가 법적인 이유로 컨텐츠 제공을 거부하는 것을 의미합니다.

5 : 서버 오류[편집 / 원본 편집]

서버가 유효한 요청에 대해 충족을 실패했다는 것을 의미합니다.

500 Internal Server Error[편집 / 원본 편집]

일반적인 서버 오류이며 더 적합한 오류가 없는 경우 선택하기에 적합한 오류입니다.

501 Not Implemented[편집 / 원본 편집]

서버가 특정 HTTP 메서드를 지원하는 않는 것을 의미합니다.

405 Method Not Allowed과 유사하지만 결정적인 차이는 405는 클라이언트 오류로 없어야하는 메서드를 호출한 것이지만 501 Not Implemented은 있어야하는 메서드를 서버가 구현하지 않았음을 의미합니다.

502 Bad Gateway[편집 / 원본 편집]

서버와 클라이언트 사이에 프록시가 존재하고 프록시는 정상적으로 동작하고 있으나 원래의 서버에 문제가 있을 때 사용합니다.

503 Service Unavailable[편집 / 원본 편집]

서버가 과부하 상태이거나 요청을 처리 할 수 없음을 의미합니다.

유지보수 혹은 서버 점검을 위해서 서버를 잠시 막을 때도 사용하게 됩니다.

Retry-After헤더를 함께 사용하여 서비스 복구 예상 시간을 포함하는 것이 권고됩니다.

504 Gateway Timeout[편집 / 원본 편집]

서버와 클라이언트 사이에 프록시가 존재하고 프록시가 서버에서 응답을 받지 못하는 경우 사용합니다.

502 Bad Gateway와 유사하지만 502는 잘못된 응답을 받았을 때 적합하고 504 Gateway Timeout은 응답을 받지못했을 때 적합합니다.

505 HTTP Version Not Supported[편집 / 원본 편집]

요청에 사용된 HTTP 버전은 서버에서 지원되지 않음을 의미합니다.

507 Insufficient Storage(WebDAV)[편집 / 원본 편집]

서버에 디스크 공간이 부족한 것을 의미합니다.

508 Loop Detected(WebDAV)[편집 / 원본 편집]

서버가 요청을 처리하는 동안 무한 루프에 빠짐을 의미합니다.

510 Not Extended[편집 / 원본 편집]

요청에 대한 추가 확장이 필요합니다.

이는 클라이언트 에러에 더 적합하지만 500대 에러로 분류되어 있기 때문에 부적합하다고 판단되어 사용되지 않습니다.

511 Network Authentication Required[편집 / 원본 편집]

클라이언트가 네트워크 액세스를 얻기 위해 인증을 받아야 할 필요가 있음을 나타냅니다.

출처[편집 / 원본 편집]

수학과의 좌충우돌 프로그래밍(CC-BY로 가져옴)

각주[편집 / 원본 편집]

  1. 1xx~5xx
• 현재 페이지 URL 줄이기