1. 1XX
정보 전달: 요청을 받았고, 작업을 진행 중이라는 의미이다. HTTP/1.0 이후 한동안 쓰이지 않아 서버도 클라이언트에 이 코드를 보내지 않았지만, 최근 101의 경우 WebSocket 등에서, 103의 경우 페이지 로드 속도를 빠르게 하기 위해서 다시 쓰이기 시작했다.[1]
* 100 Continue
* 100 Continue
2. 2XX
성공: 이 작업을 성공적으로 받았고, 이해했으며, 받아들여졌다는 의미이다. 200, 204, 206을 제외하고는 볼 일이 거의 없는 코드들이다.
* 200 OK: 성공적으로 처리했을 때 쓰인다. 가장 일반적으로 볼 수 있는 HTTP 상태.
* 200 OK: 성공적으로 처리했을 때 쓰인다. 가장 일반적으로 볼 수 있는 HTTP 상태.
3. 3XX
리다이렉션: 이 요청을 완료하기 위해서는 리다이렉션이 이루어져야 한다는 의미이다. 짧은 주소(단축 URL) 서비스의 경우 접속 시 301이나 302 코드를 보내고, 헤더의 location에 리다이렉션할 실제 URL을 적어 보낸다.
* 300 Multiple Choices(복수 응답): 서버에서 여러 개의 응답이 있음을 알릴 때 사용할 의도로 만들어졌으나, 정작 응답을 선택하는 방법은 표준화되지 않아 사용되지 않는다.
* 300 Multiple Choices(복수 응답): 서버에서 여러 개의 응답이 있음을 알릴 때 사용할 의도로 만들어졌으나, 정작 응답을 선택하는 방법은 표준화되지 않아 사용되지 않는다.
- 306 (unused): 초기 HTTP/1.1까지만 해도 Switch Proxy 요청으로 다음 요청시 지정한 프록시 서버를 사용하라는 응답 코드로 초안이 각성되었으나[5] 정작 사용이 되지 않았고 지금은 305 Use Proxy 응답이 사용 중지(Deprecated)되어 문서에서 삭제, 예약코드로 있다.
4. 4XX
클라이언트 오류: 이 요청은 올바르지 않다는 의미이다. 여기서부터 브라우저에 직접 표출된다. 굵게 강조된 것은 자주 보이는 오류들이다.
* 400 Bad Request(잘못된 요청): 요청 자체가 잘못되었을 때 사용하는 코드이다.[6]
* 400 Bad Request(잘못된 요청): 요청 자체가 잘못되었을 때 사용하는 코드이다.[6]
- 401 Unauthorized(권한 없음): 인증이 필요한 리소스에 인증 없이 접근할 경우 발생한다. 이 응답 코드를 사용할 때에는 반드시 브라우저에 어느 인증 방식[11]을 사용할 것인지 보내야 한다. 단순히 권한이 없는 경우 이 응답 코드 대신 아래 403 Forbidden을 사용해야 한다.
- 403 Forbidden(거부됨): 서버가 요청을 거부할 때 발생한다. 관리자가 해당 사용자를 차단했거나 서버에 index.html 이 없는 경우에도[12] 발생할 수 있다. 혹은 권한이 없을 때(로그인 여부와는 무관하다)에도 발생한다.
- 418 I'm a teapot(찻주전자로 커피를 만들 수 없음.):
하이퍼텍스트 커피 포트 제어 프로토콜(HTCPCP)(RFC 2324)[13]에서 사용되는 코드이다. 실제 구현 페이지 - 426 Upgrade Required(업그레이드 필요): 클라이언트에서 보낸 요청의 프로토콜이 맞지 않아 현재 서버에서 처리할 수 없으나, 클라이언트가 프로토콜을 서버에서 지원하는 다른 프로토콜로 업그레이드 한다면 처리해 줄 수도 있는 상황에서 쓰는 응답 코드이다. 주로 서버의 응답에는 Upgrade 헤더와 필요한 프로토콜을 같이 응답한다. 보통 HTTP/1.1인 클라이언트가 HTTP/2만 지원하는 서버에서 요청할 때 뜬다.
5. 5XX
서버 오류: 올바른 요청에 대해 서버가 응답할 수 없다는 의미이다.
* 500 Internal Server Error(내부 서버 에러): 서버에 오류가 발생해 작업을 수행할 수 없을 때 사용된다. 보통 설정이나 퍼미션 문제. 아니면 HTTP 요청을 통해 호출한 문서가 실제 HTML 문서가 아니라 JSP, PHP, 서블릿 등의 프로그램일 경우 그 프로그램이 동작하다 세미콜론을 빼먹는 등의 각종 에러로 비정상 종료를 하는 경우 이 응답코드를 보낸다.
* 500 Internal Server Error(내부 서버 에러): 서버에 오류가 발생해 작업을 수행할 수 없을 때 사용된다. 보통 설정이나 퍼미션 문제. 아니면 HTTP 요청을 통해 호출한 문서가 실제 HTML 문서가 아니라 JSP, PHP, 서블릿 등의 프로그램일 경우 그 프로그램이 동작하다 세미콜론을 빼먹는 등의 각종 에러로 비정상 종료를 하는 경우 이 응답코드를 보낸다.
6. 비표준
- 509 Apache bw/limited extension: 설정한 대역폭 제한을 초과시 사용된다. 원래 아파치 HTTP 서버와 CPanel에 쓰는 비표준 응답코드이나 웹호스팅를 사용하는 경우가 많아진 지금은 사실상 표준응답코드로 사용된다.
- 525 SSL Handshake Failed: 서버와 사용자간에 SSL/TLS Handshake[16]을 할 수 없을 때 뜨는 코드로 주로 TLS를 설정을 안하고 HTTPS 접속이 안되는 서버 상태에서 Cloudflare SSL 구성값에 오류가 생긴 경우에 주로 뜬다. Cloudflare에서 주로 쓰는 비표준 응답코드.
- 526 Invalid SSL certificates: 서버의 SSL 인증서의 유효성을 검증 할수없고 인증서가 잘못되었을때 뜬다. Cloudflare에서 주로 쓰는 비표준 응답코드.
7. 여담
[1] 여담으로 2019년 기준 Express.js 서버에서 100 코드를 보내게 만들면 브라우저가 로딩만 하다가 오류를 표시한다.[2] 여담으로 Discord의 음성 채널에 접속한 후 네트워크 트래픽을 보면 이 101 코드를 볼 수 있다.[3] 여담으로 Discord의 음성 채널에 접속한 후 네트워크 트래픽을 보면 이 101 코드를 볼 수 있다.[4] HTTP1.1 305/306 응답초안[5] HTTP1.1 305/306 응답초안[6] 나무위키 기준으로는 그냥 브라우저에서 http://namu.wiki/internal/...로 들어가거나 파이어폭스의 네트워크 개발자 도구를 열고 새 요청을 존재하지 않는 HTTP 메소드(그냥 X 등으로 써도 된다)로 요청을 하면 나온다.[7] Basic과 Digest 두가지가 있다. Basic은 아이디와 비밀번호를 평문 그대로(!) 전송하며, Digest는 아이디와 nonce값을 이용해 해시를 만들어 전송한다.[8] 만약 접근을 index.html까지 지정해서 했다면 404가 뜬다. 이건 방식의 차이인데, index.html을 지정하지 않고 접근하면 서버는 자동으로 index.html을 찾아서 띄워주고 그런 파일이 없다면 해당 디렉토리에 있는 파일 리스트를 보여주게 된다. 그래서 옛날에는 index.html이 없으면 웹 브라우저에 파일 리스트가 뜨는 모습을 자주 볼 수 있었다. 그러나 보안상 이유로 요즘 만들어지는 웹 사이트들은 서버 설정을 통해 클라이언트가 웹 브라우저에서 파일 리스트를 보는 권한을 백이면 백 막아놓기 때문에 접근을 거부하는 403 에러를 띄우게 된다. 그러나 파일까지 지정해서 접근하면 서버는 파일로 바로 접근하기 때문에 파일이 없다는 404 에러를 띄우는 것이다.[9] 만우절 장난이다. RFC에는 전통적으로 만우절 장난으로 문서가 작성되곤 한다.[RFC8470] 10.1 10.2 https://tools.ietf.org/html/rfc8470[11] Basic과 Digest 두가지가 있다. Basic은 아이디와 비밀번호를 평문 그대로(!) 전송하며, Digest는 아이디와 nonce값을 이용해 해시를 만들어 전송한다.[12] 만약 접근을 index.html까지 지정해서 했다면 404가 뜬다. 이건 방식의 차이인데, index.html을 지정하지 않고 접근하면 서버는 자동으로 index.html을 찾아서 띄워주고 그런 파일이 없다면 해당 디렉토리에 있는 파일 리스트를 보여주게 된다. 그래서 옛날에는 index.html이 없으면 웹 브라우저에 파일 리스트가 뜨는 모습을 자주 볼 수 있었다. 그러나 보안상 이유로 요즘 만들어지는 웹 사이트들은 서버 설정을 통해 클라이언트가 웹 브라우저에서 파일 리스트를 보는 권한을 백이면 백 막아놓기 때문에 접근을 거부하는 403 에러를 띄우게 된다. 그러나 파일까지 지정해서 접근하면 서버는 파일로 바로 접근하기 때문에 파일이 없다는 404 에러를 띄우는 것이다.[13] 만우절 장난이다. RFC에는 전통적으로 만우절 장난으로 문서가 작성되곤 한다.[15] SSL/TLS로 접속할 때 하는 신원확인 과정.[16] SSL/TLS로 접속할 때 하는 신원확인 과정.