HTTP 상태 코드 — 의미와 예시가 담긴 전체 목록

100부터 511까지 모든 공식 HTTP 상태 코드와 nginx, Cloudflare, AWS 코드, 그리고 각각 언제 쓰는지 정리했습니다.

코드 91개

1xx 정보

100Continue

중간 응답: 서버가 요청 헤더를 받았으니 클라이언트는 본문을 계속 보내면 됩니다.

사용하는 경우

클라이언트가 큰 본문을 업로드하기 전에 "Expect: 100-continue"를 보내면 서버가 자동으로 보냅니다. 거절될 요청에 대역폭을 낭비하지 않게 해 줍니다.

사용하지 말아야 할 경우

애플리케이션 코드에서 최종 상태로 보내지 마세요. 요청에 대한 응답이 아니라 실제 응답 전의 한 단계일 뿐입니다.

캐싱

해당 없음

정의 문서

RFC 9110 §15.2.1

예시
PUT /upload HTTP/1.1
Content-Length: 104857600
Expect: 100-continue

HTTP/1.1 100 Continue
101Switching Protocols

서버가 Upgrade 헤더에 지정된 프로토콜로 연결을 전환하는 데 동의합니다.

사용하는 경우

WebSocket 연결(Upgrade: websocket)의 핸드셰이크 응답, 그리고 과거에는 HTTP/1.1에서 h2c로의 업그레이드에 쓰였습니다.

사용하지 말아야 할 경우

HTTP/2와 HTTP/3에서는 쓰지 않습니다. HTTP/2 위의 WebSocket은 대신 확장 CONNECT 메서드(RFC 8441)를 사용합니다.

캐싱

해당 없음

정의 문서

RFC 9110 §15.2.2

예시
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
102Processing사용 중단

서버가 오래 걸리는 WebDAV 요청을 아직 처리 중이니 시간 초과로 끊지 말라고 알리는 중간 응답입니다.

WebDAV. RFC 4918에서 WebDAV에서 제거되었지만 IANA 레지스트리에는 남아 있습니다.

사용하는 경우

깊은 COPY나 MOVE 같은 느린 재귀 작업을 처리하는 레거시 WebDAV 서버에서만 씁니다.

사용하지 말아야 할 경우

새 API에서는 오래 걸리는 작업에 대해 상태 확인 URL과 함께 202 Accepted를 반환하세요.

캐싱

해당 없음

정의 문서

RFC 2518 §10.1

예시
HTTP/1.1 102 Processing
103Early Hints

Link 헤더를 담은 중간 응답으로, 서버가 최종 응답을 준비하는 동안 브라우저가 미리 로드하거나 미리 연결할 수 있게 합니다.

사용하는 경우

HTML 생성에 시간이 걸리고(서버 사이드 렌더링, 데이터베이스 쿼리) 페이지에 필요한 CSS, 글꼴, 오리진을 알고 있을 때 씁니다. Chromium 계열 브라우저와 Firefox는 103 응답의 preload와 preconnect 힌트를 처리하고, Safari는 preconnect를 처리합니다.

사용하지 말아야 할 경우

Set-Cookie처럼 최종 응답에만 적용되어야 하는 헤더는 넣지 마세요. 브라우저는 103의 헤더 대부분을 무시합니다.

캐싱

해당 없음

정의 문서

RFC 8297

예시
HTTP/1.1 103 Early Hints
Link: </style.css>; rel=preload; as=style
Link: <https://cdn.example.com>; rel=preconnect

HTTP/1.1 200 OK
Content-Type: text/html
104Upload Resumption Supported

클라이언트가 시작한 업로드를 나중에 어디서 재개할 수 있는지 알려 주는 중간 응답입니다.

IETF 재개 가능 업로드 초안을 위한 임시 IANA 등록이며, 아직 최종 RFC가 아닙니다.

사용하는 경우

실험적: 재개 가능 업로드 초안을 구현한 서버가 업로드 리소스를 가리키는 Location 헤더와 함께 보냅니다.

사용하지 말아야 할 경우

초안이 RFC로 발행되기 전에는 일반 용도로 쓰지 마세요. 대부분의 클라이언트와 프록시는 이 코드를 모릅니다.

캐싱

해당 없음

정의 문서

draft-ietf-httpbis-resumable-upload

예시
HTTP/1.1 104 Upload Resumption Supported
Upload-Draft-Interop-Version: 6
Location: https://example.com/upload/b530ce8ff

2xx 성공

200OK기본적으로 캐시 가능

요청이 성공했습니다. 본문 내용은 메서드에 따라 다릅니다. GET이면 리소스, POST면 작업 결과입니다.

사용하는 경우

GET의 일반적인 성공 응답이며, POST, PUT, PATCH, DELETE에서 결과를 설명하는 본문을 반환할 때도 씁니다.

사용하지 말아야 할 경우

본문에 오류 메시지를 담아 200을 반환하지 마세요("소프트 오류"). 클라이언트, 모니터링, 캐시, 검색 엔진은 JSON이 아니라 상태 코드를 봅니다.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.3.1

예시
HTTP/1.1 200 OK
Content-Type: application/json

{"id": 42, "name": "Ada"}
201Created

요청이 성공해 새 리소스가 하나 이상 생성되었습니다.

사용하는 경우

무언가를 생성한 POST(또는 새 URL에 대한 PUT) 이후에 씁니다. 새 리소스를 가리키는 Location 헤더를 포함하고, 본문에는 보통 그 리소스를 설명합니다.

사용하지 말아야 할 경우

기존 레코드 수정처럼 새로 생성된 것이 없을 때는 쓰지 마세요(200 또는 204 사용).

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.3.2

예시
HTTP/1.1 201 Created
Location: /users/42
Content-Type: application/json

{"id": 42}
202Accepted

요청이 처리를 위해 접수되었지만 처리가 끝나지 않았으며 아직 실패할 수도 있습니다.

사용하는 경우

대기열이나 비동기 작업: 동영상 인코딩, 보고서 생성, 대량 가져오기. 클라이언트가 작업 상태를 확인할 수 있는 링크를 반환하세요.

사용하지 말아야 할 경우

동기 작업의 "성공"을 뜻하는 용도로 쓰지 마세요. 이 코드는 결과에 대해 아무것도 보장하지 않습니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.3.3

예시
HTTP/1.1 202 Accepted
Location: /jobs/7f3a
Content-Type: application/json

{"status": "queued"}
203Non-Authoritative Information기본적으로 캐시 가능

성공했지만, 변환 프록시가 오리진 서버의 200 응답을 수정했습니다.

사용하는 경우

이미지를 압축하거나 HTML을 다시 쓰는 프록시처럼 콘텐츠를 바꾸는 중간 서버만 씁니다. 오리진의 원래 응답 그대로가 아님을 클라이언트에 알립니다.

사용하지 말아야 할 경우

오리진 서버와 API는 보내지 않아야 합니다.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.3.4

예시
HTTP/1.1 203 Non-Authoritative Information
Content-Type: image/webp
204No Content기본적으로 캐시 가능

성공했으며, 의도적으로 본문이 없습니다.

사용하는 경우

성공한 DELETE, 수정된 리소스를 반환하지 않는 PUT이나 PATCH, 폼 자동 저장, CORS 사전 요청(preflight) 응답.

사용하지 말아야 할 경우

절대 본문을 포함하지 마세요. 클라이언트는 읽지 않으며, HTTP/1.1에서는 남은 본문이 같은 연결의 다음 응답을 망가뜨립니다. 반환할 내용이 있으면 200을 쓰세요.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.3.5

예시
HTTP/1.1 204 No Content
205Reset Content

성공했으며, 클라이언트는 제출한 폼을 비우는 등 문서 보기를 초기화해야 합니다.

사용하는 경우

사용자가 폼을 제출하고 곧바로 다음 레코드를 입력하는 데이터 입력 화면.

사용하지 말아야 할 경우

브라우저는 초기화 동작을 구현하지 않으므로 실제로는 204처럼 동작합니다. 본문을 포함하면 안 됩니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.3.6

예시
HTTP/1.1 205 Reset Content
206Partial Content기본적으로 캐시 가능

서버가 클라이언트가 Range 헤더로 요청한 바이트 범위만 반환합니다.

사용하는 경우

동영상과 오디오 탐색, 이어받기 다운로드, 파일을 여러 조각으로 병렬로 받는 다운로드 관리자. Content-Range를 포함하세요.

사용하지 말아야 할 경우

요청에 처리할 Range 헤더가 없으면 보내지 마세요. Range를 무시한다면 전체 본문과 함께 200을 보내세요.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.3.7

예시
GET /video.mp4 HTTP/1.1
Range: bytes=0-1023

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/146515
Content-Length: 1024
207Multi-Status

본문(XML)에 여러 리소스 각각의 상태가 따로 담겨 있습니다.

WebDAV

사용하는 경우

PROPFIND처럼 여러 리소스에 작용하는 WebDAV 작업. 일부 JSON API는 일괄 처리 엔드포인트에 빌려 씁니다.

사용하지 말아야 할 경우

일괄 처리 API에서는 많은 팀이 항목별 결과를 담은 200을 선호합니다. 일반 클라이언트는 207을 단순 성공으로 취급하기 때문입니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 4918 §11.1

예시
HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
208Already Reported

207 응답 안에서 이미 앞에 나열된 리소스라 반복하지 않는다는 뜻으로 씁니다(바인딩으로 인한 루프 방지).

WebDAV

사용하는 경우

바인딩(RFC 5842)을 지원하는 WebDAV 서버.

사용하지 말아야 할 경우

WebDAV 밖에서 최상위 응답으로는 의미가 없습니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 5842 §7.1

예시
<D:status>HTTP/1.1 208 Already Reported</D:status>
226IM Used

서버가 GET 요청에 전체 리소스 대신 현재 리소스에 적용한 델타(인스턴스 조작)로 응답했습니다.

사용하는 경우

HTTP 델타 인코딩(A-IM / IM 헤더). 실제로는 거의 쓰이지 않습니다.

사용하지 말아야 할 경우

브라우저가 지원하지 않습니다. 일반 API에서는 쓰지 마세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 3229 §10.4.1

예시
HTTP/1.1 226 IM Used
IM: vcdiff
ETag: "v2"

3xx 리디렉션

300Multiple Choices기본적으로 캐시 가능

리소스에 여러 표현이 있어 클라이언트(또는 사용자)가 하나를 골라야 합니다.

사용하는 경우

드묾: 에이전트 주도 콘텐츠 협상. 예를 들어 문서를 여러 언어나 형식으로 제공하며 각각의 링크를 보여 줄 때.

사용하지 말아야 할 경우

브라우저는 자동으로 고르지 않습니다. 언어나 형식 선택에는 서버 주도 협상이나 링크가 있는 일반 페이지가 더 낫습니다.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.4.1

예시
HTTP/1.1 300 Multiple Choices
Link: </doc.en.html>; rel=alternate; hreflang=en
Link: </doc.fr.html>; rel=alternate; hreflang=fr
301Moved Permanently기본적으로 캐시 가능

리소스에 Location 헤더로 지정된 새 영구 URL이 있습니다.

사용하는 경우

도메인 이전, HTTP에서 HTTPS로 전환, 슬러그 변경, 중복 URL 통합. 검색 엔진은 순위 신호를 새 URL로 넘겨줍니다.

사용하지 말아야 할 경우

브라우저는 301을 따라갈 때 POST를 GET으로 바꿀 수 있습니다. 메서드를 유지해야 한다면(이전한 API 엔드포인트) 308을 쓰세요. 브라우저가 301을 적극적으로 캐시하므로 배포 전에 테스트하세요.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.4.2

예시
HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/new-page
302Found

리소스가 일시적으로 다른 URL에 있습니다. 앞으로도 원래 URL을 계속 쓰세요.

사용하는 경우

임시 리디렉션: 로그인 리디렉션, A/B 테스트, 점검 페이지, 지역이나 언어별 리디렉션.

사용하지 말아야 할 경우

브라우저는 302를 따라갈 때 POST를 GET으로 바꿉니다(RFC가 허용하는 과거의 동작). POST 이후 "결과를 보러 가라"는 뜻이면 303을, 메서드를 유지해야 하면 307을 쓰세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.4.3

예시
HTTP/1.1 302 Found
Location: /login?next=%2Faccount
303See Other

클라이언트를 다른 URL로 리디렉션하며, 그 URL은 GET으로 가져와야 합니다.

사용하는 경우

Post/Redirect/Get 패턴: 폼 POST 후 결과 페이지로 303을 보내면 새로고침해도 폼이 다시 제출되지 않습니다.

사용하지 말아야 할 경우

옮겨진 콘텐츠에는 쓰지 마세요. 원래 URL이 이전되었다는 의미가 없습니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.4.4

예시
HTTP/1.1 303 See Other
Location: /orders/1234
304Not Modified

조건부 GET 또는 HEAD(If-None-Match 또는 If-Modified-Since)에 대한 응답으로, 클라이언트의 캐시 사본이 아직 유효하다는 뜻입니다.

캐시 재검증: 자체는 저장되지 않지만, 클라이언트가 이미 가진 캐시된 응답을 갱신합니다.

사용하는 경우

ETag나 Last-Modified 날짜가 일치할 때 서버와 CDN이 자동으로 보내며, 바뀌지 않은 본문의 전송을 아낍니다.

사용하지 말아야 할 경우

절대 본문을 보내지 마세요. 조건부가 아닌 요청에는 보내지 마세요. 클라이언트에 재사용할 것이 없습니다.

캐싱

해당 없음

정의 문서

RFC 9110 §15.4.5

예시
GET /app.js HTTP/1.1
If-None-Match: "33a64df5"

HTTP/1.1 304 Not Modified
ETag: "33a64df5"
Cache-Control: max-age=3600
305Use Proxy사용 중단

사용 중단됨. 과거에는 Location에 지정된 프록시를 통해 요청을 다시 보내라고 알렸습니다.

사용하는 경우

없음. 보안상의 이유로 사용 중단되었으며 브라우저는 무시합니다.

사용하지 말아야 할 경우

보내지 마세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.4.6

예시
HTTP/1.1 305 Use Proxy
306(Unused)사용 중단

예약됨. 초안에서 "Switch Proxy"로 쓰였으며 더 이상 사용되지 않습니다.

사용하는 경우

없음.

사용하지 말아야 할 경우

보내지 마세요.

캐싱

해당 없음

정의 문서

RFC 9110 §15.4.7

307Temporary Redirect

임시 리디렉션이며, 클라이언트는 같은 메서드와 본문으로 요청을 다시 보내야 합니다.

사용하는 경우

POST, PUT, DELETE 요청을 일시적으로 리디렉션할 때(점검으로 API 엔드포인트를 옮긴 경우). HSTS가 HTTPS를 강제할 때 브라우저가 내부적으로 307을 표시하기도 합니다.

사용하지 말아야 할 경우

영구 이전에는 308을 쓰세요. "결과를 GET으로 가져가라"는 뜻이면 303을 쓰세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.4.8

예시
HTTP/1.1 307 Temporary Redirect
Location: https://api2.example.com/v1/orders
308Permanent Redirect기본적으로 캐시 가능

영구 리디렉션이며, 클라이언트는 같은 메서드와 본문으로 요청을 다시 보내야 합니다.

사용하는 경우

POST나 PUT을 받는 API 엔드포인트를 영구 이전할 때. 검색 엔진은 301처럼 취급합니다. Next.js와 Vercel은 영구 리디렉션에 기본적으로 308을 씁니다.

사용하지 말아야 할 경우

아주 오래된 클라이언트(Windows 7 이하의 Internet Explorer)는 이해하지 못합니다. 단순한 페이지 이전이라면 301도 똑같이 좋습니다.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.4.9

예시
HTTP/1.1 308 Permanent Redirect
Location: https://example.com/api/v2/upload

4xx 클라이언트 오류

400Bad Request

잘못된 구문, 잘못된 프레이밍, 잘못된 매개변수 같은 클라이언트 오류 때문에 서버가 요청을 처리하지 않습니다.

사용하는 경우

파싱할 수 없는 JSON, 필수 매개변수 누락, 잘못된 타입의 값. 본문에 문제를 설명하세요(RFC 9457 problem+json이 좋은 형식입니다).

사용하지 말아야 할 경우

형식은 올바르지만 비즈니스 규칙에 어긋나는 입력에는 많은 API가 422를 씁니다. 인증 문제에는 401이나 403을 쓰세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.1

예시
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{"title": "Invalid JSON", "detail": "Unexpected token } at position 41"}
401Unauthorized

요청에 유효한 인증 자격 증명이 없습니다. 이름(Unauthorized)과 달리 "인증되지 않음"을 뜻합니다.

사용하는 경우

토큰 없음, 만료된 토큰, 틀린 비밀번호. 응답에는 인증 방법을 설명하는 WWW-Authenticate 헤더가 반드시 있어야 합니다.

사용하지 말아야 할 경우

사용자가 로그인했지만 권한이 없다면 403을 쓰세요. WWW-Authenticate 없이 401을 보내지 마세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.2

예시
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="api", error="invalid_token"
402Payment Required

향후 사용을 위해 예약됨. 표준 의미가 없습니다.

사용하는 경우

일부 API는 "할당량 소진, 요금제를 업그레이드하세요"나 결제 실패에 씁니다(Stripe는 카드가 거절된 요청에 402를 반환합니다).

사용하지 말아야 할 경우

클라이언트가 이해한다고 기대하지 마세요. 본문에 문제를 설명하세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.3

예시
HTTP/1.1 402 Payment Required
Content-Type: application/json

{"error": "card_declined"}
403Forbidden

서버가 요청을 이해했고 누구인지도 알지만(또는 상관하지 않지만) 처리를 거부합니다.

사용하는 경우

인증된 사용자에게 권한이 없음, IP 차단, 디렉터리 목록 비활성화, WAF 규칙 발동. 다시 인증해도 소용없습니다.

사용하지 말아야 할 경우

자격 증명이 없거나 잘못되었다면 401을 쓰세요. 리소스의 존재를 알리는 것 자체가 정보 유출이라면 대신 404를 반환하세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.4

예시
HTTP/1.1 403 Forbidden
Content-Type: application/json

{"error": "You do not have access to this project"}
404Not Found기본적으로 캐시 가능

서버에 해당 URL의 현재 표현이 없거나, 존재 여부를 알려 주지 않습니다.

사용하는 경우

알 수 없는 URL, 삭제 이력을 관리하지 않는 삭제된 레코드, 권한 없는 사용자에게 리소스 숨기기.

사용하지 말아야 할 경우

리소스가 있었다가 영구히 사라졌다면 410이 이를 명시합니다. "찾을 수 없음"이라고 적힌 200 페이지(소프트 404)를 반환하지 마세요.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.5.5

예시
HTTP/1.1 404 Not Found
Content-Type: text/html
405Method Not Allowed기본적으로 캐시 가능

URL은 존재하지만 이 HTTP 메서드를 지원하지 않습니다.

사용하는 경우

읽기 전용 리소스에 대한 DELETE, GET 전용 페이지에 대한 POST. 응답에는 지원하는 메서드를 나열한 Allow 헤더가 반드시 있어야 합니다.

사용하지 말아야 할 경우

권한 문제(403)나 서버가 아예 구현하지 않은 메서드(501)에는 쓰지 마세요.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.5.6

예시
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD
406Not Acceptable

서버가 요청의 Accept, Accept-Language, Accept-Encoding 헤더에 맞는 응답을 만들 수 없습니다.

사용하는 경우

JSON만 지원하는 API가 대체 형식 없이 "Accept: application/xml"을 받은 경우.

사용하지 말아야 할 경우

대부분의 서버는 맞지 않는 Accept 헤더를 무시하고 기본 형식을 보내는데, 보통 이쪽이 더 친절합니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.7

예시
HTTP/1.1 406 Not Acceptable
Content-Type: application/json

{"supported": ["application/json"]}
407Proxy Authentication Required

401과 비슷하지만, 클라이언트가 중간의 프록시에 인증해야 합니다.

사용하는 경우

포워드 프록시(사내 프록시)가 Proxy-Authenticate 헤더와 함께 보냅니다.

사용하지 말아야 할 경우

오리진 서버는 절대 보내지 않아야 합니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.8

예시
HTTP/1.1 407 Proxy Authentication Required
Proxy-Authenticate: Basic realm="corp-proxy"
408Request Timeout

서버가 기다리기로 한 시간 안에 완전한 요청을 받지 못해 연결을 닫습니다.

사용하는 경우

유휴 keep-alive 연결이나 느린 업로드에서 서버가 보냅니다. 클라이언트는 새 연결에서 요청을 다시 시도할 수 있습니다.

사용하지 말아야 할 경우

백엔드 처리가 느린 경우에는 쓰지 마세요. 그건 게이트웨이의 504이거나 그냥 느린 응답입니다. "Connection: close"와 함께 보내세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.9

예시
HTTP/1.1 408 Request Timeout
Connection: close
409Conflict

요청이 리소스의 현재 상태와 충돌합니다.

사용하는 경우

이미 존재하는 이메일로 사용자 생성, 다른 사람이 바꾼 레코드 편집(버전 불일치), 비어 있지 않은 폴더 삭제.

사용하지 말아야 할 경우

If-Match / If-Unmodified-Since 조건이 실패한 경우에는 412를 쓰세요. 유효성 검사 오류에는 400이나 422를 쓰세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.10

예시
HTTP/1.1 409 Conflict
Content-Type: application/json

{"error": "Email already registered"}
410Gone기본적으로 캐시 가능

리소스가 여기에 있었지만 영구히 사라졌으며, 옮겨 간 주소도 없습니다.

사용하는 경우

단종된 제품, 만료된 프로모션, 삭제된 계정, 폐기된 API 버전. Google은 404와 410을 거의 같게 취급하지만, 410이 색인에서 조금 더 빨리 빠질 수 있습니다.

사용하지 말아야 할 경우

콘텐츠가 옮겨졌다면 대신 301로 리디렉션하세요. 영구적인지 확실하지 않다면 404를 쓰세요.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.5.11

예시
HTTP/1.1 410 Gone
411Length Required

서버가 이 요청에 Content-Length 헤더를 요구합니다.

사용하는 경우

청크 업로드를 거부하고 본문 크기를 미리 알아야 하는 서버.

사용하지 말아야 할 경우

애플리케이션에서 필요한 경우는 드뭅니다. 보통 웹 서버가 직접 보냅니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.12

예시
HTTP/1.1 411 Length Required
412Precondition Failed

요청 헤더의 조건(If-Match, If-Unmodified-Since, 쓰기 요청의 If-None-Match)이 거짓으로 평가되었습니다.

사용하는 경우

낙관적 동시성 제어: 클라이언트가 오래된 ETag로 If-Match를 보냈다는 것은 다른 사람이 먼저 리소스를 바꿨다는 뜻입니다.

사용하지 말아야 할 경우

조건부 헤더와 무관한 비즈니스 규칙 실패에는 쓰지 마세요(409 또는 422).

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.13

예시
PUT /docs/7 HTTP/1.1
If-Match: "v3"

HTTP/1.1 412 Precondition Failed
ETag: "v4"
413Content Too Large

요청 본문이 서버가 처리하려는 크기보다 큽니다. RFC 9110 이전에는 "Payload Too Large"라고 불렸습니다.

사용하는 경우

제한을 넘는 업로드(nginx client_max_body_size, 10MB API 상한). 제한이 일시적이라면 Retry-After를 추가하세요.

사용하지 말아야 할 경우

URL이 너무 길면 414, 헤더가 너무 크면 431을 쓰세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.14

예시
HTTP/1.1 413 Content Too Large
Connection: close
414URI Too Long기본적으로 캐시 가능

요청 대상(URL)이 서버가 해석할 수 있는 길이보다 깁니다.

사용하는 경우

거대한 쿼리 문자열. POST여야 할 GET 폼이거나, 매개변수를 계속 덧붙이는 리디렉션 루프인 경우가 많습니다.

사용하지 말아야 할 경우

제한을 끝없이 올리기보다 큰 입력을 요청 본문(POST)으로 옮기세요.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.5.15

예시
HTTP/1.1 414 URI Too Long
415Unsupported Media Type

본문 형식(Content-Type 또는 Content-Encoding)을 지원하지 않아 서버가 요청을 거부합니다.

사용하는 경우

JSON을 받는 엔드포인트가 폼 데이터나 XML을 받았거나 Content-Type 헤더가 없는 경우. 지원 형식을 알리려면 Accept-Post나 Accept-Patch를 포함하세요.

사용하지 말아야 할 경우

형식은 맞지만 내용이 잘못된 본문에는 쓰지 마세요(400 또는 422).

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.16

예시
HTTP/1.1 415 Unsupported Media Type
Accept-Post: application/json
416Range Not Satisfiable

Range 헤더의 어떤 바이트 범위도 리소스와 겹치지 않습니다. 예를 들어 파일 끝을 넘어선 바이트를 요청한 경우입니다.

사용하는 경우

파일이 줄어들었거나 클라이언트가 끝을 넘어 요청한 이어받기 다운로드. Content-Range: bytes */<length>를 포함하세요.

사용하지 말아야 할 경우

서버는 잘못된 Range를 그냥 무시하고 전체 본문과 함께 200을 반환해도 되며, 이것도 허용됩니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.17

예시
HTTP/1.1 416 Range Not Satisfiable
Content-Range: bytes */47022
417Expectation Failed

서버가 요청의 Expect 헤더에 있는 요구 사항을 충족할 수 없습니다.

사용하는 경우

클라이언트가 이를 지원하지 않는 서버나 프록시에 "Expect: 100-continue"를 보냈거나, 알 수 없는 기대값을 보낸 경우.

사용하지 말아야 할 경우

이 코드를 받은 클라이언트는 Expect 헤더 없이 다시 시도해야 합니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.18

예시
HTTP/1.1 417 Expectation Failed
418(Unused)

418이 “I’m a teapot” 농담 코드로 널리 쓰였기 때문에 RFC 9110에서 예약했으며, HTTP에서 정의된 의미는 없습니다.

예약됨. 1998년 만우절 RFC 2324(HTCPCP)의 “I’m a teapot(나는 찻주전자입니다)”으로 유명합니다.

사용하는 경우

이스터 에그로만 씁니다. 일부 서비스는 거부하고 싶은 요청에 유머러스하게 답할 때 씁니다.

사용하지 말아야 할 경우

실제 오류에는 쓰지 마세요. 의미를 부여할 수 없으며 클라이언트는 어떻게 처리할지 모릅니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.19

예시
HTTP/1.1 418 I'm a teapot
419Page Expired비공식 · Laravel

CSRF 토큰이 없거나 만료되었을 때 Laravel이 반환합니다. 보통 폼이 있는 페이지에서 세션이 만료된 뒤에 발생합니다.

사용하는 경우

Laravel의 CSRF 미들웨어가 보냅니다. 페이지를 새로고침하거나, 폼에 @csrf를 넣거나, AJAX 요청에 X-CSRF-TOKEN 헤더를 보내 해결하세요.

사용하지 말아야 할 경우

표준 코드가 아닙니다. Laravel이 아닌 API에서는 보내지 마세요.

캐싱

해당 없음

정의 문서

Laravel (IANA 레지스트리에 없음)

예시
HTTP/1.1 419 unknown status
420Enhance Your Calm비공식 · Twitter(레거시)

예전 Twitter API의 속도 제한 응답으로, 표준 429로 대체되었습니다.

사용하는 경우

새로 쓸 일은 없습니다. 오래된 클라이언트 라이브러리에서는 아직 볼 수 있습니다. Spring은 한때 420 "Method Failure"를 정의했지만 지금은 사용 중단되었습니다.

사용하지 말아야 할 경우

속도 제한에는 429를 쓰세요.

캐싱

해당 없음

정의 문서

Twitter API v1 (IANA 레지스트리에 없음)

예시
HTTP/1.1 420 Enhance Your Calm
421Misdirected Request

요청이 해당 호스트와 스킴에 대한 응답을 만들 수 없는 서버에 도달했습니다.

사용하는 경우

HTTP/2 연결 병합이 잘못된 경우: 브라우저가 같은 인증서에 포함된 다른 호스트 이름에 연결을 재사용했지만 서버가 그 호스트를 제공하지 않습니다. 클라이언트는 새 연결에서 다시 시도해야 합니다.

사용하지 말아야 할 경우

단일 서버의 일반적인 알 수 없는 호스트 이름에는 쓰지 마세요. 그런 경우는 보통 404이거나 기본 가상 호스트가 처리합니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.20

예시
HTTP/2 421
422Unprocessable Content

요청의 형식이 올바르고 지원되는 형식이지만 내용이 유효성 검사에 실패했습니다. RFC 4918에서는 "Unprocessable Entity"라고 불렀습니다.

사용하는 경우

폼과 API의 유효성 검사 오류: 이메일 형식이 아닌 이메일, 시작일보다 앞선 종료일. Rails, Laravel, FastAPI가 기본으로 씁니다.

사용하지 말아야 할 경우

구문이 잘못된 경우(파싱할 수 없는 JSON)에는 400을 쓰세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.21

예시
HTTP/1.1 422 Unprocessable Content
Content-Type: application/json

{"errors": {"email": ["is invalid"]}}
423Locked

리소스가 잠겨 있어 요청으로 변경할 수 없습니다.

WebDAV

사용하는 경우

WebDAV LOCK 의미. 일부 API는 다른 사람이 편집 중인 레코드나 로그인 실패로 잠긴 계정에 씁니다.

사용하지 말아야 할 경우

WebDAV 밖에서는 일반 클라이언트가 409를 더 잘 이해합니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 4918 §11.3

예시
HTTP/1.1 423 Locked
424Failed Dependency

의존하던 다른 작업이 실패해서 이 작업도 실패했습니다.

WebDAV

사용하는 경우

WebDAV PROPPATCH나 일괄 요청에서 앞선 항목이 실패해 시도조차 하지 않은 항목.

사용하지 말아야 할 경우

업스트림 서비스 장애에는 쓰지 마세요. 그런 경우는 502나 503입니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 4918 §11.4

예시
HTTP/1.1 424 Failed Dependency
425Too Early

재전송(replay)될 위험이 있으므로 서버가 TLS 1.3 조기 데이터(0-RTT)로 보낸 요청을 처리하지 않습니다.

사용하는 경우

0-RTT를 받지만 조기 데이터의 비멱등 요청(POST)은 거부하는 CDN과 서버. 클라이언트는 핸드셰이크가 끝난 뒤 다시 시도합니다.

사용하지 말아야 할 경우

일반적인 "나중에 다시 시도" 코드가 아닙니다. 그런 경우에는 Retry-After와 함께 503을 쓰세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 8470 §5.2

예시
HTTP/1.1 425 Too Early
426Upgrade Required

서버가 현재 프로토콜로는 요청을 거부하지만, Upgrade 헤더에 지정된 프로토콜로 업그레이드하면 받아들입니다.

사용하는 경우

TLS나 더 새로운 프로토콜을 요구할 때, 또는 WebSocket 엔드포인트에 일반 HTTP 요청이 온 경우. Upgrade 헤더를 반드시 포함해야 합니다.

사용하지 말아야 할 경우

웹사이트의 HTTP에서 HTTPS로의 전환에는 301 또는 308 리디렉션과 HSTS를 함께 쓰는 것이 일반적입니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.5.22

예시
HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.3, HTTP/1.1
Connection: Upgrade
428Precondition Required

업데이트 손실을 막기 위해 서버가 조건부 요청(If-Match 등)을 요구합니다.

사용하는 경우

PUT, PATCH, DELETE 전에 클라이언트가 마지막으로 본 ETag를 If-Match로 보내도록 요구하는 API.

사용하지 말아야 할 경우

전제 조건을 보냈는데 실패했다면 412를 쓰세요. 428은 아예 보내지 않은 경우입니다.

캐싱

캐시에 저장하면 안 됨

정의 문서

RFC 6585 §3

예시
HTTP/1.1 428 Precondition Required
Content-Type: application/json

{"error": "Send If-Match with the current ETag"}
429Too Many Requests

클라이언트가 정해진 시간 동안 너무 많은 요청을 보냈습니다(속도 제한).

사용하는 경우

API 속도 제한, 로그인 시도 제한, 스크래핑 방지. 제대로 동작하는 클라이언트가 언제 다시 와야 할지 알 수 있도록 Retry-After를 포함하세요. RateLimit 헤더도 도움이 됩니다.

사용하지 말아야 할 경우

모든 사용자에게 서버가 과부하 상태라면 503을 쓰세요. Googlebot은 429를 503처럼 취급해 크롤링 속도를 늦춥니다.

캐싱

캐시에 저장하면 안 됨

정의 문서

RFC 6585 §4

예시
HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/json

{"error": "Rate limit exceeded: 100 requests per minute"}
431Request Header Fields Too Large

헤더가 개별적으로든 전체로든 서버가 처리하기에 너무 큽니다.

사용하는 경우

보통 한 도메인에 쌓인 지나치게 큰 쿠키나 거대한 Authorization 토큰 때문입니다. 사용자는 쿠키를 지우면 해결되는 경우가 많습니다.

사용하지 말아야 할 경우

URL이 길면 414, 본문이 크면 413을 쓰세요.

캐싱

캐시에 저장하면 안 됨

정의 문서

RFC 6585 §5

예시
HTTP/1.1 431 Request Header Fields Too Large
440Login Time-out비공식 · Microsoft IIS / Exchange

클라이언트의 세션이 만료되어 다시 로그인해야 합니다(Outlook Web Access 및 기타 IIS 앱).

사용하는 경우

Exchange/OWA 환경에서 볼 수 있습니다.

사용하지 말아야 할 경우

직접 만든 앱의 세션 만료에는 401을 쓰세요.

캐싱

해당 없음

정의 문서

Microsoft IIS (IANA 레지스트리에 없음)

예시
HTTP/1.1 440 Login Time-out
444No Response비공식 · nginx

nginx 내부 코드: "return 444;"는 아무 응답도 보내지 않고 연결을 닫습니다.

사용하는 경우

스캐너의 요청, 기본 server 블록에서 알 수 없는 Host 헤더의 요청, 악성 클라이언트를 차단할 때. nginx 로그에 나타나며 클라이언트는 빈 응답을 받습니다.

사용하지 말아야 할 경우

클라이언트는 444를 받지 않으므로 클라이언트 코드에서 처리할 대상이 아닙니다.

캐싱

해당 없음

정의 문서

nginx (IANA 레지스트리에 없음)

예시
server {
  listen 80 default_server;
  return 444;
}
449Retry With비공식 · Microsoft

Microsoft 확장: 클라이언트가 특정 작업을 수행한 뒤 요청을 다시 시도해야 합니다.

사용하는 경우

일부 Microsoft 서비스에서 볼 수 있습니다(Exchange ActiveSync, Azure Cosmos DB는 재시도 가능한 쓰기 충돌에 449를 씁니다).

사용하지 말아야 할 경우

표준이 아닙니다. 직접 만든 API에서는 Retry-After와 함께 409나 503을 쓰세요.

캐싱

해당 없음

정의 문서

Microsoft IIS (IANA 레지스트리에 없음)

예시
HTTP/1.1 449 Retry With
450Blocked by Windows Parental Controls비공식 · Microsoft

Windows 자녀 보호 기능이 페이지 접근을 차단했습니다.

사용하는 경우

자녀 보호 기능이 켜진 Windows 시스템에서 생성됩니다.

사용하지 말아야 할 경우

서버에서 보내지 마세요.

캐싱

해당 없음

정의 문서

Microsoft (IANA 레지스트리에 없음)

예시
HTTP/1.1 450 Blocked by Windows Parental Controls
451Unavailable For Legal Reasons기본적으로 캐시 가능

법원 명령, 정부 검열, 법적 사유의 지역 제한 등 법적 요구 때문에 접근이 거부되었습니다.

사용하는 경우

특정 관할권에서 차단된 콘텐츠(제재, GDPR 관련 지역 차단, 게시 중단 명령). rel="blocked-by"가 있는 Link 헤더로 차단 주체를 밝힐 수 있습니다.

사용하지 말아야 할 경우

일반적인 권한 거부(403)나 스스로 삭제하기로 한 콘텐츠(410)에는 쓰지 마세요.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 7725 §3

예시
HTTP/1.1 451 Unavailable For Legal Reasons
Link: <https://authority.example/>; rel="blocked-by"
460Client closed connection (AWS ELB)비공식 · AWS Application Load Balancer

유휴 시간 제한이 지나기 전에 클라이언트가 연결을 닫았을 때 AWS ALB가 기록합니다.

사용하는 경우

ALB 액세스 로그에서 볼 수 있습니다. 보통 클라이언트의 시간 제한이 대상의 처리 시간보다 짧은 경우입니다.

사용하지 말아야 할 경우

클라이언트에 전송되지 않습니다.

캐싱

해당 없음

정의 문서

AWS Elastic Load Balancing (IANA 레지스트리에 없음)

예시
elb_status_code=460
463Too many IPs in X-Forwarded-For (AWS ELB)비공식 · AWS Application Load Balancer

ALB가 IP 주소가 30개를 넘는 X-Forwarded-For 헤더를 받았습니다.

사용하는 경우

보통 주소를 계속 덧붙이는 프록시 루프입니다.

사용하지 말아야 할 경우

애플리케이션용이 아닙니다.

캐싱

해당 없음

정의 문서

AWS Elastic Load Balancing (IANA 레지스트리에 없음)

예시
HTTP/1.1 463
494Request Header Too Large비공식 · nginx

large_client_header_buffers를 넘는 헤더에 대한 nginx 내부 코드이며, 클라이언트는 400을 받습니다.

사용하는 경우

nginx 로그와 error_page 설정에 나타납니다.

사용하지 말아야 할 경우

표준 코드는 431입니다.

캐싱

해당 없음

정의 문서

nginx (IANA 레지스트리에 없음)

예시
error_page 494 /header-too-large.html;
495SSL Certificate Error비공식 · nginx

nginx 내부: 클라이언트가 잘못된 클라이언트 인증서를 제시했습니다(상호 TLS). 클라이언트에는 400으로 전송됩니다.

사용하는 경우

mTLS 실패용 사용자 지정 오류 페이지.

사용하지 말아야 할 경우

실제로 전송되는 상태 코드가 아닙니다.

캐싱

해당 없음

정의 문서

nginx (IANA 레지스트리에 없음)

예시
error_page 495 /bad-client-cert.html;
496SSL Certificate Required비공식 · nginx

nginx 내부: 클라이언트 인증서가 필요하지만 제공되지 않았습니다. 클라이언트에는 400으로 전송됩니다.

사용하는 경우

ssl_verify_client가 켜져 있을 때의 사용자 지정 오류 페이지.

사용하지 말아야 할 경우

실제로 전송되는 상태 코드가 아닙니다.

캐싱

해당 없음

정의 문서

nginx (IANA 레지스트리에 없음)

예시
error_page 496 /client-cert-required.html;
497HTTP Request Sent to HTTPS Port비공식 · nginx

nginx 내부: TLS를 기대하는 포트에 일반 HTTP 요청이 도착했습니다. 클라이언트에는 400으로 전송됩니다.

사용하는 경우

"error_page 497 =301 https://$host$request_uri;"로 이런 요청을 HTTPS로 리디렉션하는 방법이 흔히 쓰입니다.

사용하지 말아야 할 경우

실제로 전송되는 상태 코드가 아닙니다.

캐싱

해당 없음

정의 문서

nginx (IANA 레지스트리에 없음)

예시
error_page 497 =301 https://$host:$server_port$request_uri;
498Invalid Token비공식 · Esri ArcGIS Server

토큰이 만료되었거나 그 밖의 이유로 유효하지 않을 때 ArcGIS가 반환합니다.

사용하는 경우

ArcGIS 서비스를 호출할 때만 해당됩니다.

사용하지 말아야 할 경우

직접 만든 API의 잘못된 토큰에는 401을 쓰세요.

캐싱

해당 없음

정의 문서

Esri ArcGIS (IANA 레지스트리에 없음)

예시
HTTP/1.1 498 Invalid Token
499Client Closed Request비공식 · nginx

nginx가 응답을 보내기 전에 클라이언트가 연결을 닫으면 nginx가 499를 기록합니다.

사용하는 경우

액세스 로그에서 볼 수 있습니다: 사용자가 페이지를 떠남, 모바일 클라이언트의 시간 초과, nginx 앞단 로드 밸런서의 더 짧은 시간 제한. 한 엔드포인트에 499가 많다면 보통 그 엔드포인트가 너무 느리다는 뜻입니다.

사용하지 말아야 할 경우

클라이언트는 이 코드를 받지 않습니다. Esri도 499를 "Token Required"로 씁니다.

캐싱

해당 없음

정의 문서

nginx (IANA 레지스트리에 없음)

예시
203.0.113.9 - - [16/Oct/2026:10:12:01 +0000] "GET /report HTTP/1.1" 499 0

5xx 서버 오류

500Internal Server Error

서버가 예상하지 못한 상황을 만나 요청을 처리하지 못했습니다.

사용하는 경우

처리되지 않은 예외와 버그. 더 구체적인 5xx가 해당하지 않을 때 쓰는 일반적인 대체 코드입니다.

사용하지 말아야 할 경우

클라이언트 실수(4xx)에는 쓰지 마세요. 운영 환경에서 본문에 스택 트레이스를 노출하지 말고 로그로 남기세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.6.1

예시
HTTP/1.1 500 Internal Server Error
Content-Type: application/problem+json

{"title": "Internal Server Error", "traceId": "4bf92f35"}
501Not Implemented기본적으로 캐시 가능

서버가 필요한 기능을 지원하지 않습니다. 보통 전혀 인식하지 못하는 HTTP 메서드입니다.

사용하는 경우

알 수 없는 메서드의 요청(예: 일반 웹 서버에 WebDAV 메서드)이나 서버가 의도적으로 아직 만들지 않은 기능.

사용하지 말아야 할 경우

알려진 메서드지만 이 URL에서 허용되지 않는다면 405를 쓰세요.

캐싱

기본적으로 캐시 가능(휴리스틱 캐시 가능)

정의 문서

RFC 9110 §15.6.2

예시
HTTP/1.1 501 Not Implemented
502Bad Gateway

게이트웨이나 프록시가 업스트림 서버로부터 잘못된 응답을 받았습니다.

사용하는 경우

앱 서버가 중단되었거나, 연결을 닫았거나, 엉터리 응답을 반환했을 때 리버스 프록시와 로드 밸런서(nginx, Cloudflare, AWS ALB)가 보냅니다.

사용하지 말아야 할 경우

다른 서비스를 호출했다가 실패한 API 게이트웨이를 제외하면 애플리케이션 코드에서 보낼 일은 드뭅니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.6.3

예시
HTTP/1.1 502 Bad Gateway
Server: nginx
503Service Unavailable

서버가 과부하나 점검으로 지금은 요청을 처리할 수 없습니다. 일시적인 상태로 간주됩니다.

사용하는 경우

계획된 점검, 부하 차단, 의존 서비스 장애. Retry-After를 추가하세요. 200 점검 페이지나 404와 달리, 짧은 503 기간 동안에는 검색 엔진이 페이지를 색인에 유지합니다.

사용하지 말아야 할 경우

사이트를 며칠씩 503 상태로 두지 마세요. Google은 계속 503을 반환하는 URL을 결국 색인에서 제외합니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.6.4

예시
HTTP/1.1 503 Service Unavailable
Retry-After: 3600
504Gateway Timeout

게이트웨이나 프록시가 업스트림 서버로부터 제시간에 응답을 받지 못했습니다.

사용하는 경우

애플리케이션이 프록시 시간 제한보다 오래 걸릴 때 프록시와 로드 밸런서가 보냅니다(nginx proxy_read_timeout 기본값은 60초).

사용하지 말아야 할 경우

오래 걸리는 작업이라면 시간 제한만 늘리지 말고, 202를 반환하고 비동기로 처리하세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.6.5

예시
HTTP/1.1 504 Gateway Timeout
Server: awselb/2.0
505HTTP Version Not Supported

서버가 요청에 사용된 HTTP 메이저 버전을 지원하지 않습니다.

사용하는 경우

서버가 처리할 수 없는 프로토콜 버전을 받은 경우.

사용하지 말아야 할 경우

거의 볼 일이 없습니다. 클라이언트는 시행착오가 아니라 ALPN과 Alt-Svc로 HTTP/2와 HTTP/3를 협상합니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 9110 §15.6.6

예시
HTTP/1.1 505 HTTP Version Not Supported
506Variant Also Negotiates

서버 설정 오류: 선택된 변형 자체가 다시 협상하도록 설정되어 루프가 생깁니다.

투명 콘텐츠 협상(실험적)

사용하는 경우

RFC 2295 투명 콘텐츠 협상을 구현한 서버에서만 씁니다.

사용하지 말아야 할 경우

애플리케이션 오류에는 쓰지 마세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 2295 §8.1

예시
HTTP/1.1 506 Variant Also Negotiates
507Insufficient Storage

서버가 요청을 완료하는 데 필요한 내용을 저장할 수 없습니다.

WebDAV

사용하는 경우

디스크나 사용자 할당량이 가득 찼을 때의 WebDAV 또는 파일 저장소 API.

사용하지 말아야 할 경우

업로드 하나가 크기 제한을 넘은 경우에는 413이 더 명확합니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 4918 §11.5

예시
HTTP/1.1 507 Insufficient Storage
508Loop Detected

무한 루프를 발견해 서버가 작업을 중단했습니다(Depth: infinity인 WebDAV 바인딩).

WebDAV

사용하는 경우

WebDAV 서버. CloudLinux 기반 공유 호스팅도 계정이 한도에 도달하면 비표준으로 508 "Resource Limit Is Reached"를 보냅니다.

사용하지 말아야 할 경우

리디렉션 루프에는 쓰지 마세요. 그건 브라우저가 직접 보고하는 클라이언트 측 오류입니다.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 5842 §7.2

예시
HTTP/1.1 508 Loop Detected
509Bandwidth Limit Exceeded비공식 · Apache bw_mod / cPanel

호스팅 계정이 대역폭 허용량을 초과했습니다.

사용하는 경우

공유 호스팅 제어판.

사용하지 말아야 할 경우

직접 만든 시스템에서는 503이나 429를 쓰세요.

캐싱

해당 없음

정의 문서

Apache / cPanel (IANA 레지스트리에 없음)

예시
HTTP/1.1 509 Bandwidth Limit Exceeded
510Not Extended사용 중단

요청이 HTTP 확장 프레임워크에 따른 리소스 접근 정책을 충족하지 않았습니다.

IANA 레지스트리에서 폐기됨으로 표시: RFC 2774가 Historic으로 이동했습니다.

사용하는 경우

현재는 없음. 이 확장 프레임워크는 널리 구현된 적이 없습니다.

사용하지 말아야 할 경우

보내지 마세요.

캐싱

Cache-Control 또는 Expires를 명시한 경우에만 캐시 가능

정의 문서

RFC 2774 §7

예시
HTTP/1.1 510 Not Extended
511Network Authentication Required

네트워크에 접속하려면 클라이언트가 인증해야 합니다(캡티브 포털).

사용하는 경우

사용자가 로그인하거나 약관에 동의할 때까지 트래픽을 가로채는 호텔, 공항, 카페의 Wi-Fi 포털.

사용하지 말아야 할 경우

오리진 서버는 절대 보내면 안 됩니다. 트래픽을 가로채는 네트워크 프록시 전용입니다.

캐싱

캐시에 저장하면 안 됨

정의 문서

RFC 6585 §6

예시
HTTP/1.1 511 Network Authentication Required
Content-Type: text/html

<meta http-equiv="refresh" content="0; url=https://login.example.net/">
520Web Server Returned an Unknown Error비공식 · Cloudflare

오리진이 Cloudflare에 비어 있거나, 알 수 없거나, 예상치 못한 응답을 반환했습니다.

사용하는 경우

오리진 로그를 확인하세요: 충돌, 연결 재설정, Cloudflare 한도를 넘는 헤더, 빈 응답.

사용하지 말아야 할 경우

Cloudflare만 보냅니다.

캐싱

해당 없음

정의 문서

Cloudflare (IANA 레지스트리에 없음)

예시
HTTP/2 520
server: cloudflare
521Web Server Is Down비공식 · Cloudflare

Cloudflare가 오리진에 연결하지 못했습니다: 연결이 거부되었습니다.

사용하는 경우

오리진 웹 서버가 중지되었거나 방화벽이 Cloudflare의 IP 범위를 차단하고 있습니다.

사용하지 말아야 할 경우

Cloudflare만 보냅니다.

캐싱

해당 없음

정의 문서

Cloudflare (IANA 레지스트리에 없음)

예시
HTTP/2 521
server: cloudflare
522Connection Timed Out비공식 · Cloudflare

Cloudflare가 오리진과 TCP 연결을 맺는 중에 시간이 초과되었습니다.

사용하는 경우

오리진 과부하, 방화벽의 패킷 차단, DNS의 잘못된 오리진 IP.

사용하지 말아야 할 경우

Cloudflare만 보냅니다.

캐싱

해당 없음

정의 문서

Cloudflare (IANA 레지스트리에 없음)

예시
HTTP/2 522
server: cloudflare
523Origin Is Unreachable비공식 · Cloudflare

Cloudflare가 오리진에 전혀 도달할 수 없습니다. 보통 라우팅 문제나 잘못된 DNS 레코드 때문입니다.

사용하는 경우

DNS A/AAAA 레코드가 올바르고 접근 가능한 IP를 가리키는지 확인하세요.

사용하지 말아야 할 경우

Cloudflare만 보냅니다.

캐싱

해당 없음

정의 문서

Cloudflare (IANA 레지스트리에 없음)

예시
HTTP/2 523
server: cloudflare
524A Timeout Occurred비공식 · Cloudflare

Cloudflare가 오리진에 연결했지만, 오리진이 시간 제한(기본 100초) 안에 HTTP 응답을 보내지 않았습니다.

사용하는 경우

오래 걸리는 요청: 작업을 백그라운드 작업으로 옮겨 폴링하거나 진행 상황을 스트리밍하세요.

사용하지 말아야 할 경우

Cloudflare만 보냅니다.

캐싱

해당 없음

정의 문서

Cloudflare (IANA 레지스트리에 없음)

예시
HTTP/2 524
server: cloudflare
525SSL Handshake Failed비공식 · Cloudflare

Cloudflare와 오리진 사이의 TLS 핸드셰이크가 실패했습니다.

사용하는 경우

SSL 모드가 Full 또는 Full (strict)인데 오리진이 443에서 수신하지 않거나, 인증서가 없거나, 공통 암호 스위트가 없거나, SNI가 설정되지 않은 경우.

사용하지 말아야 할 경우

Cloudflare만 보냅니다.

캐싱

해당 없음

정의 문서

Cloudflare (IANA 레지스트리에 없음)

예시
HTTP/2 525
server: cloudflare
526Invalid SSL Certificate비공식 · Cloudflare

Full (strict) 모드에서 Cloudflare가 오리진의 인증서를 검증하지 못했습니다: 만료, 자체 서명, 또는 잘못된 호스트 이름.

사용하는 경우

오리진에 유효한 인증서나 Cloudflare Origin CA 인증서를 설치하세요.

사용하지 말아야 할 경우

Cloudflare만 보냅니다.

캐싱

해당 없음

정의 문서

Cloudflare (IANA 레지스트리에 없음)

예시
HTTP/2 526
server: cloudflare
527Railgun Error비공식 · Cloudflare(폐지됨)사용 중단

Cloudflare와 오리진의 Railgun 리스너 사이의 연결 문제입니다. Cloudflare는 Railgun 서비스를 종료했습니다.

사용하는 경우

과거 기록용일 뿐입니다.

사용하지 말아야 할 경우

Cloudflare만 보냈습니다.

캐싱

해당 없음

정의 문서

Cloudflare (IANA 레지스트리에 없음)

예시
HTTP/1.1 527 Railgun Error
530Origin DNS / 1xxx error비공식 · Cloudflare

Cloudflare 1xxx 오류 페이지(예: 1016 Origin DNS error)와 함께 반환됩니다. 페이지에 표시된 1xxx 코드가 실제 원인입니다.

사용하는 경우

페이지에 표시된 1xxx 오류 번호를 찾아보세요.

사용하지 말아야 할 경우

CDN과 호스팅 업체만 보냅니다.

캐싱

해당 없음

정의 문서

Cloudflare (IANA 레지스트리에 없음)

예시
HTTP/2 530
server: cloudflare
561Unauthorized (AWS ELB)비공식 · AWS Application Load Balancer

ALB의 내장 인증(OIDC 또는 Cognito)이 ID 공급자와의 처리에서 실패했습니다.

사용하는 경우

ALB 리스너 규칙의 IdP 설정을 확인하세요.

사용하지 말아야 할 경우

애플리케이션용이 아닙니다.

캐싱

해당 없음

정의 문서

AWS Elastic Load Balancing (IANA 레지스트리에 없음)

예시
HTTP/1.1 561
598Network Read Timeout Error비공식 · 일부 HTTP 프록시

일부 프록시가 프록시 뒤쪽의 읽기 시간 초과를 알릴 때 씁니다.

사용하는 경우

드묾. 특정 프록시 제품에서 볼 수 있습니다.

사용하지 말아야 할 경우

504를 쓰세요.

캐싱

해당 없음

정의 문서

Informal convention (IANA 레지스트리에 없음)

예시
HTTP/1.1 598
599Network Connect Timeout Error비공식 · 일부 HTTP 프록시와 클라이언트

일부 프록시와 클라이언트 라이브러리(예: Tornado의 HTTP 클라이언트)가 연결 시간 초과에 씁니다.

사용하는 경우

드묾.

사용하지 말아야 할 경우

프록시에서는 504를 쓰세요.

캐싱

해당 없음

정의 문서

Informal convention (IANA 레지스트리에 없음)

예시
HTTP/1.1 599

브라우저에서 실행되는 정적 참고 자료입니다. 검색어는 어디로도 전송되지 않습니다. 모든 무료 도구 보기.

문제를 발견하셨거나 개선할 점이 있나요? 모든 메시지를 읽고 빠르게 고칩니다.

이 HTTP 상태 코드 목록은 100 Continue부터 511 Network Authentication Required까지 IANA 레지스트리의 모든 코드를 다루며, 의미, 써야 할 때와 쓰지 말아야 할 때, 캐시에 저장할 수 있는지, 정의된 RFC 섹션을 함께 보여 줍니다. 번호, 4xx 같은 클래스, ‘redirect’나 ‘rate limit’ 같은 단어를 입력해 필터링하고, #404나 #503 같은 앵커로 원하는 코드에 바로 링크하세요.

공식 항목은 RFC 7231을 대체하고 몇몇 코드의 이름을 바꾼 RFC 9110(2022)을 따릅니다. 413은 이제 Content Too Large, 422는 Unprocessable Content입니다. nginx 499나 Cloudflare 522처럼 로그에는 보이지만 레지스트리에는 없는 코드도 비공식으로 표시하고 이를 보내는 시스템과 함께 실었습니다. 이 도구는 참고 자료이지 모니터링 도구가 아닙니다. URL을 가져오거나 실제 사이트가 어떤 상태를 반환하는지 확인하지 않습니다.

사용 방법

  1. 검색창에 코드(503), 클래스(4xx), 키워드(timeout, redirect, cache)를 입력하세요. 입력하는 대로 결과가 필터링됩니다.
  2. 클래스 버튼으로 1xx, 2xx, 3xx, 4xx, 5xx 코드만 보고, “비공식 코드 포함”을 해제하면 벤더별 코드를 숨길 수 있습니다.
  3. 코드를 클릭해 펼치세요: 의미, 써야 할 때, 쓰지 말아야 할 때, 캐시 동작, 정의된 RFC, 응답 예시.
  4. “이 코드 링크 복사”로 /tools/http-status-codes#429 같은 직접 링크를 공유하세요.

자주 묻는 질문

401과 403의 차이는 무엇인가요?

401 Unauthorized는 요청에 유효한 자격 증명이 없다는 뜻입니다. 클라이언트가 로그인하지 않았거나 토큰이 만료된 경우입니다. 서버는 인증 방법을 알려 주는 WWW-Authenticate 헤더를 보내야 합니다. 403 Forbidden은 서버가 클라이언트가 누구인지 알거나 알 필요가 없는데도 거부한다는 뜻이라, 다시 로그인해도 소용없습니다. 간단히 말해 401은 “누구세요?”, 403은 “누군지 알지만 안 됩니다”입니다.

영구 리디렉션에는 301과 308 중 무엇을 써야 하나요?

둘 다 영구 리디렉션이며 Google에서 순위 신호를 넘겨줍니다. 차이는 메서드입니다. 301을 따라갈 때 브라우저는 POST를 GET으로 바꿀 수 있지만, 308은 클라이언트가 같은 메서드와 본문으로 다시 요청해야 합니다. 일반적인 페이지 이전에는 301이면 충분하고, POST나 PUT을 받는 API 엔드포인트에는 308을 쓰세요. 임시 리디렉션도 같은 짝이 있습니다. 302는 메서드를 바꿀 수 있고 307은 바꾸면 안 됩니다.

nginx 로그의 499는 무슨 뜻인가요?

499 Client Closed Request는 nginx 전용 코드입니다. nginx가 응답을 보내기 전에 클라이언트가 연결을 끊었을 때 기록되므로, 클라이언트는 실제로 499를 받지 않습니다. 가끔 보이는 499는 사용자가 페이지를 떠난 것이고, 한 엔드포인트에 많이 쌓인다면 대개 응답이 너무 느려서 클라이언트나 상위 로드 밸런서가 먼저 타임아웃되는 것입니다.

502, 503, 504의 차이는 무엇인가요?

셋 다 다른 서버 앞에 있는 서버가 보내는 코드입니다. 502 Bad Gateway는 프록시가 업스트림 앱에서 잘못된 응답을 받았거나 연결이 끊겼다는 뜻입니다. 503 Service Unavailable은 서버가 일시적으로 요청을 처리할 수 없다는 뜻으로, 보통 과부하나 점검 때문이며 Retry-After를 포함해야 합니다. 504 Gateway Timeout은 프록시가 업스트림의 응답을 기다리다 포기했다는 뜻입니다.

418 I'm a teapot은 진짜 상태 코드인가요?

RFC 2324(1998)의 만우절 농담으로 시작했지만 충분히 많은 소프트웨어에 구현되어, 이제 RFC 9110은 418을 ‘(Unused)’로 등재해 실제 의미가 부여되지 않도록 예약해 두었습니다. 실제 문제에 대해 보낼 오류는 아니지만, 이스터 에그로 남겨 두는 것은 괜찮습니다.

기본적으로 캐시할 수 있는 상태 코드는 무엇인가요?

RFC 9110은 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, 501을 휴리스틱하게 캐시 가능한 코드로 지정합니다. 즉 Cache-Control이나 Expires가 없어도 캐시가 저장할 수 있습니다. RFC 7725는 451을 추가합니다. 302와 307을 포함한 다른 코드는 응답에 명시적인 신선도 정보가 있을 때만 캐시되며, RFC 6585에 따르면 428, 429, 431, 511은 절대 저장하면 안 됩니다.

다섯 가지 클래스 한눈에 보기

• 1xx 정보: 최종 응답 전의 중간 응답. 직접 처리할 일은 드물며, 실제로 중요한 것은 101(WebSocket 업그레이드)과 103(Early Hints)입니다.

• 2xx 성공: 요청이 성공했습니다. 일반 응답은 200, 무언가를 생성했으면 201(Location 헤더와 함께), 일부러 본문이 없으면 204.

• 3xx 리디렉션: 클라이언트가 다른 곳을 봐야 합니다. 영구 이전은 301/308, 임시 이전은 302/307, 폼 POST 후에는 303, 캐시된 사본이 여전히 유효하면 304.

• 4xx 클라이언트 오류: 요청이 잘못되어 그대로 반복하면 다시 실패합니다. 400 형식 오류, 401 인증 안 됨, 403 권한 없음, 404 찾을 수 없음, 409 충돌, 422 검증 실패, 429 요청 한도 초과.

• 5xx 서버 오류: 요청은 문제없을 수 있지만 서버가 실패했습니다. 500은 버그, 502/504는 프록시와 업스트림 사이의 실패, 503은 일시적인 서비스 불가.

API에서 알맞은 코드 고르기

범용 클라이언트가 대응할 수 있는 가장 구체적인 코드를 반환하고, 자세한 내용은 본문에 넣으세요. 재시도하는 HTTP 클라이언트, CDN, 모니터링 시스템은 JSON을 읽지 않아도 429와 503의 의미를 알지만, {"error": true}가 담긴 200은 해석할 수 없습니다. RFC 9457(Problem Details)은 오류 본문의 표준 JSON 형태를 제공합니다.

대부분의 JSON API에 쓸 수 있는 실용적인 매핑은 다음과 같습니다. 파싱할 수 없는 입력은 400, 형식은 맞지만 검증에 실패한 입력은 422, 토큰이 없거나 만료되면 401, 사용자에게 권한이 없으면 403, 알 수 없는 ID는 404(사용자가 볼 수 없는 리소스를 숨길 때도), 중복과 버전 충돌은 409, If-Match ETag가 오래되었으면 412, 요청 한도는 Retry-After와 함께 429, 계획된 점검은 Retry-After와 함께 503입니다.

새 번호를 만들어 내지 마세요. 클라이언트는 알 수 없는 코드를 해당 클래스의 x00으로 처리하므로(알 수 없는 4xx는 400처럼 처리), 직접 만든 461은 400과 명확한 메시지에 비해 얻는 것이 없습니다.

상태 코드와 SEO

검색 엔진은 상태 코드를 문자 그대로 읽습니다. 301이나 308은 이전 URL의 신호를 새 URL로 넘기고, 302나 307은 Google에 이전 URL을 계속 색인하라고 알립니다. 404와 410은 둘 다 시간이 지나면 페이지를 색인에서 제거합니다. ‘찾을 수 없음’이라고 표시하는 200 페이지는 소프트 404이며, Google이 이를 감지해 Search Console에 보고합니다. 점검 중에는 Retry-After와 함께 짧은 기간 503을 반환하면 순위가 유지되지만, ‘곧 돌아오겠습니다’라는 200 페이지는 검색 결과에서 기존 콘텐츠를 대체할 수 있습니다. Googlebot은 429, 500, 503을 보면 크롤링 속도도 늦춥니다.

관련 무료 도구

  • User Agent 파서 — 내 사용자 에이전트와 클라이언트 힌트를 확인하거나, 아무 UA 문자열이나 브라우저, 엔진, OS, 기기, CPU로 분석하세요. CSV를 지원하는 일괄 모드도 있습니다.
  • JSON 포매터 — JSON을 보기 좋게 정렬하고, 압축하고, 검증하세요. 파싱 오류는 줄과 열 위치까지 알려 줍니다. 브라우저에서 실행, 업로드 없음.
  • Docker Run ⇄ Compose — docker run 명령을 docker-compose.yml 서비스로, Compose 서비스를 다시 docker run으로 바꾸세요.
  • 정규식 테스터 — 실시간 매치 강조, 캡처 그룹, 치환 미리보기로 정규 표현식을 샘플 텍스트에 테스트하세요. 무료, 브라우저에서 실행.