HTTP 상태 코드 참조
모든 공식 HTTP 상태 코드를 검색할 수 있는 참조표입니다 — RFC 9110 및 관련 RFC에 따라 각 코드가 무엇을 의미하고 서버가 언제 이를 보내야 하는지 정리했습니다.
조회수 198회
일치하는 상태 코드가 없습니다.
상태 코드가 첫 번째 숫자로 그룹화되는 이유
모든 HTTP 상태 코드는 세 자리 숫자이며, 첫 번째 숫자만으로도 클라이언트는 나머지를 읽기 전에 응답의 전반적인 범주를 알 수 있습니다 — 이는 HTTP의 가장 초기 명세부터 이어져 온 설계 선택으로, 오늘날에는 더 오래된 RFC 7230-7235 시리즈를 통합하고 대체하여 어떤 단일 프로토콜 버전과도 무관하게 HTTP의 의미론을 정의하는 문서인 RFC 9110에서 공식화되어 있습니다(HTTP/1.1, HTTP/2, HTTP/3 모두 동일한 상태 코드 의미를 공유합니다). 1xx(정보)는 요청이 수신되고 이해되었으며 처리가 계속됨을 의미합니다 — 이는 클라이언트가 최종적인 것으로 취급해서는 안 되는 임시 응답입니다. 2xx(성공)는 요청이 수신, 이해, 수락되었음을 의미합니다. 3xx(리디렉션)는 요청을 완료하기 위해 추가 조치, 대개는 다른 URL을 가져오는 조치가 필요함을 의미합니다. 4xx(클라이언트 오류)는 전송된 요청 자체에 클라이언트가 유발한 문제 — 잘못된 구문, 누락된 인증, 존재하지 않는 리소스 등 — 가 있음을 의미합니다. 5xx(서버 오류)는 요청은 겉보기에 유효했지만 서버가 이를 처리하지 못했음을 의미합니다. 이 첫 번째 숫자 체계 덕분에, 특정 코드에 대해 숫자 "4" 외에는 아무것도 인식하지 못하는 클라이언트조차 자신의 요청에서 무언가를 고쳐야지 동일하게 재시도해서는 안 된다는 것을 올바르게 알 수 있습니다 — 표준이 이를 의무화하는 이유가 바로 이 대체 동작 때문입니다.
두 번째와 세 번째 숫자는 각 클래스를 구체적이고 문서화된 의미로 세분화하며, 클라이언트는 특별히 인식하지 못하는 코드에 대해 일반 클래스 동작으로 대체 처리하도록 기대됩니다 — 이것이 226이나 508처럼 잘 알려지지 않았거나 더 새로운 코드도 명시적인 지원 없이 이전 소프트웨어가 대략적으로 올바르게 처리할 수 있는 이유입니다. 코드도 자유롭게 만들어지지 않습니다: "599"나 "250"이 서로 다른 두 서버에서 서로 다른 두 가지를 의미하지 않도록 전체 등록부는 정확히 IANA(인터넷 할당 번호 관리기관)가 관리합니다 — 활발히 사용되는 모든 코드는 정확한 의미론을 정의하는 특정 RFC로 거슬러 올라갈 수 있으며, 그중 여럿은 특정 프로토콜을 위해 원래의 HTTP/1.1 명세를 확장합니다. 가장 눈에 띄는 예는 이 페이지의 207, 208, 422, 423, 424, 507/508 코드가 유래한 WebDAV(RFC 4918)입니다.
정확히 알아둘 만한 두 코드: 404 대 410
가장 흔히 혼동되는 두 코드는 404 Not Found와 410 Gone이며, 그 구분은 겉치레가 아닙니다 — 검색 엔진과 브라우저의 동작 방식을 바꿉니다. 404는 의도적으로 모호합니다: 서버는 해당 URL에 리소스가 존재한 적이 있는지, 다시 돌아올 수 있는지, 아니면 URL이 단순히 잘못 입력된 것인지에 대한 정보가 전혀 없습니다. 410은 의도적이고 더 강한 진술입니다: 리소스가 정확히 그 URL에 존재했었고 의도적으로, 영구적으로 제거되었으며 전달 주소도 알려져 있지 않습니다 — RFC 9110은 404가 확실성을 과소평가하게 되는 이 "상태가 영구적일 가능성이 높은" 경우를 위해 명시적으로 410을 권장합니다. 검색 엔진은 실제로 이를 다르게 취급합니다: 반복적으로 404를 반환하는 URL은 혹시 다시 돌아올 경우를 대비해 오랜 기간에 걸쳐 여러 번 재크롤링된 뒤에야 대개 색인에서 제거되는 반면, 410은 의도적인 제거를 나타내므로 검색 엔진은 일반적으로 더 빠르게 대응해, 서버가 다시 돌아오지 않을 것임을 명시적으로 보증했기 때문에 페이지를 더 일찍 색인에서 제거합니다. 페이지를 영구적으로 폐기할 때 모든 경우에 기본값으로 404를 쓰는 대신 410을 올바르게 사용하는 것은 작지만 실질적인 기술적 SEO 수단입니다.
- 301 대 302 대 307 대 308: 301과 308은 둘 다 "영구적으로 이동됨"을, 302와 307은 둘 다 "일시적으로 이동됨"을 의미합니다 — 더 새로운 307/308 쌍은 리디렉션 시 요청 메서드와 본문이 보존됨을(POST는 POST로 유지됨) 명확히 보장하기 위해 특별히 도입되었습니다. 널리 퍼진 과거의 브라우저 동작은 301/302 리디렉션을 조용히 GET으로 변환해 폼 재제출을 깨뜨렸고, 더 새로운 코드는 이를 해결합니다.
- 401 대 403: 401 Unauthorized는 혼란스러운 이름에도 불구하고 기술적으로 "인증되지 않았습니다 — 로그인하세요"를 의미합니다. 403 Forbidden은 "신원은 확인되었지만 여기에 접근할 권한이 없습니다"를 의미합니다 — 많은 API가 실제로는 이 구분을 흐릿하게 만들지만 명세는 이 둘을 명확히 분리해 유지합니다.
- 429 Too Many Requests(RFC 6585)는 표준적인 속도 제한 응답이며, 클라이언트에게 다시 시도하기 전에 정확히 얼마나 기다려야 하는지 알려주는
Retry-After헤더와 흔히 함께 사용됩니다. - 1xx 코드는 직접 보이는 경우가 드뭅니다. 대부분의 HTTP 클라이언트 라이브러리가 애플리케이션 코드가 응답을 보기 전에 이를 투명하게 처리하기 때문입니다 — 예를 들어 100 Continue는 클라이언트가 큰 요청 본문을 보내기 전에 그것을 보낼 가치가 있는지 확인할 수 있게 해줍니다.
자주 묻는 질문
404와 410의 실제 차이는 무엇인가요?
둘 다 리소스를 찾을 수 없다는 뜻이지만, 404는 그것이 존재한 적이 있는지 또는 다시 돌아올지를 모호하게 남겨두는 반면, 410은 리소스가 그 URL에 존재했으며 영구적으로 의도적으로 제거되었다는 의도적인 진술입니다. 서버가 제거가 영구적임을 명시적으로 확인했기 때문에 검색 엔진은 일반적으로 404 페이지보다 410 페이지를 더 빨리 색인에서 제거합니다.
418 "저는 찻주전자입니다"는 실제로 쓸 수 있는 상태 코드인가요?
이는 1998년 만우절 농담 RFC였던 RFC 2324의 "하이퍼 텍스트 커피포트 제어 프로토콜"에서 유래했습니다. 진지하게 의도된 적은 없지만 독특하고 모호하지 않은 테스트 코드로서 유용함이 입증되었으며, RFC 9110은 오늘날 그 상태가 선택 사항이며 실제 서버가 구현할 것으로 기대되지 않는다는 명시적인 설명과 함께 이를 공식적으로 보존하고 있습니다.
301과 302 리디렉션이 왜 가끔 폼 제출을 망가뜨리나요?
역사적으로 많은 브라우저가 301이나 302를 따라갈 때 리디렉션된 POST 요청을 조용히 GET 요청으로 변환해 제출된 본문을 버렸습니다. 더 새로운 307(Temporary Redirect)과 308(Permanent Redirect) 코드는 리디렉션을 거치는 동안 원래의 HTTP 메서드와 요청 본문이 보존됨을 명확히 보장하기 위해 도입되었습니다.
401과 403의 차이는 무엇인가요?
401 Unauthorized는 이름과 달리 실제로는 클라이언트가 전혀 인증하지 않았다는 뜻으로, 자격 증명을 요구하는 것입니다. 403 Forbidden은 클라이언트의 신원은 확인되었지만 그 특정 리소스에 접근할 권한이 명시적으로 없다는 뜻입니다. 많은 실제 API가 이를 느슨하게 또는 혼용해 사용하지만, 명세는 그 의미를 명확히 구분해 유지합니다.
507이나 423 같은 WebDAV 전용 코드는 어디서 유래했나요?
이들은 WebDAV(Web Distributed Authoring and Versioning) 명세인 RFC 4918에 정의되어 있으며, 이 명세는 리소스를 잠그는 것(423 Locked)이나 서버의 저장 공간이 부족함을 알리는 것(507 Insufficient Storage) 같은 원격 파일 관리 작업으로 일반 HTTP를 확장합니다. 이들은 핵심 HTTP 코드와 함께 공식 IANA HTTP 상태 코드 등록부의 일부로 남아 있습니다.
비슷한 도구
문제 신고하기
HTTP 상태 코드 참조
댓글
아직 댓글이 없습니다 — 첫 댓글을 남겨보세요!