HTTP (HyperText Transfer Protocol)는 클라이언트와 서버 간 통신 규약을 나타내는 것임
그 중 Status Code는 서버가 (클라이언트로부터 받은) 요청에 대한 처리 결과를 나타내기 위한 숫자로, 응답 메세지의 상태 라인에 포함됨
// 서버의 응답 메세지 예시 //
HTTP/1.1 200 OK // -> 200이라는 상태 코드를 통해 요청 처리 성공을 전달
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page
HTTP Status Code는 IANA라는 인터넷 할당 번호 관리 기관에서 "HTTP Status Code Registry"라는 이름으로 관리
(https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml)
1NN - 정보 제공
클라이언트의 요청을 받았으며, 요청 처리를 진행 중
(1xx 계열의 응답은 HTTP/1.1 클라이언트에게만 보낼 수 있으며 응답은 바디 없이 상태 라인, 헤더(생략 가능), 빈 줄로 종료)
100 | Continue | 계속 진행 (클라이언트는 요청 헤더에 ‘Expect: 100-continue’를 보내고 서버는 이를 처리할 수 있으면 이 코드로 응답) |
101 | Switching Protocols | 프로토콜을 전환해야함 (프로토콜을 HTTP 1.1에서 업그레이드할 때 Upgrade 응답 헤더에 표시. 현재는 HTTP 1.1이 최신이므로 사용할 일이 없음) |
102 | Processing | (WebDAV) 처리 중이다. (서버가 처리하는 데 오랜 시간이 예상되어 클라이언트에서 타임 아웃이 발생하지 않도록 이 응답 코드를 보냄) |
2NN - 요청 처리 성공
클라이언트가 요청한 동작을 수신하여 성공적으로 처리함
200 | OK | 서버가 요청을 성공적으로 처리 |
201 | Created | 요청이 처리되어서 새로운 리소스가 생성 (응답 헤더 Location에 새로운 리소스의 절대 URI를 기록) |
202 | Accepted | 요청은 접수하였지만, 처리가 완료되지 않음 (응답 헤더의 Location, Retry-After를 참고하여 클라이언트는 다시 요청을 보냄) |
203 | Non-Authoritative Information |
응답 헤더가 오리지널 서버로부터 제공된 것이 아님 (프록시 서버가 응답 헤더에 주석을 덧붙인 경우가 하나의 예) |
204 | No Content | 처리를 성공하였지만, 클라이언트에게 돌려줄 콘텐츠가 없음 (응답에는 헤더만 있고 바디는 없음. DELETE 요청에 대한 응답에 많이 사용됨) |
205 | Reset Content | 처리를 성공하였고 화면을 리셋 (예를 들어 브라우저가 입력 폼을 보여 주고 있을 때 이 응답 코드를 받으면 브라우저는 모든 입력 항목을 리셋하고 재입력할 수 있는 상태가 됨) |
206 | Partial Content | 콘텐츠의 일부만을 보냄 (응답 헤더의 Content-Range에 응답 콘텐츠의 범위를 기록. 예를 들어 1,500 바이트의 리소스 중에서 처음의 500바이트만을 보낼 때 사용할 수 있음.) |
207 | Multi-Status | (WebDAV) 처리 결과의 스테이터스가 여러 개임 (207 응답은 성공을 뜻하지만, 각각의 처리 결과가 성공인지는 바디를 봐야 알 수 있음) |
3NN - 리다이렉션 (Redirection)
클라이언트는 요청을 마치기 위해 추가 동작을 취해야 함
300 | Multiple Choices | 선택 항목이 여러 개가 있음 (지정한 URI에 대해서 콘텐츠 협상을 수행한 결과, 서버에서 콘텐츠를 결정하지 못하고 클라이언트에게 복수 개의 링크를 응답할 때 사용) |
301 | Moved Permanently | 지정한 리소스가 새로운 URI로 이동함 (이동할 곳의 새로운 URI는 응답 헤더 Location에 기록) |
302 | Found | 요청한 리소스를 다른 URI에서 찾음 (요청한 URI가 없으므로 클라이언트 메소드를 그대로 유지한 채, 응답 헤더 Location에 표시된 다른 URI로 요청을 재송신할 필요가 있음.) * 302의 의미를 정확하게 개선해서 307을 정의하였으므로 이 응답 코드의 사용은 권장 X |
303 | See Other | 다른 위치로 요청해야함 (요청에 대한 처리 결과를 응답 헤더 Location에 표시된 URI에서 GET으로 취득할 수 있음. 브라우저의 폼 요청을 POST로 처리하고, 그 결과 화면으로 리다이렉트시킬 때 자주 사용하는 응답 코드임) |
304 | Not Modified | 마지막 요청 이후 요청한 페이지는 수정되지 않음 (If-Modified-Since와 같은 조건부 GET 요청일 때 지정한 리소스가 갱신되지 않았음을 알려줌. 이 응답 코드에는 바디가 없음) |
305 | Use Proxy | 지정한 리소스에 액세스하려면 프록시를 통해야 함 (응답 헤더 Location에 프록시의 URI를 기록) |
306 | (현재 사용 X) | 현재 사용하지 않는 상태코드임 |
307 | Temporary Redirect | 임시로 리다이렉션 요청이 필요함 (요청한 URI가 없으므로 클라이언트 메소드를 그대로 유지한 채 응답 헤더 Location에 표시된 다른 URI로 요청을 재송신해야함. 클라이언트는 향후 요청 시 원래 위치를 계속 사용해야 함.) * 302의 의미를 정확하게 재정의해서 HTTP/1.1의 307 응답으로 추가 |
4NN - 클라이언트 오류
클라이언트의 요청에 오류가 있음 (자주 사용되는 상태 코드 : 400, 401, 403, 404)
400 | Bad Request | 요청의 구문이 잘못됨 (클라이언트가 모르는 4xx 계열 응답 코드가 반환된 경우에도 클라이언트는 400과 동일하게 처리하도록 규정) |
401 | Unauthorized | 지정한 리소스에 대한 액세스 권한이 없음 (응답 헤더 WWW-Authenticate에 필요한 인증 방식을 지정) |
402 | Payment Required | 지정한 리소스를 액세스하기 위해서는 결제가 필요함 * 이 응답 코드는 실제로는 사용되지 않음 |
403 | Forbidden | 지정한 리소스에 대한 액세스가 금지됨 (401 인증 처리 이외의 사유로 리소스에 대한 액세스가 금지되었음을 의미. 리소스의 존재 자체를 은폐하고 싶은 경우도 404 응답 코드를 사용할 수 있음.) |
404 | Not Found | 지정한 리소스를 찾을 수 없음 |
405 | Method Not Allowed |
요청한 URI가 지정한 메소드를 지원하지 않음 (응답 헤더 Allow에 이 URI가 지원하는 메소드 목록을 기록함) |
406 | Not Acceptable | 클라이언트가 Accept-* 헤더에 지정한 항목에 관해 처리할 수 없음 (응답 바디에는 300 응답처럼 서버가 수용 가능한 다른 선택지 리스트가 기록됨) |
407 | Proxy Authentication Required |
클라이언트는 프록시 서버에 인증이 필요함 (프록시 서버의 응답 헤더 Proxy-Authenticate에 필요한 인증 방식을 지정) |
408 | Request Timeout | 요청을 기다리다 서버에서 타임아웃함 |
409 | Conflict | 서버가 요청을 수행하는 중에 충돌이 발생함 (예를 들어 사용자명을 new_name으로 변경하려 하였지만, 서버에 이미 new_name이라는 사용자가 존재하는 경우. 응답 헤더 Location에는 충돌이 발생한 리소스의 URI를 기록함) |
410 | Gone | 지정한 리소스가 이전에는 존재하였지만, 현재는 존재하지 않음 (예를 들어 기간이 한정된 프로모션 사이트가 사라진 경우 사용할 수 있음) |
411 | Length Required | 요청 헤더에 Content-Length를 지정해야 함 |
412 | Precondition Failed | If-Match와 같은 조건부 요청에서 지정한 사전 조건이 서버와 맞지 않음 |
413 | Request Entity Too Large |
요청 메시지가 너무 큼 (서버는 접속을 끊음) |
414 | Request-URI Too Large |
요청 URI가 너무 긺 |
415 | Unsupported Media Type |
클라이언트가 지정한 미디어 타입을 서버가 지원하지 않음 (예를 들어 서버가 지원하는 이미지는 JPG, PNG뿐인데 클라이언트가 GIF 형식의 이미지를 요청하는 경우) |
416 | Range Not Satisfiable |
클라이언트가 지정한 리소스의 범위가 서버의 리소스 사이즈와 맞지 않음 |
417 | Expectation Failed | 클라이언트가 지정한 Expect 헤더를 서버가 이해할 수 없음 |
422 | Unprocessable Entity |
(WebDAV) 클라이언트가 송신한 XML이 구문은 맞지만, 의미상 오류가 있음 |
423 | Locked | (WebDAV) 지정한 리소스는 잠겨있음 |
424 | Failed Dependency | (WebDAV) 다른 작업의 실패로 인해 본 요청도 실패함 |
426 | Upgraded Required | 클라이언트의 프로토콜의 업그레이드가 필요함 (응답에 Upgrade 헤더를 보내 필요한 프로토콜을 알려 줌) |
428 | Precondition Required |
If-Match와 같은 사전조건을 지정하는 헤더가 필요함. (If-Match 헤더가 있지만, 맞지 않는 경우는 412 응답을 보냄) |
429 | Too Many Requests | 클라이언트가 주어진 시간 동안 너무 많은 요청을 보냄 (요청의 속도를 제한할 때 사용. 응답에 Retry-After 헤더를 보내 얼마나 기다릴지를 알려 줄 수 있음) |
431 | Request Header Fields Too Large |
헤더의 길이가 너무 큼 (헤더의 전체 크기가 크거나 또는 하나의 헤더가 매우 큰 경우. 보통 Referer URL이 길거나 쿠키 항목이 많은 경우) |
444 | Connection Closed Without Response | (NGINX) 응답을 보내지 않고 연결을 종료함 (보통 악의적인 요청에 대해서 사용하며, 클라이언트에서는 응답을 볼 수 없고 Nginx 로그에 나타남) |
451 | Unavailable For Legal Reasons |
법적으로 문제가 있는 리소스를 요청 |
5NN - 서버 오류
서버에 오류가 발생하여 요청 처리에 실패
500 | Internal Server Error | 서버에 오류 발생 (클라이언트가 모르는 5xx 계열의 응답 코드가 반환된 경우에도 클라이언트는 500과 동일하게 처리하도록 규정) |
501 | Not Implemented | 요청한 URI의 메소드에 대해 서버가 구현하고 있지 않음 |
502 | Bad Gateway | 게이트웨이 또는 프록시 역할을 하는 서버가 그 뒷단의 서버로부터 잘못된 응답을 받음 |
503 | Service Unavailable | 현재 서버에서 서비스를 제공할 수 없음 (보통은 서버의 과부하나 서비스 점검 등 일시적인 상태) |
504 | Gateway Timeou | 게이트웨이 또는 프록시 역할을 하는 서버가 그 뒷단의 서버로부터 응답을 기다리다 타임아웃이 발생 |
505 | HTTP Version Not Supported |
클라이언트가 요청에 사용한 HTTP 버전을 서버가 지원하지 않음 |
507 | Insufficient Storage | (WebDAV) 서버에 저장 공간 부족으로 처리에 실패 |
'Computer Science > 네트워크' 카테고리의 다른 글
GET과 POST를 비교해보자 (0) | 2024.02.04 |
---|---|
HTTP에 대해 알아보자 (1) | 2024.02.04 |
TCP의 3 Way HandShake (0) | 2024.02.04 |
TCP와 UDP를 비교해보자 (1) | 2024.02.04 |
OSI 7계층과 TCP/IP 4계층을 비교해보자 (0) | 2024.02.04 |