HTTP 상태 코드 (HTTP Status Code)

한눈에 보기

HTTP 상태 코드는 서버가 요청 처리 결과를 세 자리 숫자로 알리는 표준 신호다. 1xx부터 5xx까지 다섯 부류의 의미, 401과 403 같은 혼동하기 쉬운 코드의 구분, API 설계에서의 활용을 정리한다.

최종 업데이트 2026.09.17

HTTP 상태 코드(HTTP Status Code)는 서버가 클라이언트의 요청을 어떻게 처리했는지 세 자리 숫자로 알리는 표준 응답 신호다. 첫 자리 숫자에 따라 1xx 정보, 2xx 성공, 3xx 리다이렉션, 4xx 클라이언트 오류, 5xx 서버 오류의 다섯 부류로 나뉜다. 상태 코드를 정확히 쓰면 클라이언트, 캐시, 모니터링 도구가 응답의 의미를 기계적으로 판단할 수 있으므로 API 설계의 기본기에 해당한다.

다섯 부류의 의미

1xx는 처리가 진행 중이라는 정보성 응답으로, 프로토콜 전환을 알리는 101 Switching Protocols가 웹소켓(WebSocket) 연결 수립에 쓰인다. 2xx는 요청이 성공적으로 처리됐다는 뜻이고, 3xx는 요청을 완료하려면 다른 위치로 다시 요청해야 한다는 안내다. 4xx는 요청 자체에 문제가 있어 실패했다는 뜻이므로 같은 요청을 그대로 반복해도 성공하지 않는다. 5xx는 요청은 유효했으나 서버 쪽 문제로 처리하지 못했다는 뜻이라 시간이 지나 재시도하면 성공할 수 있다. 이 구분은 장애 대응의 출발점이 된다. 4xx 급증은 클라이언트 배포나 API 계약 위반을, 5xx 급증은 서버 장애를 의심하게 한다.

자주 쓰는 코드

코드이름의미와 사용 상황
200OK요청이 성공했고 응답 본문에 결과가 있다
201Created자원이 생성됐다. Location 헤더로 새 자원의 URI를 알린다
204No Content성공했지만 돌려줄 본문이 없다. 삭제나 수정 후 자주 쓴다
301Moved Permanently영구 이동. 브라우저와 검색 엔진이 새 주소를 기억한다
302Found임시 이동. 재요청 시 메서드가 GET으로 바뀔 수 있다
304Not Modified캐시된 사본이 여전히 유효하니 본문 없이 그대로 쓰라는 뜻
400Bad Request문법 오류나 유효하지 않은 요청
401Unauthorized인증되지 않았다. 로그인이나 유효한 토큰이 필요하다
403Forbidden인증은 됐으나 권한이 없어 거부한다
404Not Found자원이 존재하지 않는다
409Conflict현재 자원 상태와 충돌한다. 중복 생성이나 동시 수정 충돌
429Too Many Requests요청 빈도 제한 초과. Retry-After로 대기 시간을 알린다
500Internal Server Error서버 내부의 처리되지 않은 오류
502Bad Gateway게이트웨이가 상류 서버에서 잘못된 응답을 받았다
503Service Unavailable과부하나 점검으로 일시적으로 처리 불가
504Gateway Timeout상류 서버의 응답이 제한 시간 안에 오지 않았다

혼동하기 쉬운 코드 구분

401과 403의 구분이 대표적이다. 401 Unauthorized는 이름과 달리 인증(Authentication)의 실패, 즉 당신이 누구인지 모르겠다는 뜻이며 WWW-Authenticate 헤더로 인증 방법을 함께 안내해야 한다. 403 Forbidden은 인가(Authorization)의 실패, 즉 누구인지는 알지만 이 자원에 대한 권한이 없다는 뜻이다. 리다이렉션에서는 301과 302 외에 307 Temporary Redirect와 308 Permanent Redirect를 알아 두어야 한다. 302는 역사적인 이유로 재요청 시 POST가 GET으로 바뀌는 동작을 브라우저들이 허용해 왔는데, 307과 308은 원래 메서드와 본문을 반드시 유지하도록 명확히 규정한 코드다. 또 존재하지 않는 자원과 권한 없는 자원을 구분해서 응답하면 자원의 존재 여부가 노출되므로, 보안상 둘 다 404로 응답하는 설계도 실무에서 쓰인다. 502와 504는 리버스 프록시(Reverse Proxy) 구조에서 의미가 갈리는데, 502는 뒤쪽 서버가 이상한 응답을 준 것이고 504는 응답이 아예 늦은 것이므로 장애 원인 추적의 단서가 다르다.

API 설계에서의 활용

REST API에서는 성공과 실패를 본문이 아니라 상태 코드로 먼저 표현하는 것이 원칙이다. 모든 응답을 200으로 주고 본문의 success 필드로 구분하는 방식은 HTTP 캐시, 브라우저, 모니터링, 재시도 로직 같은 표준 인프라의 도움을 전부 포기하는 설계다. 생성에는 201과 Location 헤더를, 비동기 접수에는 처리 중임을 뜻하는 202 Accepted를, 삭제 성공에는 204를 쓰는 식으로 의미를 살리면 클라이언트 구현이 단순해진다. 오류 응답의 본문 형식으로는 문제의 유형과 상세를 표준 필드로 담는 Problem Details(RFC 9457) 형식이 권장된다. 재시도 정책도 코드에 따라 갈라야 한다. 4xx는 요청을 고치기 전에는 재시도가 무의미하지만, 429와 503은 Retry-After를 존중한 지수 백오프(Exponential Backoff) 재시도가 적절하다.

면접에서 이렇게 물어본다

  • 상태 코드의 다섯 부류를 설명하고 각 부류의 대표 코드를 들어 보라.
  • 401과 403의 차이를 인증과 인가 개념으로 설명해 보라.
  • 301, 302, 307, 308의 차이는 무엇인가.
  • 모든 응답을 200으로 주고 본문으로 성공 여부를 표현하는 설계의 문제점을 말해 보라.
  • 클라이언트의 재시도 로직을 설계할 때 상태 코드를 어떻게 활용하겠는가.
웹 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기