HTTP 응답 코드는 5개의 클래스로 구분된다. 상태 코드의 첫 번째 숫자는 응답의 클래스를 정의한다. 마지막 두 자리는 클래스나 분류 역할을 하지 않는다. 첫자리에 대한 5가지 값들은 다음과 같다.
- 1xx(정보): 요청을 받았으며 프로세스를 계속한다.
- 2xx(성공): 요청을 성공적으로 받았으며 인식했고 수용하였다.
- 3xx(리다이렉션): 요청을 완료를 위해 추가 작업 조치가 필요하다.
- 4xx(클라이언트 오류): 요청의 문법이 잘못되었거나 요청을 처리할 수 없다.
- 5xx(서버 오류): 서버가 명백히 유효한 요청에 대해 충족을 실패했다.
요청을 받았으며 작업을 계속한다.
HTTP/1.0 클라이언트로 보내면 안된다.
- 100 Continue(계속)
- 요청의 시작 부분이 받아들여졌으며, 클라이언트는 계속 이어서 보내야 한다. 이미 요청을 완료한 경우에는 무시해도 된다.
- 101 Switching Protocol(프로토콜 전환)
- 요청 헤더의 Update 필드 중 하나로 서버가 프로토콜을 변경한다.
- 102 Processing(처리)
- 서버가 요청을 수신하고 이를 처리하고 있으나 제대로 된 응답을 알려줄 수 없다.
이 클래스의 상태 코드는 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며, 성공적으로 처리했음을 가리킨다.
- 200 OK(성공)
- 서버가 요청을 성공적으로 처리했다.
- 201 Created(작성됨)
- 성공적으로 생성에 대한 요청을 받았으며 서버가 새 리소스를 작성한다.(대개 POST, PUT일 때)
- 202 Accepted(허용됨)
- 서버가 요청을 접수했지만 아직 처리하지 않았다.(요청을 적절했음)
- 203 NON-Authoritative Information(신뢰할 수 없는 정보)
- 서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공한다. 검증이 되지 않은 상태.
- 204 No Content(콘텐츠 없음)
- 서버가 요청을 성공적으로 처리했지만 제공할 컨텐츠는 없다.
- 205 Reset Content(콘텐츠 재설정)
- 서버가 요청을 성공적으로 처리했지만 새로운 내용을 확인해야 함을 알려준다(새로고침 등을 이용).
- 204 응답과 달리 이 응답은 요청자가 문서 보기를 재설정할 것을 요구한다.(예: 새 입력을 위한 양식 비우기)
- 206 Partial Content(일부 콘텐츠)
- 서버가 GET 요청의 일부만 성공적으로 처리했다.
- content-Range와 Date 헤더를 반드시 포함
- 207 Multi Status(다중 상태)
- 여러 개의 리소스가 여러 status code를 갖고 있는 상황에서 적절한 정보 전달
- 208 Already Reported(이미 보고됨)
- DAV에서 사용
이 요청을 완료하기 위해서는 리다이렉션이 이루어져야 한다는 의미이다. 짧은 주소(단축 URL) 서비스의 경우 접속시 301이나 302 코드를 보내고, 헤더의 location에 리다이렉션할 실제 URL을 적어 보낸다.
- 300 Multiple Choice(복수 응답)
- 클라이언트가 동시에 여러 응답이 가능한 요청을 보냈을 경우 클라이언트의 선택지를 반환
- 301 Moved Permanently(영구 이동)
- 요청한 리소스의 URI가 변경됨 -> 변경된 URI에 대한 정보와 함께 응답
- 302 Found
- 요청한 리소스의 URI가 일시적으로 변경된 것이므로 원래 요청했던 URI로 요청해야 함
- 303 See Other
- 서버가 사용자의 GET 요청을 처리하여 다른 URI에서 요청된 정보를 가져올 수 있도록 응답하는 코드
- 304 Not Modified
- 200 다음으로 많이 볼 수 있는 HTTP 상태로, 이 경우 보통 이전과 달라진 게 없어서 브라우저에 캐시되어 있는 버전을 쓴다.
- 305 Use Proxy(프록시 사용)
- 프록시를 사용하지 않으면 접근할 수 없는 컨텐츠에 사용할 목적으로 만들어졌다.
- 다만 보안상 이유로 이 응답코드를 인식하는 브라우저는 없고 현재 사용 중이된 비권장 응답코드이다.
- 306 Unused
- 지금은 305 Use Proxy 응답이 사용 중지되어 문서에서 삭제, 예약코드로 있다.
이름조차 미사용이다.- 307 Temporary Redirect
- 302와 동일하게 일시적인 컨텐츠 이동을 나타낼 때 사용되나, HTTP 메소드의 변경을 허용하지 않는다.
- 308 Permanent Redirect
- 301와 동일하게 영구적인 컨텐츠 이동을 나타낼 때 사용되나, HTTP 메소드의 변경을 허용하지 않는다.
클라이언트의 잘못된 요청
- 400 Bad Request(잘못된 요청)
- 잘못된 문법으로 요청을 보내고 있어 서버가 이해할 수 없음
- 401 Unauthorized(권한 없음)
- 인증이 필요한 리소스에 인증 없이 접근할 경우 발생한다. 이 응답 코드를 사용할 때에는 반드시 브라우저에 어느 인증 방식을 사용할 것인지 보내야 한다.
- 단순히 권한이 없는 경우 이 응답 코드 대신 아래 403 Forbidden을 사용해야 한다.
- 402 Payment Required(결제 필요)
- 결제 시스템을 위해 만들어졌으나 현재는 사용하지 않음.
- 403 Forbidden(거부됨)
- 서버가 요청을 거부할 때 발생한다.
- 관리자가 해당 사용자를 차단했거나, 서버에 index.html이 없는 경우에도 발생할 수 있다.
- 권한이 없을 때(로그인 여부와는 무관)에도 발생한다(신원 인증은 되었지만 권한은 없음).
- 404 Not Found(찾을 수 없음)
- 찾는 리소스가 없다는 뜻으로, 가장 흔하게 볼 수 있는 오류 코드.
- 405 Method Not Allowed(허용되지 않은 방법)
- PUT이나 DELETE 등 서버에서 허용되지 않은 메소드로 요청시 사용하는 코드.
- 406 Not Acceptable(받아들일 수 없음)
- 요청은 정상이나 서버에서 받아들일 수 없는 요청일시 사용하는 코드로, 보통 웹 방화벽에 걸리는 경우 이 코드가 반환됨.
- 407 Proxy Authentication Required(프록시 인증 필요)
- 401과 동일하나 proxy를 통해 인증해야 함.
- 408 Request Timeout(요청 시간 초과)
- 요청 중 시간이 초과되었을 때 사용함.
- 409 Conflict(충돌)
- 사용자의 요청이 서버의 상태와 충돌하여 응답함.
- PUT 요청에 대한 응답으로 발생할 가능성이 큼.
- 410 Gone(사라짐)
- 404와는 달리 찾는 리소스가 영원히 사라진 경우 사용함.
- 411 Length Required(길이 필요)
- 서버 요청시 Content-Length 값을 지정하지 않아 서버에서 응답을 거부할 때 쓰는 코드
- 412 Precondition Failed(전제조건 실패)
- 사용자가 서버로 조건부 요청(Conditional Requests)을 보낼 때 서버 요청 헤더의 전제조건과 사용자 요청 헤더의 전제조건이 맞지 않아 서버에서 응답 거부할 때 사용하는 코드.
- 413 Payload Too Large(요청이 너무 긺)
- 요청 본문이 너무 긴 경우 발생한다. 서버 소프트웨어로 Nginx를 사용하는 경우 기본 설정 그대로 사용하면 큰 첨부파일을 올릴 때 이 오류 코드가 발생하게 됨.
- 414 URI Too Long(URI가 너무 긺)
- URI가 너무 길 때 발생한다. 흔히 볼 수 있는 사례는 URL이 너무 긴 경우이다.
- 415 Unsupported Media Type(지원하지 않는 미디어 타입)
- 사용자가 요청한 미디어타입이 서버에서 지원하지 않는 타입이라서 응답을 거부할 때 쓰는 코드
- 416 Requested Range Not Fatisfiable(요청범위 부적합)
- 요청 헤더의 Range로 지정한 범위가 잘못되었을 때 발생.
- 417 Expectation Failed(예측 실패)
- 요청 헤더의 Expect값이 서버에서는 적절하지 못하다는 것을 응답할 때 쓰는 코드.
- 418 I'm a teapot(찻주전자로 커피를 만들 수 없음.)
- 하이퍼텍스트 커피 포트 제어 프로토콜에서 사용되는 코드.
- 421 Misdirected Request(잘못된 요청)
- 서버로 유도된 요청된 응답을 서버에서 생성할 수 없을 때 응답하는 코드로 주로 TLS 인증서가 여러 개 설치된 상태에서 꼬였을 경우 뜨는 오류.
- 422 Unprocessable Entity(처리할 수 없는 개체)
- 요청을 잘 받았으나 문법 오류로 인하여 무언가 응답할 수 없을 때 사용되는 코드.
- 423 Locked(잠김)
- 요청한 리소스가 잠겨있을 때 뜨는 코드. WebDAV 전용.
- 424 Failed Dependency(실패한 종속성)
- 이전의 요청이 실패한 상태에서 지금의 요청도 실패한 경우 뜨는 코드. 간단히 말해 요청 연속 실패. WebDAV 전용.
- 425 Too Early(너무 일찍 요청)
- 서버가 재생될 수 있는 요청을 처리하는 데 위험을 감수하지 않는다는 걸 알릴 때 사용되는 코드. 클라이언트가 파이어폭스 58 이후 버전이 아닌 이상 제대로 해석하지는 않는다.
정상적인 클라이언트의 요청에 대해 서버의 문제로 인해 응답할 수 없음
- 500 Internal Server Error(내부 서버 오류)
- 서버에 오류가 발생해 작업을 수행할 수 없을 때 사용된다.
- 보통 설정이나 퍼미션 문제, 아니면 HTTP 요청을 통해 호출한 문서가 실제 HTML 문서가 아니라 JSP, PHP, 서블릿 등의 프로그램일 경우 그 프로그램이 동작하다 세미콜론을 빼먹는 등의 각종 에러로 비정상 종료를 하는 경우 이 응답코드를 보냄.
- 501 Not Implemented(요청한 기능 미지원)
- 서버가 요청을 수행하는데 필요한 기능을 지원하지 않는 경우 사용됨. 웬만해서는 볼 수 없음.
- 502 Bad Gateway(게이트웨이 불량)
- 게이트웨이가 연결된 서버로부터 잘못된 응답을 받았을 때 사용.
- 503 Service Temporarily Unavailable(일시적으로 서비스를 이용할 수 없음)
- 서비스를 일시적으로 사용할 수 없을 때 사용됨. 주로 웹서버 등이 과부하로 다운되었을 때 볼 수 있다.
- 504 Gateway Timeout(게이트웨이 시간초과)
- 게이트웨이가 연결된 서버로부터 응답을 받을 수 없었을 때 사용된다.
- 505 HTTP Version Not Supported(지원되지 않는 HTTP 버전)
- HTTP 버전을 서버가 처리할 수 없다. 브라우저는 서버가 처리 가능한 HTTP 버전을 자동으로 선택하므로, 웬만해서는 볼 수 없는 오류이다.
- 506 Variant Also Negotiates
- 서버 내부 구성(값)에 오류가 있어 반환되는 값에 컨텐츠 협상이 순환 참조로 이루어져 있다는 걸 알려주는 코드
- 507 Insufficient Storage
- 서버 내부 구성(값)에 오류가 있어 선택된 가변 리소스는 투명한 콘텐츠 협상에 참여하도록 구성되므로, 협상 과정에서 적절한 끝점이 아님을 알려주는 코드. WebDAV 전용
- 508 Loop Detected(무한 루프 발견)
- 서버가 요청을 처리하는 동안 무한 루프를 발견하였을 때 뜨는 응답코드. WebDAV 전용
- 510 Not Extended(확장되지 않았음)
- 서버가 요청을 처리할 때 요청에 대한 추가 확장이 필요한 경우 뜨는 응답 코드.
- 511 Network Authentication Required(네트워크 인증 필요)
- 사용자가 네트워크 엑세스 권한이 필요한 경우 뜨는 응답코드로, 보통 네트워크에 엑세스 할 때 로그인이 필요한 경우 주로 뜬다.