[웹] HTTP 상태코드 한방에 정리
HTTP
HTTP(Hypertext Transfer Protocol)는 웹 서버와 웹 클라이언트 사이에서 데이터를 주고받기 위해 사용하는 통신 방식으로 TCP/IP 프로토콜 위에서 동작한다.
즉, 우리가 웹을 이용하려면 웹 서버와 웹 클라이언트는 각각 TCP/IP 동작에 필수적인 IP 주소를 가져야 한다는 의미이다.
클라이언트가 서버에 요청을 보내면 서버는 해당 요청에 대한 응답을 반환한다. 이 응답은 상태 코드로 표시되며, 클라이언트에게 어떤 결과가 발생했는지를 알려준다.
HTTP 상태 코드는 100부터 500까지의 범위로 분류되며, 각 코드는 특정한 의미와 동작을 나타낸다.
HTTP란 이름대로라면 하이퍼텍스트(Hypertext)만 전송할 수 있어 보이지만, 실제로는 HTML이나 XML과 같은 하이퍼텍스트뿐 아니라 이미지, 음성, 동영상, Javascript, PDF와 각종 문서 파일 등 컴퓨터에서 다룰 수 있는 데이터라면 무엇이든 전송할 수 있다.
예를 들어 우리가 웹 브라우저의 주소창에 https://www.naver.com을 입력하고 Enter 를 누르면 웹 클라이언트와 웹 서버 사이에 HTTP 연결이 맺어지고 웹 클라이언트는 웹 서버에 HTTP 요청 메시지를 보낸다. 웹 서버는 요청에 따른 처리를 진행한 후에 그 결과를 웹 클라이언트에 HTTP 응답 메시지로 보낸다. 이처럼 요청 메시지와 응답 메시지가 반복적으로 오가므로 우리는 웹을 사용할 수 있는 것이다.
서버에서의 처리 결과는 응답 메시지의 상태 라인에 있는 상태 코드(status code)를 보고 파악할 수 있다.
상태 코드는 세 자리 숫자로 되어 있는데 첫 번째 숫자는 HTTP 응답의 종류를 구분하는 데 사용하며 나머지 2개의 숫자는 세부적인 응답 내용 구분을 위한 번호이다.
현재 100~500번 대까지 상태 코드가 정의되어 있는데 첫 번째 자리 숫자에 따라 다음과 같이 5가지로 분류해서 사용하고 있다.
상태 코드 개요
- 1XX: Informational(정보 제공)
- 임시 응답으로 현재 클라이언트의 요청까지는 처리되었으니 계속 진행하라는 의미입니다. HTTP 1.1 버전부터 추가되었다.
- 2XX: Success(성공)
- 클라이언트의 요청이 서버에서 성공적으로 처리되었다는 의미이다.
- 3XX: Redirection(리다이렉션)
- 완전한 처리를 위해서 추가 동작이 필요한 경우이다. 주로 서버의 주소 또는 요청한 URI의 웹 문서가 이동되었으니 그 주소로 다시 시도하라는 의미이다.
- 4XX: Client Error(클라이언트 에러)
- 없는 페이지를 요청하는 등 클라이언트의 요청 메시지 내용이 잘못된 경우를 의미한다.
- 5XX: Server Error(서버 에러)
- 서버 사정으로 메시지 처리에 문제가 발생한 경우이다. 서버의 부하, DB 처리 과정 오류, 서버에서 익셉션이 발생하는 경우를 의미한다.
HTTP 응답에 포함되는 상태 코드는 IANA(Internet Assigned Numbers Authority)라는 인터넷 할당 번호 관리기관이 HTTP 상태 코드 레지스트리라는 이름으로 관리하고 있다.
다음은 HTTP 상태 코드 전체를 요약 정리한 표이다.
쪽찝개 상태코드
1XX: Informational(정보 제공)
상태 코드 | 상태 텍스트 | 한국어 뜻 | 서버 측면에서의 의미 |
1XX | Informational | 정보 제공 | 클라이언트의 요청을 받았으며 작업을 계속 진행하고 있다. 1xx 계열의 응답은 HTTP/1.1 클라이언트에게만 보낼 수 있으며 응답은 바디 없이 상태 라인, 헤더(생략 가능), 빈 줄로 종료된다. |
100 | Continue | 계속 | 계속 진행하라. 클라이언트는 요청 헤더에 ‘Expect: 100-continue’를 보내고 서버는 이를 처리할 수 있으면 이 코드로 응답한다. |
101 | Switching Protocols | 프로토콜 전환 | 프로토콜을 전환하라. 프로토콜을 HTTP 1.1에서 업그레이드할 때 Upgrade 응답 헤더에 표시한다. 현재는 HTTP 1.1이 최신이므로 사용할 일이 없다. |
102 | Processing | 처리중 | (WebDAV) 처리 중이다. 서버가 처리하는 데 오랜 시간이 예상되어 클라이언트에서 타임 아웃이 발생하지 않도록 이 응답 코드를 보낸다. |
103 ~ 199 | Unassigned | 현재 할당되지 않은 상태 코드이다. |
100 Continue (계속):
서버가 클라이언트의 일부 요청을 받아들였으며, 클라이언트는 나머지 데이터를 계속해서 보낼 수 있다.
이 코드는 클라이언트가 서버로 요청을 보내고, 서버가 해당 요청을 계속해서 처리할 의사가 있다는 것을 나타낸다.
서버가 이 상태 코드를 반환하면, 클라이언트는 요청 본문을 계속해서 전송할 수 있습니다. 이러한 상태 코드는 일반적으로 POST 요청 시 사용된다.
요청
POST /upload HTTP/1.1
Host: example.com
Content-Length: 5000
Expect: 100-continue
[5000 바이트 크기의 요청 본문 데이터]
응답
HTTP/1.1 100 Continue
이 상황에서 서버는 클라이언트로부터의 요청을 받았고, 요청 본문 데이터를 기다리고 있다는 것을 알리는 응답을 보낸다. 클라이언트는 이 응답을 받은 후에 본문 데이터를 계속해서 전송할 수 있다.
실제 응용 프로그램에서는 HTTP 통신의 일부로 이러한 상태 코드가 사용되며, 클라이언트와 서버 간의 효율적인 데이터 전송을 위해 중요한 역할을 한다.
101 Switching Protocols (프로토콜 전환):
HTTP 상태 코드 101은 서버가 클라이언트 요청에 대해 프로토콜을 변경하거나 업그레이드하겠다는 것을 나타낸다.
주로 업그레이드 가능한 프로토콜, 예를 들어 웹소켓(WebSockets)을 사용하려는 경우에 이 코드가 사용된다. 클라이언트가 업그레이드를 허용하면, 이후 통신은 변경된 프로토콜을 기반으로 이루어진다.
요청
GET /websocket HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
응답
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
이 예시에서, 클라이언트는 "websocket" 프로토콜로 업그레이드하려고 하며, 이를 위해 요청 헤더에 Upgrade 필드를 포함시켰다.
서버는 "Switching Protocols" 응답을 반환하여 클라이언트와 웹소켓 프로토콜로 통신하도록 한다.
102 Processing (처리중):
HTTP 상태 코드 102는 서버가 클라이언트 요청을 접수했고, 요청에 대한 처리가 진행 중임을 알려주는 상태 코드이다. 이 코드는 긴 처리 시간을 필요로 하는 요청의 경우, 클라이언트에게 서버가 아직 작업을 진행 중이라는 것을 알려줄 때 사용된다.
요청
GET /long-process HTTP/1.1
Host: example.com
응답
HTTP/1.1 102 Processing
이 경우 서버는 클라이언트 요청을 아직 완전히 처리하지 않았지만, 요청에 대한 처리가 진행 중임을 알리는 응답을 반환한다.
클라이언트는 이 응답을 받은 후에 대기하거나 다른 작업을 수행할 수 있다.
2XX: Success(성공)
상태 코드 | 상태 텍스트 | 한국어 뜻 | 서버 측면에서의 의미 |
2XX | Success | 성공 | 클라이언트가 요청한 동작을 수신하여 이해하였고 승낙하였으며 성공적으로 처리하였다. |
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 응답은 성공을 뜻하지만, 각각의 처리 결과가 성공인지는 바디를 봐야 알 수 있다. |
208 ~ 299 | Unassigned | 현재 할당되지 않은 상태 코드이다. |
200 OK (성공):
HTTP 상태 코드 200은 클라이언트의 요청이 성공적으로 처리되어 요청한 정보가 응답 본문에 포함되어 반환되었음을 나타낸다.
이 코드는 가장 흔하게 사용되며, 클라이언트의 요청이 성공한 경우에 이 코드가 반환된다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 200 OK
Content-Length: 123
Content-Type: text/plain
This is the content of the requested resource.
201 Created (생성됨):
HTTP 상태 코드 201은 서버가 요청을 성공적으로 처리하여 새로운 리소스를 생성했음을 나타낸다. 이 코드는 일반적으로 POST 요청으로 새 리소스가 생성되거나, PUT 요청으로 리소스가 생성되었을 때 사용된다.
요청
POST /create-user HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 42
{"username": "newuser", "email": "newuser@example.com"}
응답
HTTP/1.1 201 Created
Location: /users/123
이 예시에서, 서버는 "create-user" 엔드포인트에 POST 요청으로 새 사용자를 생성하고, 그 결과로 새로운 리소스가 생성되었음을 나타낸다. 응답에 포함된 Location 헤더는 새로 생성된 리소스의 URL을 제공한다.
202 Accepted (허용됨):
HTTP 상태 코드 202은 서버가 요청을 접수했지만, 요청 처리가 아직 완료되지 않았음을 나타낸다. 클라이언트는 이 상태 코드를 받으면, 요청이 나중에 처리될 것임을 알고 처리 결과를 기다리지 않는다.
요청
POST /generate-report HTTP/1.1
Host: example.com
Content-Length: 10000
응답
HTTP/1.1 202 Accepted
Retry-After: 30
이 경우 서버는 "generate-report" 엔드포인트에 POST 요청으로 보고서 생성을 요청하였고, 이 요청이 접수되었으나 아직 완료되지 않았음을 알린다. Retry-After 헤더는 클라이언트가 나중에 다시 시도할 시간을 알려준다.
203 Non-Authoritative Information (신뢰할 수 없는 정보):
HTTP 상태 코드 203은 프록시 서버가 클라이언트에게 캐시된 응답을 반환하였지만, 이 응답이 원본 서버로부터 직접 얻은 것이 아니라 중간 프록시 서버에서 얻은 것임을 나타낸다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 203 Non-Authoritative Information
Content-Length: 123
Content-Type: text/plain
This is a cached response from a proxy server.
이 경우 클라이언트가 "/resource" 리소스에 대한 GET 요청을 보냈고, 프록시 서버가 캐시된 응답을 반환하였으나 이 응답이 원본 서버로부터 직접 얻은 것이 아님을 알린다.
204 No Content (콘텐츠 없음):
HTTP 상태 코드 204는 서버가 요청을 정상적으로 처리했지만, 응답 본문에 데이터를 포함시키지 않았음을 나타내고 이는 주로 성공적인 요청이지만 응답 데이터가 필요하지 않은 경우에 사용된다.
요청
DELETE /item/123 HTTP/1.1
Host: example.com
응답
DELETE /item/123 HTTP/1.1
Host: example.com
이 경우 서버는 "/item/123" 리소스를 성공적으로 삭제하였고, 응답 본문에는 데이터가 없음을 나타낸다.
205 Reset Content (콘텐츠 재설정):
HTTP 상태 코드 205는 클라이언트가 요청을 처리한 후에 현재 페이지를 새로 고치기를 권장함을 나타내고 이 코드는 주로 사용자가 어떤 작업을 완료한 후에 리프레시를 하라는 경우에 사용된다.
요청
POST /update-profile HTTP/1.1
Host: example.com
응답
HTTP/1.1 205 Reset Content
이 경우 서버는 사용자가 프로필을 업데이트한 후에 페이지를 새로 고치기를 권장한다.
206 Partial Content (일부 콘텐츠):
HTTP 상태 코드 206은 서버가 요청된 리소스의 일부분만 반환하였음을 나타낸다. 이 코드는 주로 클라이언트가 범위를 지정한 요청을 보낸 경우에 사용된다.
요청
GET /large-file.mp4 HTTP/1.1
Host: example.com
Range: bytes=1000-1999
응답
HTTP/1.1 206 Partial Content
Content-Length: 1000
Content-Range: bytes 1000-1999/50000
Content-Type: video/mp4
... (byte range data)
이 예시에서, 클라이언트가 "/large-file.mp4" 리소스에 대한 특정 범위의 데이터를 요청하였고, 서버는 해당 범위의 데이터를 "Partial Content" 응답으로 반환한다. 응답 헤더의 Content-Range 필드는 전체 파일 크기와 전송된 범위를 나타낸다.
207 Multi-Status(다중 상태):
HTTP 상태 코드 207은 WebDAV (웹 분산 접근 및 버전 관리) 프로토콜에서 사용되며, 여러 리소스의 상태를 나타내고 이 코드는 주로 다중 리소스에 대한 처리 결과를 나타낼 때 사용된다.
요청
PROPFIND /resources/ HTTP/1.1
Host: example.com
Depth: 1
응답
HTTP/1.1 207 Multi-Status
Content-Type: text/xml; charset="utf-8"
Content-Length: xxx
<?xml version="1.0" encoding="utf-8"?>
<multistatus xmlns="DAV:">
<response>
<href>/resources/file1.txt</href>
<status>HTTP/1.1 200 OK</status>
<propstat>
<prop>
<creationdate>...</creationdate>
<getlastmodified>...</getlastmodified>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/resources/file2.txt</href>
<status>HTTP/1.1 404 Not Found</status>
</response>
</multistatus>
이 예시에서, 클라이언트는 /resources/ 경로의 리소스에 대한 PROPFIND 요청을 보내고, 서버는 여러 리소스의 상태를 207 Multi-Status 응답으로 반환하고 응답 본문은 XML 형식으로, 각 리소스의 상태 정보와 결과를 포함하고 있다.
3XX: Redirection(리다이렉션)
상태 코드 | 상태 텍스트 | 한국어 뜻 | 서버 측면에서의 의미 |
3XX | Redirection | 리다이렉션 | 클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다. |
300 | Multiple Choices | 여러 선택항목 | 선택 항목이 여러 개 있다. 지정한 URI에 대해서 콘텐츠 협상을 수행한 결과 서버에서 콘텐츠를 결정하지 못하고 클라이언트에게 복수 개의 링크를 응답할 때 사용한다. |
301 | Moved Permanently | 영구 이동 | 지정한 리소스가 새로운 URI로 이동하였다. 이동할 곳의 새로운 URI는 응답 헤더 Location에 기록한다. |
302 | Found | 다른 위치 찾음 | 요청한 리소스를 다른 URI에서 찾았다. 요청한 URI가 없으므로 클라이언트 메소드를 그대로 유지한 채 응답 헤더 Location에 표시된 다른 URI로 요청을 재송신할 필요가 있다. 302의 의미를 정확하게 개선해서 307을 정의하였으므로 이 응답 코드의 사용은 권장하지 않는다. |
303 | See Other | 다른 위치 보기 | 다른 위치로 요청하라. 요청에 대한 처리 결과를 응답 헤더 Location에 표시된 URI에서 GET으로 취득할 수 있다. 브라우저의 폼 요청을 POST로 처리하고 그 결과 화면으로 리다이렉트시킬 때 자주 사용하는 응답 코드이다. |
304 | Not Modified | 수정되지 않음 | 마지막 요청 이후 요청한 페이지는 수정되지 않았다. If-Modified-Since와 같은 조건부 GET 요청일 때 지정한 리소스가 갱신되지 않았음을 알려 준다. 이 응답 코드에는 바디가 없다. |
305 | Use Proxy | 프록시 사용 | 지정한 리소스에 액세스하려면 프록시를 통해야 한다. 응답 헤더 Location에 프록시의 URI를 기록한다. |
306 | (Unused) | 예전 버전에서 사용하다가 현재는 사용하지 않는 상태 코드이다. | |
307 | Temporary Redirect | 임시 리다이렉션 | 임시로 리다이렉션 요청이 필요하다. 요청한 URI가 없으므로 클라이언트 메소드를 그대로 유지한 채 응답 헤더 Location에 표시된 다른 URI로 요청을 재송신할 필요가 있다. 클라이언트는 향후 요청 시 원래 위치를 계속 사용해야 한다. 302의 의미를 정확하게 재정의해서 HTTP/1.1의 307 응답으로 추가되었다. |
308~399 | Unassigned | 현재 할당되지 않은 상태 코드이다. |
300 Multiple Choices(여러 선택항목):
HTTP 상태 코드 300은 클라이언트의 요청에 대해 다중 선택 가능한 리소스가 존재함을 나타낸다. 서버가 다수의 리소스를 제공하고 클라이언트가 이 중에서 하나를 선택해야 할 때 사용될 수 있다.
요청
GET /example HTTP/1.1
Host: example.com
응답
HTTP/1.1 300 Multiple Choices
Content-Length: 180
Content-Type: text/html
<html>
<head>
<title>Multiple Choices</title>
</head>
<body>
<p>Choose a resource:</p>
<ul>
<li><a href="/page1">Page 1</a></li>
<li><a href="/page2">Page 2</a></li>
<li><a href="/page3">Page 3</a></li>
</ul>
</body>
</html>
이 예시에서, 클라이언트가 "/example" 리소스에 대한 GET 요청을 보냈고, 서버는 클라이언트에게 여러 선택 가능한 리소스 목록을 포함하는 "Multiple Choices" 응답을 반환한다.
301 Moved Permanently(영구 이동):
HTTP 상태 코드 301은 요청한 리소스가 영구적으로 새로운 위치로 이동되었음을 나타낸다. 클라이언트는 이후에 해당 리소스의 새 위치를 사용하여 요청해야 한다.
요청
GET /old-resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 301 Moved Permanently
Location: /new-resource
이 경우 서버는 "/old-resource" 리소스가 "/new-resource"로 영구적으로 이동되었음을 클라이언트에게 알린다. 클라이언트는 이후에 "/new-resource"로 리소스를 요청해야 한다.
302 Found(다른 위치 찾음):
HTTP 상태 코드 302는 요청한 리소스가 일시적으로 새로운 위치로 이동되었음을 나타낸다. 클라이언트는 임시적으로 새 위치로 리다이렉션되며, 이후 요청에서 원래 위치를 사용해야 할 수 있다.
요청
GET /old-page HTTP/1.1
Host: example.com
응답
HTTP/1.1 302 Found
Location: /new-page
이 경우 서버는 "/old-page" 리소스가 "/new-page"로 임시적으로 이동되었음을 클라이언트에게 알린다. 클라이언트는 임시적으로 "/new-page"로 리소스를 요청하며, 나중에는 원래 위치로 다시 요청을 보낼 수 있 다.
303 See Other(다른 위치 보기):
HTTP 상태 코드 303은 클라이언트의 요청에 따라 새로운 리소스로 리다이렉션됨을 나타낸다. 주로 POST 요청 후 리다이렉션할 때 사용되며, 클라이언트는 이후에 GET 요청으로 새 리소스를 요청해야 한다.
요청
POST /create-resource HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: ...
param1=value1¶m2=value2
응답
HTTP/1.1 303 See Other
Location: /new-resource
이 경우 클라이언트가 POST 요청으로 "/create-resource" 리소스를 생성했고, 서버는 생성된 리소스를 "/new-resource"로 리다이렉션함을 "See Other" 응답으로 알린다. 클라이언트는 이후에 GET 요청으로 새 리소스를 요청해야 한다.
304 Not Modified(수정되지 않음):
HTTP 상태 코드 304는 클라이언트가 이전에 받은 리소스와 비교하여, 해당 리소스가 변경되지 않았음을 나타낸다. 이 경우 서버는 클라이언트에게 리소스를 다시 보내지 않고, 클라이언트는 이전에 받았던 캐시된 리소스를 계속 사용할 수 있다. 이 코드는 주로 조건부 GET 요청 시에 사용된다.
요청
GET /resource HTTP/1.1
Host: example.com
If-None-Match: "etag123"
응답
HTTP/1.1 304 Not Modified
Etag: "etag123"
이 경우 클라이언트가 이전에 받았던 "/resource" 리소스의 ETag 값을 가지고 새 GET 요청을 보냈습니다. 서버는 클라이언트에게 리소스가 변경되지 않았음을 알리며 "Not Modified" 응답을 반환한다. 클라이언트는 이전에 받았던 리소스를 계속 사용할 수 있다.
305Use Proxy(프록시 사용):
HTTP 상태 코드 305는 이전에는 프록시 서버를 사용해야 할 때 사용되었지만, 현재는 사용되지 않는 코드이다. 이 코드는 클라이언트에게 요청을 프록시 서버를 통해 보내도록 유도했을 때 반환되었다. 하지만 이 코드는 보안 및 개인 정보 보호 이슈로 인해 사용되지 않으며, 현재의 웹 표준에서는 사용하지 않는 것이 좋다.
307Temporary Redirect(임시 리다이렉션):
HTTP 상태 코드 307는 클라이언트의 요청을 일시적으로 새로운 위치로 리다이렉션함을 나타낸다. 이 코드는 302 코드와 유사하지만, 307은 POST 요청을 보낼 때에도 클라이언트가 원래 요청의 메서드와 본문을 그대로 유지해야 한다는 점에서 차이가 있다. 따라서 307 코드는 요청 메서드와 본문을 변경하지 않고 리다이렉션할 때 사용된다.
요청
POST /old-page HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: ...
param1=value1¶m2=value2
응답
HTTP/1.1 307 Temporary Redirect
Location: /new-page
이 경우 클라이언트가 POST 요청으로 "/old-page" 리소스에 데이터를 전송했고, 서버는 "/new-page"로 일시적으로 리다이렉션함을 "Temporary Redirect" 응답으로 알린다. 클라이언트는 요청 메서드와 본문을 그대로 유지하고 "/new-page"로 요청을 재시도해야 한다.
4XX: Client Error(클라이언트 에러)
상태 코드 | 상태 텍스트 | 한국어 뜻 | 서버 측면에서의 의미 |
4XX | Client Error | 클라이언트 에러 | 클라이언트의 요청에 오류가 있다. |
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가 너무 긺 |
요청 URI가 너무 길다. |
415 | Unsupported Media Type |
지원되지 않는 미디어 유형 |
클라이언트가 지정한 미디어 타입을 서버가 지원하지 않는다. 예를 들어 서버가 지원하는 이미지는 JPG, PNG뿐인데 클라이언트가 GIF 형식의 이미지를 요청하는 경우이다. |
416 | Range Not Satisfiable | 처리할 수 없는 요청 범위 |
클라이언트가 지정한 리소스의 범위가 서버의 리소스 사이즈와 맞지 않는다. |
417 | Expectation Failed | 예상 실패 | 클라이언트가 지정한 Expect 헤더를 서버가 이해할 수 없다. |
418 ~ 421 | Unassigned | 현재 할당되지 않은 상태 코드이다. | |
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 | 법적 사유로 불가 | 법적으로 문제가 있는 리소스를 요청하였다. |
452 ~ 499 | Unassigned | 현재 할당되지 않은 상태 코드이다. |
400 Bad Request(잘못된 요청):
HTTP 상태 코드 400은 클라이언트의 요청이 잘못되었거나 서버가 이해하지 못하는 경우에 반환되며 클라이언트의 요청 구문이 잘못되었거나 필요한 매개변수가 누락되었을 때 등에 사용된다.
요청
POST /submit-data HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: ...
{
"invalid_key": "value"
}
응답
HTTP/1.1 400 Bad Request
Content-Length: 15
Content-Type: text/plain
Bad Request.
이 경우 클라이언트가 JSON 데이터를 POST 요청으로 보냈지만, 서버는 요청 바디에 "invalid_key"라는 잘못된 키를 가진 데이터가 있다는 이유로 "Bad Request" 응답을 반환한다.
401 Unauthorized(권한 없음):
HTTP 상태 코드 401은 클라이언트의 요청에 대한 인증이 필요하다는 것을 나타낸다. 요청한 리소스에 접근하기 위해서는 클라이언트가 인증을 해야 하는 상태를 나타내며, 일반적으로 HTTP 기본 인증 또는 토큰 기반 인증을 사용하여 해결된다.
요청
GET /secure-resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Example"
Content-Length: 16
Content-Type: text/plain
Unauthorized.
402 Payment Required(결제 필요):
HTTP 상태 코드 402는 현재는 거의 사용되지 않는 코드로, 요청한 리소스에 접근하기 위해서는 결제가 필요하다는 것을 나타낸다. 이 코드는 온라인 서비스나 컨텐츠의 유료 구독 모델 등에서 사용될 수 있다. 하지만 대부분의 경우에는 사용되지 않으며, 대신 다른 방법으로 결제를 처리하는 것이 일반적이다.
403 Forbidden(금지됨):
HTTP 상태 코드 403은 클라이언트가 요청한 리소스에 대한 접근 권한이 없을 때 사용된다. 서버가 클라이언트의 인증 정보를 받았지만 해당 리소스에 대한 접근 권한을 부여하지 않는 경우나, 인증 없이 접근이 허용되지 않는 리소스에 대한 요청에 사용된다.
요청
GET /restricted-resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 403 Forbidden
Content-Length: 15
Content-Type: text/plain
Access denied.
이 경우 클라이언트가 "/restricted-resource" 리소스에 대한 접근 권한이 없는 상태로 GET 요청을 보냈다. 서버는 "Access denied" 메시지를 포함하는 "Forbidden" 응답을 반환한다.
404 Not Found(찾을 수 없음):
HTTP 상태 코드 404는 클라이언트가 요청한 리소스를 서버에서 찾을 수 없을 때 사용되며 요청한 URI에 해당하는 리소스가 존재하지 않는 경우에 반환된다.
요청
GET /nonexistent-resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 404 Not Found
Content-Length: 13
Content-Type: text/plain
Resource not found.
이 경우 클라이언트가 "/nonexistent-resource" 리소스를 찾으려 했지만, 해당 리소스가 서버에 존재하지 않는 상태이다.
서버는 "Resource not found" 메시지를 포함하는 "Not Found" 응답을 반환한다.
405 Method Not Allowed(허용되지 않은 메소드):
HTTP 상태 코드 405는 클라이언트가 사용한 HTTP 메서드가 서버에서 허용되지 않을 때 사용되며 클라이언트가 요청한 리소스에 대해 사용 가능한 메서드 목록을 확인하고, 그 중에서 서버가 지원하지 않는 메서드를 사용한 경우에 반환된다.
요청
PUT /update-resource HTTP/1.1
Host: example.com
Content-Length: ...
Content-Type: application/json
{"key": "value"}
응답
HTTP/1.1 405 Method Not Allowed
Allow: GET, POST
Content-Length: 22
Content-Type: text/plain
Method not allowed here.
이 경우 클라이언트가 "/update-resource" 리소스에 대해 PUT 메서드를 사용하여 업데이트하려 했다. 하지만 서버에서는 PUT 메서드를 허용하지 않는 상태다. 서버는 "Method not allowed here" 메시지와 허용되는 메서드 목록인 "Allow" 헤더를 포함한 "Method Not Allowed" 응답을 반환한다.
406 Not Acceptable(수용할 수 없음):
HTTP 상태 코드 406은 클라이언트의 요청이 서버에서 지원되지 않는 응답 형식을 요청했을 때 반환된다. 클라이언트가 Accept 헤더를 통해 원하는 컨텐츠 형식을 지정할 수 있다. 이 헤더에 지정한 형식이 서버에서 제공되지 않는 경우에 406 코드가 반환된다.
요청
GET /resource HTTP/1.1
Host: example.com
Accept: application/xml
응답
HTTP/1.1 406 Not Acceptable
Content-Length: 20
Content-Type: text/plain
Content not acceptable.
이 경우 클라이언트가 "application/xml" 형식의 컨텐츠를 원하는 상태로 "/resource" 리소스를 요청했다. 그러나 서버에서는 이 형식의 컨텐츠를 제공할 수 없으므로 "Content not acceptable" 메시지를 포함한 "Not Acceptable" 응답을 반환한다.
407 Proxy Authentication Required(프록시 인증 필요):
HTTP 상태 코드 407은 프록시 서버를 통해 리소스에 접근하기 위해 클라이언트에게 프록시 서버의 인증이 필요하다는 것을 나타낸다. 클라이언트가 프록시 서버를 통해 요청을 보낼 때, 프록시 서버가 클라이언트의 인증을 요구하는 경우에 사용된다.
요청
GET /resource HTTP/1.1
Host: example.com
Via: proxy.example.com
Proxy-Authorization: Basic base64credentials
응답
HTTP/1.1 407 Proxy Authentication Required
Proxy-Authenticate: Basic realm="Proxy"
Content-Length: 26
Content-Type: text/plain
Proxy authentication needed.
이 경우 클라이언트가 프록시 서버를 통해 "/resource" 리소스에 접근하려 했다. 프록시 서버는 클라이언트에게 프록시 서버의 인증이 필요하다는 "Proxy authentication needed" 메시지와 함께 "Proxy Authentication Required" 응답을 반환한다. 클라이언트는 Proxy-Authorization 헤더를 사용하여 프록시 서버에 대한 인증 정보를 제공해야 한다.
408 Request Timeout(요청 시간초과):
HTTP 상태 코드 408은 클라이언트의 요청이 서버에서 시간 초과되었을 때 반환된다. 서버는 클라이언트로부터의 요청을 처리하는 동안 일정 시간 내에 응답을 보내지 못했을 때 이 코드를 반환한다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 408 Request Timeout
Content-Length: 16
Content-Type: text/plain
Request timed out.
이 경우 클라이언트가 "/resource" 리소스에 대한 GET 요청을 보냈지만, 서버가 일정 시간 내에 응답을 보내지 못하였으므로 "Request timed out" 메시지를 포함한 "Request Timeout" 응답을 반환한다.
409 Conflict(충돌):
HTTP 상태 코드 409는 클라이언트의 요청이 서버 내부나 리소스 간의 충돌을 일으켰을 때 반환된다. 예를 들어, 동시에 같은 리소스를 수정하려는 두 요청이 충돌할 때 이 코드가 반환될 수 있다.
요청 1
PUT /update-resource HTTP/1.1
Host: example.com
Content-Length: ...
Content-Type: application/json
{"key": "value1"}
요청 2
PUT /update-resource HTTP/1.1
Host: example.com
Content-Length: ...
Content-Type: application/json
{"key": "value2"}
응답
HTTP/1.1 409 Conflict
Content-Length: 15
Content-Type: text/plain
Conflict detected.
이 경우 클라이언트 1과 클라이언트 2가 동시에 같은 리소스인 "/update-resource"를 수정하려 시도합니다. 서버는 충돌을 감지하고 "Conflict detected" 메시지를 포함한 "Conflict" 응답을 반환한다.
410 Gone(사라짐):
HTTP 상태 코드 410은 클라이언트가 요청한 리소스가 서버에서 영구적으로 제거되었음을 나타낸다. 리소스는 이전에 존재했으나 더 이상 사용되지 않거나 접근할 수 없을 때 사용된다. 이 코드는 404 상태 코드와 유사하지만, 410은 요청한 리소스가 영구적으로 사라진 것을 나타내는 반면 404는 현재는 존재하지 않지만 나중에 다시 나타날 수 있는 경우를 의미한다.
요청
GET /obsolete-resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 410 Gone
Content-Length: 18
Content-Type: text/plain
Resource is gone now.
이 경우 클라이언트가 "/obsolete-resource" 리소스를 요청했지만, 해당 리소스가 서버에서 영구적으로 제거되었으므로 "Resource is gone now" 메시지를 포함한 "Gone" 응답을 반환한다.
411 Length Required(길이 필요):
HTTP 상태 코드 411은 클라이언트가 요청을 보낼 때 요청 바디의 길이를 지정하지 않았을 때 반환됩니다. 요청의 Content-Length 헤더가 필요한 경우에 사용됩니다.
요청
POST /submit-data HTTP/1.1
Host: example.com
Content-Type: application/json
응답
HTTP/1.1 411 Length Required
Content-Length: 21
Content-Type: text/plain
Content length needed.
이 경우 클라이언트가 "Content-Length" 헤더 없이 "/submit-data" 리소스에 POST 요청을 보냈다. 서버는 요청의 본문 길이를 알 수 없으므로 "Content length needed" 메시지를 포함한 "Length Required" 응답을 반환한다.
412 Precondition Failed(사전 조건 실패):
HTTP 상태 코드 412는 클라이언트가 요청을 보낼 때 서버의 사전 조건이 충족되지 않았을 때 반환된다. 예를 들어, 클라이언트가 조건부 GET 요청을 보냈을 때, If-Match나 If-None-Match 헤더의 값이 현재 리소스의 ETag와 일치하지 않는 경우에 이 코드가 반환된다.
요청
GET /resource HTTP/1.1
Host: example.com
If-Match: "etag123"
응답
HTTP/1.1 412 Precondition Failed
Content-Length: 19
Content-Type: text/plain
Precondition failed.
이 경우 클라이언트가 "If-Match" 헤더를 사용하여 "/resource" 리소스의 ETag를 지정했지만, 해당 ETag와 일치하지 않으므로 "Precondition failed" 메시지를 포함한 "Precondition Failed" 응답을 반환한다.
413 Request Entity Too Large(요청 객체가 너무 큼):
HTTP 상태 코드 413는 클라이언트가 서버로 보낸 요청의 크기가 서버에서 처리할 수 있는 크기를 초과했을 때 반환된다. 주로 POST나 PUT 요청에서 요청 본문의 크기가 제한을 초과한 경우에 사용된다.
요청
POST /submit-data HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: ...
{"key": "value", ...}
응답
HTTP/1.1 413 Payload Too Large
Content-Length: 19
Content-Type: text/plain
Request too large.
이 경우 클라이언트가 "/submit-data" 리소스에 POST 요청을 보냈는데, 요청 본문의 크기가 서버에서 처리할 수 있는 제한을 초과했으므로 "Request too large" 메시지를 포함한 "Payload Too Large" 응답을 반환한다.
414 Request-URI Too Large(요청 URI가 너무 긺):
HTTP 상태 코드 414는 클라이언트가 서버로 보낸 요청의 URI(Uniform Resource Identifier)가 너무 길어서 서버에서 처리할 수 없을 때 반환된다. 일반적으로 웹 서버나 프록시 서버에서 제한된 길이의 URI만 처리 가능한 경우에 이 코드가 반환된다.
요청
GET /very/long/resource/path/that/is/too/long/to/be/handled HTTP/1.1
Host: example.com
응답
HTTP/1.1 414 URI Too Long
Content-Length: 17
Content-Type: text/plain
URI too long.
이 경우 클라이언트가 매우 긴 URI를 가진 리소스를 요청했는데, 서버에서 처리할 수 있는 URI 길이 제한을 초과했으므로 "URI too long" 메시지를 포함한 "URI Too Long" 응답을 반환한다.
415 Unsupported Media Type(지원되지 않는 미디어 유형):
HTTP 상태 코드 415는 클라이언트가 서버로 보낸 요청의 Content-Type이 서버에서 지원하지 않는 미디어 타입일 때 반환된다. 예를 들어 서버가 JSON 형식의 컨텐츠만 처리할 수 있을 때, XML 형식의 컨텐츠를 보낸 경우에 이 코드가 반환된다.
요청
POST /submit-data HTTP/1.1
Host: example.com
Content-Type: application/xml
Content-Length: ...
<xml>...</xml>
응답
HTTP/1.1 415 Unsupported Media Type
Content-Length: 23
Content-Type: text/plain
Unsupported media type.
이 경우 클라이언트가 "application/xml" 형식의 컨텐츠를 POST 요청으로 보냈는데, 서버에서 지원하지 않는 미디어 타입이므로 "Unsupported media type" 메시지를 포함한 "Unsupported Media Type" 응답을 반환한다.
416 Range Not Satisfiable(처리할 수 없는 요청 범위):
HTTP 상태 코드 416은 클라이언트가 요청한 리소스의 범위가 서버에서 제공하는 범위와 일치하지 않을 때 반환된다. 이 코드는 클라이언트가 Range 헤더를 사용하여 리소스의 일부분만 요청했을 때, 서버가 해당 범위를 제공할 수 없는 경우에 사용된다.
요청
GET /large-file HTTP/1.1
Host: example.com
Range: bytes=100-1000
응답
HTTP/1.1 416 Range Not Satisfiable
Content-Range: bytes */10000
Content-Length: 26
Content-Type: text/plain
Requested range invalid.
이 경우 클라이언트가 "/large-file" 리소스의 100~1000 바이트 범위를 요청했지만, 서버에서는 해당 범위를 제공할 수 없으므로 "Requested range invalid" 메시지와 함께 "Range Not Satisfiable" 응답을 반환된다. 응답 헤더의 Content-Range 필드는 리소스의 총 길이를 나타내며, 현재 제공할 수 없는 범위를 나타내는 "/" 값이 포함된다.
417 Expectation Failed(예상 실패):
HTTP 상태 코드 417는 클라이언트가 Expect 요청 헤더를 사용하여 서버에게 요청을 수행하기 전에 특정 조건을 만족시키도록 기대했으나, 서버가 해당 조건을 만족시키지 못했을 때 반환된다.
요청
POST /submit-data HTTP/1.1
Host: example.com
Expect: 100-continue
Content-Length: ...
{"key": "value"}
응답
HTTP/1.1 417 Expectation Failed
Content-Length: 24
Content-Type: text/plain
Expectation not met here.
이 경우 클라이언트가 Expect 요청 헤더를 사용하여 "100-continue" 상태를 기대하며 POST 요청을 보냈지만, 서버가 해당 조건을 만족시키지 못했으므로 "Expectation not met here" 메시지를 포함한 "Expectation Failed" 응답을 반환한다.
422 Unprocessable Entity(처리할 수 없는 엔티티):
HTTP 상태 코드 422는 클라이언트의 요청이 서버에서 이해되었지만, 유효성 검사를 통과하지 못하여 처리할 수 없는 경우에 반환된다. 주로 클라이언트의 요청이 유효한 구문을 가지고 있으나 비즈니스 논리나 데이터 유효성 검사를 통과하지 못하는 경우에 사용된다.
요청
POST /create-user HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: ...
{"username": "", "email": "invalid-email"}
응답
HTTP/1.1 422 Unprocessable Entity
Content-Length: 21
Content-Type: text/plain
Invalid data provided.
이 경우 클라이언트가 "username" 필드를 비웠고, "email" 필드에 유효하지 않은 이메일 주소를 포함하여 "/create-user" 리소스에 POST 요청을 보냈다. 서버는 해당 데이터가 처리할 수 없다고 판단하여 "Invalid data provided" 메시지를 포함한 "Unprocessable Entity" 응답을 반환한다.
423 Locked(잠김):
HTTP 상태 코드 423은 클라이언트가 요청한 리소스가 현재 다른 클라이언트나 프로세스에 의해 잠겨있어 접근할 수 없음을 나타낸다. 주로 동시에 같은 리소스를 수정하려는 요청이 충돌하거나, 리소스의 일시적인 잠금 상태를 표시하기 위해 사용된다.
요청 1
PUT /resource HTTP/1.1
Host: example.com
Content-Length: ...
Content-Type: application/json
{"key": "value1"}
요청2
HTTP/1.1 423 Locked
Content-Length: 15
Content-Type: text/plain
Resource locked.
응답
HTTP/1.1 423 Locked
Content-Length: 15
Content-Type: text/plain
Resource locked.
이 경우 클라이언트 1과 클라이언트 2가 동시에 같은 리소스인 "/resource"를 수정하려 시도한다. 클라이언트 1의 요청이 먼저 처리되었고 리소스가 잠겨있는 동안 클라이언트 2의 요청이 들어왔다. 서버는 리소스가 잠겨있다는 "Resource locked" 메시지를 포함한 "Locked" 응답을 반환한다.
424 Failed Dependency(의존 관계로 실패):
HTTP 상태 코드 424는 서버가 리소스 간의 종속성이 실패하여 요청을 수행할 수 없을 때 반환된다. 예를 들어, 클라이언트가 다른 리소스에 의존하는데 해당 리소스가 변경되었거나 삭제되어 종속성이 실패하는 경우에 사용된다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 424 Failed Dependency
Content-Length: 21
Content-Type: text/plain
Dependency failed.
이 경우 클라이언트가 "/resource" 리소스에 대한 GET 요청을 보냈지만, 해당 리소스의 종속성이 실패하여 요청을 수행할 수 없다고 판단하여 "Dependency failed" 메시지를 포함한 "Failed Dependency" 응답을 반환한다.
426 Upgraded Required(업그레이드 필요함):
HTTP 상태 코드 426은 클라이언트가 더 높은 프로토콜 버전을 요구할 때 사용된다. 일반적으로 클라이언트가 오래된 버전의 프로토콜을 사용하고 있어 업그레이드가 필요한 경우에 이 코드가 반환된다.
요청
GET /resource HTTP/1.0
Host: example.com
Upgrade: HTTP/2.0
응답
HTTP/1.1 426 Upgrade Required
Upgrade: HTTP/2.0
Content-Length: 24
Content-Type: text/plain
Upgrade required to HTTP/2.
이 경우 클라이언트가 "HTTP/1.0" 프로토콜을 사용하여 "/resource" 리소스에 대한 GET 요청을 보냈는데, 서버가 "HTTP/2.0" 프로토콜을 요구하므로 "Upgrade required to HTTP/2" 메시지를 포함한 "Upgrade Required" 응답을 반환한다.
428 Precondition Required(사전 조건 필요함):
HTTP 상태 코드 428은 서버가 클라이언트에게 요청을 수행하기 전에 사전 조건을 만족시키라고 요구할 때 사용된다. 클라이언트는 Conditional Request와 함께 이 상태 코드를 받게 되고, 요청을 보내기 전에 특정 조건을 충족시켜야 한다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 428 Precondition Required
Content-Length: 26
Content-Type: text/plain
Precondition required here.
이 경우 클라이언트가 Conditional Request를 사용하지 않고 "/resource" 리소스에 대한 GET 요청을 보냈지만, 서버가 사전 조건을 요구하므로 "Precondition required here" 메시지를 포함한 "Precondition Required" 응답을 반환한다. 클라이언트는 조건을 충족시킨 후 다시 요청을 보내야 한다.
429 Too Many Requests(너무 많은 요청):
HTTP 상태 코드 429는 클라이언트가 너무 많은 요청을 보냈거나, 서버에서 정의한 제한을 초과했을 때 반환된다. 서버에서는 이 코드를 사용하여 클라이언트의 과도한 요청을 제한하고, 서버의 성능을 유지하기 위해 사용한다.
요청
GET /api/data HTTP/1.1
Host: example.com
응답
HTTP/1.1 429 Too Many Requests
Content-Length: 21
Content-Type: text/plain
Too many requests.
이 경우 클라이언트가 "/api/data" 리소스에 대한 GET 요청을 너무 자주 보내어 서버의 제한을 초과했다. 서버는 "Too many requests" 메시지를 포함한 "Too Many Requests" 응답을 반환하여 클라이언트에게 요청 제한을 알린다.
431 Request Header Fields Too Large(너무 큰 헤더):
HTTP 상태 코드 431은 클라이언트가 보낸 요청 헤더가 서버에서 처리할 수 있는 최대 크기를 초과했을 때 반환된다. 이는 대부분의 웹 서버에서 허용하는 헤더 크기를 넘어설 때 발생할 수 있다.
요청
GET /resource HTTP/1.1
Host: example.com
User-Agent: ... (매우 긴 헤더)
응답
HTTP/1.1 431 Request Header Fields Too Large
Content-Length: 23
Content-Type: text/plain
Request headers too large.
이 경우 클라이언트가 "/resource" 리소스에 대한 GET 요청을 보냈는데, "User-Agent" 헤더 등이 매우 길어서 서버에서 처리할 수 있는 최대 크기를 초과했다. 서버는 "Request headers too large" 메시지를 포함한 "Request Header Fields Too Large" 응답을 반환한다.
444 Connection Closed Without Response(응답 없이 연결 닫음):
HTTP 상태 코드 444는 서버가 클라이언트 요청에 아무런 응답을 제공하지 않았음을 나타낸다. 이 코드는 주로 Nginx 웹 서버에서 사용되며, 클라이언트 요청에 대한 연결이 강제로 종료된 경우에 반환된다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
이 경우 Nginx 웹 서버가 클라이언트 요청에 대해 아무 응답도 제공하지 않았다면, 브라우저 등에서는 연결이 강제로 종료되고 "No Response"와 같은 오류 메시지가 표시될 수 있다.
451 Unavailable For Legal Reasons(법적 사유로 불가):
HTTP 상태 코드 451은 서버가 접근이 금지된 리소스를 요청한 경우를 나타낸다. 주로 저작권 침해 등의 법적 이유로 인해 리소스에 접근이 차단되었을 때 사용된다. "451"은 레이온드 번호로서, 레이온드는 저작권 관련 법률의 차단 요청에 대한 근거를 제시하는 법안에서 가져온 것이다.
요청
GET /blocked-resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 451 Unavailable For Legal Reasons
Content-Length: 29
Content-Type: text/plain
This resource is blocked by law.
이 경우 클라이언트가 "/blocked-resource" 리소스에 대한 GET 요청을 보냈으나, 해당 리소스가 법적 이유로 인해 접근이 금지되었다. 서버는 "This resource is blocked by law" 메시지를 포함한 "Unavailable For Legal Reasons" 응답을 반환한다.
5XX: Server Error(서버 에러)
상태 코드 | 상태 텍스트 | 한국어 뜻 | 서버 측면에서의 의미 |
5XX | Server Error | 서버 에러 | 클라이언트의 요청은 유효한데 서버가 처리에 실패하였다. |
500 | Internal Server Error | 내부 서버 오류 | 서버에 에러가 발생하였다. 클라이언트가 모르는 5xx 계열의 응답 코드가 반환된 경우에도 클라이언트는 500과 동일하게 처리하도록 규정하고 있다. |
501 | Not Implemented | 구현되지 않음 | 요청한 URI의 메소드에 대해 서버가 구현하고 있지 않다. |
502 | Bad Gateway | 불량 게이트웨이 | 게이트웨이 또는 프록시 역할을 하는 서버가 그 뒷단의 서버로부터 잘못된 응답을 받았다. |
503 | Service Unavailable | 서비스 제공불가 | 현재 서버에서 서비스를 제공할 수 없다. 보통은 서버의 과부하나 서비스 점검 등 일시적인 상태이다. |
504 | Gateway Timeout | 게이트웨이 시간초과 | 게이트웨이 또는 프록시 역할을 하는 서버가 그 뒷단의 서버로부터 응답을 기다리다 타임아웃이 발생하였다. |
505 | HTTP Version Not Supported | HTTP 버전 미지원 |
클라이언트가 요청에 사용한 HTTP 버전을 서버가 지원하지 않는다. |
506 | Variant Also Negotiates | HTTP 상태 코드 506은 서버가 리소스에 대한 다양한 버전을 협상 중이지만, 클라이언트가 선택할 수 없는 상황에서 반환된다. | |
507 | Insufficient Storage | 용량 부족 | (WebDAV) 서버에 저장 공간 부족으로 처리에 실패하였다. |
512 ~ 599 | Unassigned | 현재 할당되지 않은 상태 코드이다. |
500 Internal Server Error(내부 서버 오류):
HTTP 상태 코드 500은 서버에서 내부적인 오류가 발생하여 클라이언트의 요청을 처리할 수 없을 때 반환된다. 이는 서버 측에서 예상치 못한 문제가 발생하여 요청을 처리하지 못하는 상황을 나타낸다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 500 Internal Server Error
Content-Length: 27
Content-Type: text/plain
Internal server error occurred.
이 경우 클라이언트가 "/resource" 리소스에 대한 GET 요청을 보냈으나, 서버 내부에서 예기치 못한 오류가 발생하여 요청을 처리하지 못했다. 서버는 "Internal server error occurred" 메시지를 포함한 "Internal Server Error" 응답을 반환한다.
501 Not Implemented(구현되지 않음):
HTTP 상태 코드 501은 서버가 클라이언트의 요청에 대한 기능을 지원하지 않을 때 반환된다. 클라이언트가 요청한 메소드(메서드)나 기능이 서버에서 구현되지 않은 경우에 사용된다.
요청
DELETE /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 501 Not Implemented
Content-Length: 21
Content-Type: text/plain
Method not implemented.
이 경우 클라이언트가 "/resource" 리소스에 대한 DELETE 요청을 보냈으나, 서버에서 DELETE 메소드를 지원하지 않아 "Method not implemented" 메시지를 포함한 "Not Implemented" 응답을 반환한다.
502 Bad Gateway(불량 게이트웨이):
HTTP 상태 코드 502는 서버가 게이트웨이나 프록시 역할을 하고 있는데, 이 서버가 요청을 수행하려는 중에 다른 서버로부터 잘못된 응답을 받았을 때 반환된다. 주로 프록시 서버나 로드 밸런서를 통해 백엔드 서버로 요청을 중계할 때, 백엔드 서버에서 오류 응답을 반환하는 경우에 사용된다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 502 Bad Gateway
Content-Length: 16
Content-Type: text/plain
Bad gateway error.
이 경우 클라이언트가 "/resource" 리소스에 대한 GET 요청을 보냈으며, 프록시 서버가 백엔드 서버로 요청을 중계하는 중에 백엔드 서버에서 잘못된 응답을 반환하여 "Bad gateway error" 메시지를 포함한 "Bad Gateway" 응답을 반환한다.
503 Service Unavailable(서비스 제공불가):
HTTP 상태 코드 503은 서버가 현재 서비스를 제공할 수 없을 때 반환된다. 이는 서버가 과부하 상태거나 점검 등의 이유로 요청을 처리할 수 없을 때 사용된다. 이 상태 코드는 일시적인 서비스 중단을 나타낸다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 503 Service Unavailable
Content-Length: 23
Content-Type: text/plain
Service temporarily unavailable.
이 경우 클라이언트가 "/resource" 리소스에 대한 GET 요청을 보냈으나, 서버가 현재 서비스를 제공할 수 없는 상태이다. 서버는 "Service temporarily unavailable" 메시지를 포함한 "Service Unavailable" 응답을 반환하여 클라이언트에게 일시적인 서비스 중단을 알린다.
504 Gateway Timeout(게이트웨이 시간초과):
HTTP 상태 코드 504는 서버가 게이트웨이나 프록시 역할을 하는데, 이 서버가 다른 서버로 요청을 중계하려고 시도했으나, 백엔드 서버로부터 제때 응답을 받지 못하여 시간 초과(Time-out)가 발생한 경우 반환된다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 504 Gateway Timeout
Content-Length: 19
Content-Type: text/plain
Gateway timeout error.
이 경우 클라이언트가 "/resource" 리소스에 대한 GET 요청을 보냈으며, 프록시 서버가 백엔드 서버로 요청을 중계하려다가 백엔드 서버로부터 응답을 받지 못해 시간 초과가 발생했다. 서버는 "Gateway timeout error" 메시지를 포함한 "Gateway Timeout" 응답을 반환한다.
505 HTTP Version Not Supported(HTTP 버전 미지원):
HTTP 상태 코드 505는 클라이언트가 요청한 HTTP 프로토콜 버전을 서버가 지원하지 않을 때 반환된다. 클라이언트가 사용하는 프로토콜 버전과 서버가 지원하는 프로토콜 버전 간의 불일치 때문에 발생할 수 있다.
요청
GET /resource HTTP/2.0
Host: example.com
응답
HTTP/1.1 505 HTTP Version Not Supported
Content-Length: 26
Content-Type: text/plain
HTTP version not supported.
이 경우 클라이언트가 "/resource" 리소스에 대한 GET 요청을 보냈는데, 서버가 요청한 "HTTP/2.0" 프로토콜 버전을 지원하지 않아 "HTTP version not supported" 메시지를 포함한 "HTTP Version Not Supported" 응답을 반환한다.
506Variant Also Negotiates(변형도 협상):
HTTP 상태 코드 506은 서버가 리소스에 대한 다양한 버전을 협상 중이지만, 클라이언트가 선택할 수 없는 상황에서 반환된다. 주로 서버가 클라이언트에게 여러 가지 표현 중에서 하나를 선택하도록 하려는 경우에 사용된다.
요청
GET /resource HTTP/1.1
Host: example.com
응답
HTTP/1.1 506 Variant Also Negotiates
Content-Length: 32
Content-Type: text/plain
Variant also negotiates error.
이 경우 클라이언트가 "/resource" 리소스에 대한 GET 요청을 보냈으며, 서버가 다양한 버전 중에서 하나를 선택하도록 하려고 하지만 클라이언트가 선택할 수 없는 상황이다. 서버는 "Variant also negotiates error" 메시지를 포함한 "Variant Also Negotiates" 응답을 반환한다.
507 Insufficient Storage(용량 부족):
HTTP 상태 코드 507은 서버가 요청을 처리하기 위한 충분한 저장 공간이 부족한 경우에 반환된다. 주로 클라이언트가 서버에 대량의 데이터 업로드를 시도했을 때 저장 공간이 부족한 경우에 사용된다.
요청
PUT /resource HTTP/1.1
Host: example.com
Content-Length: ...
[Large request body]
응답
HTTP/1.1 507 Insufficient Storage
Content-Length: 24
Content-Type: text/plain
Insufficient storage error.
이 경우 클라이언트가 "/resource" 리소스에 대한 대량의 데이터를 담은 PUT 요청을 보냈으나, 서버에 충분한 저장 공간이 없어 "Insufficient storage error" 메시지를 포함한 "Insufficient Storage" 응답을 반환한다.
