Categories: Network

HTTP 상태코드 총정리 서버-클라이언트 간 명확한 의사소통

HTTP 상태코드란 무엇인가?

HTTP 상태코드(HTTP Status Code)는 서버가 클라이언트의 요청을 처리한 결과를 수치화된 코드로 나타내는 장치입니다.

  • 예를 들어, 200 OK는 요청이 정상적으로 처리되었음을 의미하고, 404 Not Found는 요청한 자원을 찾지 못했음을 의미합니다.
  • 상태코드는 3자리 숫자로 구성되어 있으며, 첫째 자리 숫자에 따라 카테고리가 구분됩니다.
  • 사용자는 상태코드를 보고 요청이 성공인지, 실패인지, 혹은 추가 조치가 필요한지를 빠르게 파악할 수 있습니다.

상태코드는 단순히 “성공/실패”를 나타내는 것이 아니라, 좀 더 세분화된 상황을 표현함으로써 RESTful API나 웹 서비스 등에서 응답을 체계적으로 관리하는 핵심 역할을 합니다.

HTTP 상태코드의 중요성

  1. 정확한 오류 판단
    • 4xx(클라이언트 잘못)인지, 5xx(서버 문제)인지에 따라 디버깅 방향이 달라집니다.
  2. RESTful API 품질 향상
    • 상황에 맞는 상태코드를 제대로 사용하면 클라이언트 개발자가 에러 원인을 쉽게 파악할 수 있습니다.
    • 예: 새 리소스 생성 시에는 201(Created), 요청 필드가 불충분하면 400(Bad Request), 권한 없으면 403(Forbidden) 등.
  3. 브라우저 & 검색엔진 처리
    • 3xx 리다이렉션(특히 301, 302 등)은 SEO나 브라우저 캐싱 정책에 큰 영향을 줍니다.
  4. 사용자 경험(UX) 개선
    • 사용자 측면에서 404, 500 페이지에 친절한 안내를 제공하면 서비스 품질이 높아집니다.

상태코드 표로 한눈에 보기

아래 표는 각 범주별 대표 상태코드를 요약한 것입니다.

코드이름 (영문)설명
1xx
100Continue요청의 일부를 수신했으며, 나머지 전송을 계속해도 됨
101Switching Protocols프로토콜 전환 (예: HTTP → WebSocket)
103Early Hints클라이언트에게 사전 로딩할 리소스(Link 헤더 등) 정보 제공
2xx
200OK요청 성공, 일반적인 정상 응답
201Created새 리소스 생성 성공, Location 헤더로 URI 전달 가능
202Accepted요청 수락, 그러나 처리 완료 전 (비동기 작업 대기 상태)
204No Content요청 성공, 그러나 응답 본문 없음
206Partial Content부분 범위 전송 (Range 헤더)
3xx
301Moved Permanently리소스 영구 이동, 클라이언트/검색엔진은 새 URL로 업데이트
302Found리소스 임시 이동, 기존 URL이 나중에 재사용될 가능성 있음
303See Other다른 URI로 리소스 접근하라는 안내 (주로 POST 후에 GET으로 유도)
304Not Modified변경 사항 없음, 캐시 사용 가능
4xx
400Bad Request잘못된 요청 (파라미터 형식 오류, JSON 문법 오류 등)
401Unauthorized인증 정보 없음/실패 (로그인 필요)
403Forbidden인증은 되었으나 권한 부족
404Not Found요청한 리소스를 찾을 수 없음
405Method Not Allowed지원되지 않는 메서드로 요청
409Conflict리소스 충돌 (버전 충돌, 중복 데이터 등)
429Too Many Requests일정 시간 내 요청 횟수 초과 (Rate Limit)
451Unavailable For Legal Reasons법적 사유로 이용 불가 (저작권, 규제 등)
5xx
500Internal Server Error서버 내부 오류, 일반적인 예외 상황
501Not Implemented서버가 해당 기능/메서드를 구현하지 않음
502Bad Gateway게이트웨이/프록시가 상위 서버로부터 잘못된 응답 수신
503Service Unavailable서버 과부하 또는 점검 중
504Gateway Timeout게이트웨이가 상위 서버로부터 응답을 제때 받지 못함
511Network Authentication Required네트워크 인증(공공 와이파이 등) 필요

상태코드의 구조와 범위

1xx (Informational, 정보 응답)
  • 정보적 응답을 나타내며, 클라이언트가 요청을 계속 진행해도 된다는 의미 등이 담깁니다.
  • 일반적으로 실무에서 1xx 코드를 직접 활용하는 경우는 많지 않습니다.
  • 대표 코드: 100 Continue, 101 Switching Protocols, 103 Early Hints 등
2xx (Success, 성공)
  • 요청이 정상적으로 처리되었을 때 사용합니다.
  • REST API 등에서 가장 많이 보게 되는 범주입니다.
  • 대표 코드:
    • 200 OK: 가장 일반적인 성공 응답
    • 201 Created: 새로운 리소스가 성공적으로 생성됨
    • 202 Accepted: 요청은 수락되었으나 처리가 완료되지 않음(비동기 작업 등)
    • 204 No Content: 요청은 성공적이나, 응답 본문이 없음(리소스 삭제, 일부 업데이트 등)
3xx (Redirection, 리다이렉션)
  • 리소스 위치 이동(다른 URI로 옮겨감)을 나타냅니다.
  • 클라이언트는 새 위치로 다시 요청을 보내는 것이 일반적입니다.
  • 대표 코드:
    • 301 Moved Permanently: 영구적으로 리소스 위치가 변경
    • 302 Found: 임시적으로 리소스 위치 이동
    • 303 See Other: 클라이언트가 GET 방식으로 다른 URI로 접근하도록 지시
    • 304 Not Modified: 클라이언트 캐시가 최신임을 알려주어, 재전송 불필요를 알림
4xx (Client Error, 클라이언트 오류)
  • 클라이언트 요청에 문제가 있을 때 사용하는 오류 응답 코드 범주입니다.
  • 대표 코드:
    • 400 Bad Request: 요청 파라미터나 문법이 잘못된 경우
    • 401 Unauthorized: 인증이 필요한 자원에 인증 정보 없이 접근 시도(“미인증”)
    • 403 Forbidden: 인증은 되었으나 해당 작업을 수행할 권한이 없음
    • 404 Not Found: 요청한 리소스를 찾을 수 없음
    • 405 Method Not Allowed: 지원되지 않는 HTTP 메서드로 요청한 경우
    • 409 Conflict: 리소스 상태가 충돌(중복 데이터, 버전 충돌 등)
    • 429 Too Many Requests: 일정 시간 내 너무 많은 요청을 보낼 때(레이트 리밋)
5xx (Server Error, 서버 오류)
  • 서버 측에서 에러가 발생했을 때 사용하는 범주입니다.
  • 대표 코드:
    • 500 Internal Server Error: 서버 내부 에러(일반적인 예외)
    • 501 Not Implemented: 서버가 요청을 처리할 기능을 구현하지 않음
    • 502 Bad Gateway: 게이트웨이 혹은 프록시가 상위 서버로부터 잘못된 응답을 받음
    • 503 Service Unavailable: 서버가 일시적으로 과부하 또는 점검 상태
    • 504 Gateway Timeout: 게이트웨이가 상위 서버로부터 응답을 제때 받지 못함

자주 사용하는 대표 상태코드와 의미

200 OK
  • 정상 처리된 경우. 예: GET 요청 성공 시, 요청된 자원(Body)을 함께 반환
  • REST API에서 조회(READ)를 성공하면 주로 200을 사용
201 Created
  • 새로운 리소스가 생성되었을 때. 예: POST /users로 새로운 사용자 생성
  • 보통 Location 헤더에 생성된 리소스의 URI를 함께 알려줌
204 No Content
  • 요청 성공, 그러나 응답 본문 없음
  • 예: DELETE나 PUT이 성공했으나 반환할 데이터가 없을 때
301, 302
  • 301: 영구 이동 (클라이언트나 검색 엔진이 새 주소로 업데이트하도록 유도)
  • 302: 임시 이동 (주소가 일시적으로 변경됨)
304 Not Modified
  • 클라이언트 캐시에 있는 리소스가 최신이라는 뜻.
  • 조건부 요청(If-Modified-Since, ETag 검사 등) 결과, 변경사항 없음
400 Bad Request
  • 요청이 잘못된 형식이거나, 필수 파라미터 누락 등으로 인한 오류
  • 입력 데이터 검증 실패 시 자주 사용
401 Unauthorized
  • 자원에 접근하기 위한 인증이 누락 또는 실패
  • Bearer 토큰이 없거나 잘못된 경우, 혹은 Basic Auth 자격 증명 실패
403 Forbidden
  • 인증은 되었으나, 권한이 부족하여 해당 자원에 접근 불가능
404 Not Found
  • 리소스가 존재하지 않음
  • 잘못된 URL 요청, 삭제된 자원, 잘못된 경로
405 Method Not Allowed
  • 해당 리소스가 해당 메서드(예: DELETE)를 지원하지 않음
  • 예: /users 경로는 GET/POST는 허용하나 DELETE는 불허
500 Internal Server Error
  • 서버 내부 예외 또는 처리 불가 상황
  • 개발 시 디버깅이 필요한 에러이며, 사용자에겐 일반적으로 간단한 에러 메시지를 표시
503 Service Unavailable
  • 서버가 일시적으로 과부하이거나 점검 중
  • 나중에 다시 시도하라는 의미로 쓰임

상태코드 선택 기준과 유의사항

  1. 명확한 의도 전달: 단순히 “모든 에러에 500을 반환”하기보다, 상황에 맞는 4xx/5xx를 구분하면 클라이언트가 해결책을 찾기 쉬움
  2. 리소스 생성 시 201 Created 사용: 새로 만든 리소스의 위치(Location 헤더 등) 제공
  3. 204 No Content 활용: 성공했으나 반환할 데이터가 없을 경우, 200 대신 204로 명확하게 의도 전달
  4. 조건부 요청(304 Not Modified): 캐싱, ETag 등 성능 최적화에 유용
  5. 405 Method Not Allowed: API 설계 시, 불필요한 메서드는 허용하지 않도록 보안 및 명확성 강화
  6. 에러 메시지 표준화: 4xx, 5xx 에러 시 응답 Body에 {“error”: “message”} 형태로 이유를 담으면 디버깅 및 협업에 편리

에러 처리 전략과 사용자 경험(UX)

  1. 에러 상태코드 vs. 성공 상태코드
    • 서버 내부에서 발생한 에러는 5xx로, 잘못된 요청은 4xx로 분류
    • 클라이언트에 어떤 추가 조치가 필요한지 안내(문서화 포함)
  2. 사용자 친화적 응답
    • 예: 404 페이지를 친절한 메시지(“죄송합니다. 페이지를 찾을 수 없습니다.”)로 제공
    • API에서는 JSON 형태로 에러 원인(code, message 필드 등) 포함
  3. 로그 기록과 모니터링
    • 4xx, 5xx 응답을 로깅하고, 알림 시스템 연동
    • 에러 발생 추이 분석, 재발 방지책 수립

상태코드와 보안적 고려

  1. 401 vs. 403 사용법 구분
    • 401: 인증이 아예 안 되었거나, 토큰이 잘못된 경우
    • 403: 인증은 되었으나 해당 작업 권한이 없는 경우
  2. 429 Too Many Requests
    • 레이트 리밋(Rate Limit)이 걸릴 때 사용. 무차별 대입 공격 방지
  3. 에러로 인한 정보 노출 방지
    • 500 오류 때 개발 정보(스택 트레이스 등)를 그대로 노출하면 보안 취약점

정리 및 마무리

HTTP 상태코드는 서버와 클라이언트가 소통하는 데 있어 결정적 힌트를 제공하는 요소입니다.

  • 단순히 “성공은 200, 실패는 500” 수준으로 구분하기보다는, 세분화된 코드를 상황에 맞춰 적용함으로써 API 사용성이 크게 향상됩니다.
  • 2xx, 3xx, 4xx, 5xx 범주를 잘 이해해두면, 요청 결과(성공, 리다이렉션, 클라이언트 오류, 서버 오류)를 명확히 표현할 수 있습니다.
  • RESTful API 설계 시에도 각 코드가 의도하는 바를 살려서 적절히 응답해야, 클라이언트 개발자나 서비스 이용자 모두에게 좋은 경험을 제공할 수 있습니다.

API 설계나 웹 서비스 운영 시, 적절한 상태코드 선택은 협업과 유지보수에 큰 도움을 줍니다. 또한, 사용자 경험을 높이고 서버 문제 파악 속도를 올리며, 클라이언트 개발자에게 직관적인 정보를 제공할 수 있습니다.

마지막으로, 상태코드 사용법은 표준(RFC 9110 등)에 정의되어 있으므로, 더욱 심도 있는 내용이 필요하다면 관련 문서나 공식 사이트를 참고하시기 바랍니다.

이상으로 HTTP 상태코드에 대한 정리를 마치며, 더 나은 웹 서비스 구현에 도움이 되었길 바랍니다!

suover

Recent Posts

읽기 좋은 코드를 작성하는 사고법: 추상과 구체

들어가며 코드를 작성하다 보면 "왜 이 코드는 한눈에 이해가 안 될까?" 하는 고민을 종종 하게…

51 분 ago

HTTP 메서드 완벽 가이드 GET, POST, PUT, PATCH, DELETE 등 총정리

HTTP란 무엇인가? HTTP(Hypertext Transfer Protocol)는 웹에서 데이터를 주고받기 위해 사용하는 응용 계층 프로토콜입니다. 우리가 브라우저에서…

2주 ago

HTTP 기본과 특징 알아둬야 할 모든 것

HTTP란 무엇인가? HTTP(Hypertext Transfer Protocol)는 인터넷에서 웹 브라우저와 웹 서버가 서로 통신하기 위해 사용하는 프로토콜입니다.…

2주 ago

Network 네트워크 URI와 웹 브라우저 요청 흐름 알아보기

들어가며 우리가 인터넷에서 웹사이트에 접속할 때 가장 먼저 하는 일은 브라우저 주소창에 어떤 문자열을 입력하는…

4주 ago

Network 인터넷 네트워크란? 개념과 구조 완벽 정리

인터넷 네트워크란? "인터넷(Internet)"이라는 단어는 "인터네트워크(Internetwork)"의 줄임말입니다. 즉, 여러 개의 네트워크가 상호 연결되어 전 세계적으로 하나의…

1개월 ago

Spring 스프링 빈 스코프(Bean Scope) 개념 정리

스프링 빈(Spring Bean)과 IoC 컨테이너 스프링 프레임워크의 핵심 철학은 IoC(Inversion of Control) 컨테이너를 통해 객체(빈,…

1개월 ago