Post

HTTP 응답 코드

1. 1xx (정보 전달)

요청을 받았고, 작업을 진행 중이라는 의미이다. HTTP/1.0 이후 한동안 쓰이지 않아 서버도 클라이언트에 이 코드를 보내지 않았지만, 최근 101의 경우 WebSocket 등에서, 103의 경우 페이지 로드 속도를 빠르게 하기 위해서 다시 쓰이기 시작했다.

  • 100 Continue
  • 101 Switching Protocols
  • 102 Processing
    • 사용자가 수신요청을 하여 처리하고는 있지만 아직은 제대로 된 응답을 할수 없는 상태임을 응답하는 코드이다. WebDAV 전용
  • 103 Early Hints
    • Link해더와 함께 사용되며 주로 서버가 응답을 준비하는 동안 사용자가 사전로딩(PreLoading)을 할수 있도록 하는 응답코드

2. 2xx (성공)

이 작업을 성공적으로 받았고, 이해했으며, 받아들여졌다는 의미이다. 200, 204, 206을 제외하고는 볼 일이 거의 없는 코드들이다.

  • 200 OK
    • 성공적으로 처리했을 때 쓰인다. 가장 일반적으로 볼 수 있는 HTTP 상태
  • 201 Created
    • 요청이 성공적으로 처리되어서 리소스가 만들어졌음을 의미한다.
  • 202 Accepted
    • 요청이 받아들여졌지만 처리되지 않았음을 의미한다.
  • 203 Non-Authoritative Information
    • 응답받은 메타정보가 서버에 저장된 원본하고는 동일하지는 않지만 로컬이나 다른 복사본에서 수집되었음을 알리는 응답코드. 이 경우에도 보통은 200 OK 응답코드가 203 Non-Authoritative Information 응답코드보다 우선적으로 응답한다.
  • 204 No Content
    • 성공적으로 처리했지만 컨텐츠를 제공하지는 않는다. 그냥 주소창에 about:blank 치고 접속하면 된다.
  • 205 Reset Content
    • 서버가 요청을 성공적으로 처리했지만 콘텐츠를 표시하지 않는다. 204 응답과 달리 이 응답은 요청자가 문서 보기를 재설정할 것을 요구한다 (예: 새 입력을 위한 양식 비우기)
  • 206 Partial Content
    • 컨텐츠의 일부 부분만 제공한다. 보통 클라이언트에서 시작 범위나 다운로드할 범위를 지정한 경우 자동으로 해당 부분만 제공할 때 사용하는 코드이다.
  • 207 Multi-Status
    • 여러 소스에서 여러 응답인 상태에서 적절한 정보를 사용자한테 제공할수 있도록 하는 응답코드 WebDAV 전용
  • 208 Already Reported
    • DAV 바인딩 멤버는 이미 응답의 앞 부분에 열거되어 있으며 다시 포함되지 않는다는 의미로 응답하는 응답코드. WebDAV 전용
  • 226 IM Used
    • 서버가 사용자의 GET 요청에 대한 리소소의 의무는 다했고, 현재 인스턴스에서 적용된 하나 이상의 인스턴스 조작 결과를 보낼 때 사용되는 코드이다. HTTP Delta Encoding 전용

3. 3xx (리다이렉션)

이 요청을 완료하기 위해서는 리다이렉션이 이루어져야 한다는 의미이다. 짧은 주소(단축 URL) 서비스의 경우 접속 시 301이나 302 코드를 보내고, 헤더의 location에 리다이렉션할 실제 URL을 적어 보낸다.

  • 300 Multiple Choices(복수 응답)
    • 서버에서 여러 개의 응답이 있음을 알릴 때 사용할 의도로 만들어졌으나, 정작 응답을 선택하는 방법은 표준화되지 않아 사용되지 않는다.
  • 301 Moved Permanently(영구 이동)
    • 영구적으로 컨텐츠가 이동했을 때 사용된다.
  • 302 Found
    • 일시적으로 컨텐츠가 이동했을때 사용된다.
  • 303 See Other
    • 서버가 사용자의 GET요청을 처리하여 다른URL에서 요청된 정보를 가져올수 있도로 응답하는 코드
  • 304 Not Modified
    • 200 다음으로 많이 볼 수 있는 HTTP 상태이다. 이 경우 보통 브라우저에 캐시되어 있는 버전을 쓴다.
  • 305 Use Proxy(프록시 사용)
    • 프록시를 사용하지 않으면 접근할수 없는 컨텐츠에 사용할 목적으로 만들어졌다. 이 응답 코드에는 요청자가 사용해야 하는 프록시 서버의 정보를 포함할수 있다. 다만 보안상 이유로 이 응답코드를 인식하는 브라우저는 없고 현재 사용 중지(Deprecated)된 비권장 응답코드이다.
  • 306 (unused)
    • 초기 HTTP/1.1까지만 해도 Switch Proxy 요청으로 다음 요청시 지정한 프록시 서버를 사용하라는 응답 코드로 초안이 각성되었으나 정작 사용이 되지 않았고 지금은 305 Use Proxy 응답이 사용 중지(Deprecated)되어 문서에서 삭제, 예약코드로 있다.
  • 307 Temporary Redirect
    • 302와 동일하게 일시적인 컨텐츠 이동을 나타낼때 사용되나, HTTP 메소드의 변경을 허용하지 않는다.
  • 308 Permanent Redirect
    • 301와 동일하게 영구적인 컨텐츠 이동을 나타낼때 사용되나, HTTP 메소드의 변경을 허용하지 않는다.

4. 4xx (클라이언트 오류)

이 요청은 올바르지 않다는 의미이다. 여기서부터 브라우저에 직접 표출된다. 굵게 강조된 것은 자주 보이는 오류들이다.

  • 400 Bad Request(잘못된 요청)
    • 요청 자체가 잘못되었을때 사용하는 코드이다.
  • 401 Unauthorized(권한 없음)
    • 인증이 필요한 리소스에 인증 없이 접근할 경우 발생한다. 이 응답 코드를 사용할 때에는 반드시 브라우저에 어느 인증 방식[3]을 사용할 것인지 보내야 한다. 단순히 권한이 없는 경우 이 응답 코드 대신 아래 403 Forbidden을 사용해야 한다.
  • 402 Payment Required(결제 필요)
    • 결제가 필요한 리소스에 결제없이 접근했을 경우 발생. HTTP/1.1에서 정의되었으나 구현하지는 않고, 향후에 사용하기 위해 예약해둔 코드이다. 현재 딱히 표준조차도 존재하지 않는다.
  • 403 Forbidden(거부됨)
    • 서버가 요청을 거부할 때 발생한다. 관리자가 해당 사용자를 차단했거나 서버에 index.html 이 없는 경우에도 발생할 수 있다. 혹은 권한이 없을 때(로그인 여부와는 무관하다)에도 발생한다.
  • 404 Not Found(찾을 수 없음)
    • 찾는 리소스가 없다는 뜻으로, 가장 흔하게 볼 수 있는 오류 코드이다.
  • 405 Method Not Allowed(허용되지 않은 방법)
    • PUT이나 DELETE 등 서버에서 허용되지 않은 메소드로 요청시 사용하는 코드이다.
  • 406 Not Acceptable(받아들일 수 없음)
    • 요청은 정상이나 서버에서 받아들일 수 없는 요청일시 사용하는 코드이다. 보통 웹 방화벽에 걸리는 경우 이 코드가 반환된다.
  • 407 Proxy Authentication Required(프록시 인증 필요)
    • 프록시 인증이 필요할 경우 사용하는 코드이다.
  • 408 Request Timeout(요청 시간 초과)
    • 요청 중 시간이 초과되었을때 사용하는 코드이다.
  • 409 Conflict(충돌)
    • 사용자의 요청이 서버의 상태와 충돌하여 응답하는 코드이다.
  • 410 Gone(사라짐)
    • 404와는 달리 찾는 리소스가 영원히 사라진 경우 사용하는 코드이다.
  • 411 Length Required(길이 필요)
    • 사용자가 서버로 요청할때 해더에 Content-Length 필드에 값이 없이 요청해서 서버에서 응답을 거부할 때 쓰는 코드이다.
  • 412 Precondition Failed(전제조건 실패)
    • 사용자가 서버로 조건부 요청(Conditional Requests)을 할떄 서버의 전제조건와 사용자의 전제조건이 맞지 않아 서버에서 응답 거부를 할떄 쓰는 코드이다.
  • 413 Payload Too Large(요청된 것이 너무 긺)
    • 요청 본문이 너무 긴 경우 발생한다. 서버 소프트웨어로 NGINX를 사용하는 경우 기본 설정 그대로 사용하면 큰 첨부파일을 올릴 때 이 오류 코드가 발생하게 된다. 구글에서 너무 긴 내용을 찾아볼 때도 표시된다. 구현 페이지
  • 414 URI Too Long(요청된 URL이 너무 긺)
    • URL이 너무 길 때 발생한다.
  • 415 Unsupported Media Type(지원하지 않는 미디어 타입)
    • 사용자가 요청한 미디어타입이 서버에서 지원하지 않는 타입이라서 응답을 거부할 때 쓰는 코드이다.
  • 416 Requested Range Not Satisfiable(요청된 범위가 만족스럽지 않음)
    • 요청 헤더의 Range로 지정한 범위가 잘못되었을 때 발생한다.
  • 417 Expectation Failed(예측 실패)
    • 요청 헤더의 Expect값이 서버에서는 적절하지 못하다는 것을 응답할때 쓰는 코드이다.
  • 418 I’m a teapot(찻주전자로 커피를 만들 수 없음)
    • 하이퍼텍스트 커피 포트 제어 프로토콜(HTCPCP)(RFC 2324)에서 사용되는 코드이다. 구현 페이지
  • 421 Misdirected Request(잘못된 요청)
    • 서버로 유동된 요청된 응답을 서버에서 생성할 수 없을때 응답하는 코드로 주로 TLS 인증서가 여러개 설치된 상태에서 꼬였을 경우 뜨는 오류다.
  • 422 Unprocessable Entity(처리할 수 없는 개체)
    • 요청을 잘 받았으나 문법 오류로 인하여 무언가를 응답할 수 없을때 사용되는 코드이다. WebDAV 전용
  • 423 Locked(잠김)
    • 요청한 리소스가 잠겨있을때 뜨는 코드이다. WebDAV 전용
  • 424 Failed Dependency(실패한 종속성)
    • 이전의 요청이 실패한 상태에서 지금의 요청도 실패한 경우 뜨는 코드이다. WebDAV 전용
  • 425 Too Early(너무 일찍요청)
    • 서버가 재생될 수 있는 요청을 처리하는 데 위험을 감수하지 않는다는걸 알릴때 사용되는 코드이다. 클라이언트가 파이어폭스 58 이후 버전이 아닌이상 재대로 해석하지는 않는다.
  • 426 Upgrade Required(업그레이드 필요)
    • 클라이언트에서 보낸 요청의 프로토콜이 맞지 않아 현재 서버에서 처리할 수 없으나, 클라이언트가 프로토콜을 서버에서 지원하는 다른 프로토콜로 업그레이드 한다면 처리해 줄 수도 있는 상황에서 쓰는 응답 코드이다. 주로 서버의 응답에는 Upgrade 헤더와 필요한 프로토콜을 같이 응답한다. 보통 HTTP/1.1인 클라이언트가 HTTP/2만 지원하는 서버에서 요청할 때 뜬다.
  • 428 Precondition Required(전제 조건 필요)
    • 서버로 요청을 할려면 요청이 조건부이어야만 할 때 뜨는 코드이다. 사용자가 PUT 요청을 하여 서버의 값이 수정되는 동안 다른 사용자가 서버의 상태를 수정하여 발생하는 충돌인 업데이트 상실를 막기 위해서 존재하는 코드
  • 429 Too Many Requests(너무 많은 요청)
    • 일정 시간 동안 너무 많은 요청을 보냈을 때 이를 거부하기 위해 사용한다. 나무위키에서는 페이지 소스(/raw/문서명) 보기를 너무 자주 요청했을 때 임시 차단을 걸기 위해 사용한다.
  • 431 Request Header Fields Too Large(요청 헤더 필드가 너무 큼)
    • 요청한 헤더 값이 너무 커서 서버에서 처리를 하지 않는다는 걸 응답할 때 쓰는 코드이다. 보통 크기가 큰 쿠키와 캐시가 너무 쌓여져 있는 상태에서 서버에 요청할 때 뜨는 오류이다. 그리고 사용자 에이전트 변경프로그램으로 UA를 너무 길게 설정했을 때도 나온다. 캐시 및 쿠키를 정리하면 대부분 정상적으로 서버에서 응답한다.
  • 451 Unavailable For Legal Reasons(법적인 이유로 차단됨)
    • 국가 검열 등, 법적인 이유로 차단되었을 경우 사용할 수 있도록 정의된 코드이다. 서버는 Link 헤더로 차단된 근거가 되는 주소를 보낼 수 있다.

5. 5xx (서버 오류)

올바른 요청에 대해 서버가 응답할 수 없다는 의미이다.

  • 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
    • 사용자가 네트워크 엑세스 권한이 필요한 경우 뜨는 응답코드. 보통 네트워크에 엑세스할 때 로그인이 필요한 경우 주로 뜬다.

6. 비표준

  • 420 Enhance Your Calm
    • 트위터의 초기 API에서 사용하던 비표준 응답코드. 클라이언트가 API 리밋에 도달할 경우에 사용되었으나, 표준 코드인 429 Too Many Requests가 나오자 이쪽으로 대체되었다.
  • 520 Unknown Error
    • 알 수 없는 오류. Cloudflare에서 주로 쓰는 비표준 응답코드
  • 509 Apache bw/limited extension
    • 설정한 대역폭 제한을 초과시 사용된다. 원래 아파치 HTTP 서버와 CPanel에 쓰는 비표준 응답코드이나 웹호스팅를 사용하는 경우가 많아진 지금은 사실상 표준응답코드로 사용된다.
  • 522 Connection timed out
    • 접속 시간 초과. Cloudflare에서 주로 쓰는 비표준 응답코드
  • 525 SSL Handshake Failed
    • 서버와 사용자간에 SSL/TLS Handshake을 할 수 없을 때 뜨는 코드로 주로 TLS를 설정을 안하고 HTTPS 접속이 안되는 서버 상태에서 Cloudflare SSL 구성값에 오류가 생긴 경우에 주로 뜬다. Cloudflare에서 주로 쓰는 비표준 응답코드
  • 526 Invalid SSL certificates
    • 서버의 SSL 인증서의 유효성을 검증 할수없고 인증서가 잘못되었을때 뜬다. Cloudflare에서 주로 쓰는 비표준 응답코드

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.