[HTTP 웹 기본 지식] 4. HTTP 상태코드

건우·2025년 12월 7일

CS / 네트워크

목록 보기
4/6
post-thumbnail

1. HTTP 상태 코드 정리

HTTP 상태 코드는 서버가 “요청 처리 결과가 지금 어떤 상태인지”를 알려주는 신호다.
프론트/클라이언트 입장에서는 이걸 보고 “다시 요청할지, 로그인 시킬지, 페이지 이동할지” 같은 다음 행동을 정하게 된다.

상태 코드 분류

  • 1xx (Informational): 요청 받았고 처리 중 (거의 안 쓴다.)
  • 2xx (Successful): 정상 처리
  • 3xx (Redirection): 추가 행동 필요 (주로 Location 따라 이동)
  • 4xx (Client Error): 클라이언트 문제 → 똑같이 재시도해도 보통 실패한다.
  • 5xx (Server Error): 서버 문제 → 재시도하면 될 수도 있다.

모르는 상태 코드가 오면?

클라이언트가 모르는 코드가 와도 보통 앞자리 기준으로 해석한다.

  • 299면 “2xx 성공이겠구나”
  • 451이면 “4xx 클라 문제겠구나”
  • 599면 “5xx 서버 문제겠구나”

→ 그래서 미래에 상태 코드가 늘어나도 클라이언트를 매번 바꿀 필요가 없다.


2. 2xx: 성공

  • 200 OK
    성공. 조회/수정/삭제 등 대부분에 무난하게 쓰인다.

  • 201 Created
    새 리소스 생성
    그리고 보통 Location 헤더로 생성된 리소스 URI를 알려준다.

    • Ex. POST /members
      응답: 201 Created
      헤더: Location: /members/100
  • 202 Accepted
    요청은 받았는데 아직 처리 끝은 아니다.
    배치 같은 “비동기 처리”에 쓰인다.

  • 204 No Content
    성공은 했는데 본문으로 내려줄 게 없다.


3. 3xx: 리다이렉션

3xx가 나오면 브라우저는 보통 Location 헤더를 보고 자동으로 이동한다.

리다이렉션 종류

  • 영구 이동: 301, 308
  • 일시 이동: 302, 307, 303
  • 특수 목적: 300, 304

301 / 308: 영구 리다이렉션

“이 URI는 이제 앞으로 계속 여기로 가세요” 느낌.
• 예: /members → /users

  • 301 Moved Permanently
    리다이렉트되면서 메서드가 GET으로 바뀔 수도 있고, 바디가 사라질 수도 있다. (MAY)

  • 308 Permanent Redirect
    301이랑 비슷한데, 메서드/바디를 그대로 유지한다.
    (POST로 보냈으면, 리다이렉트도 POST로 유지)

302 / 307 / 303: 일시 리다이렉션

URI가 잠깐 바뀐 것뿐이라서 검색엔진 같은 곳에서 URL을 “영구 변경”으로 취급하면 안 된다.

  • PRG(Post/Redirect/Get)
    주문 완료: POST /orders
    그 상태에서 새로고침하면?
    → 브라우저가 POST를 다시 날릴 수 있어서 중복 주문 터질 수 있다.

    • 그래서, POST로 주문 처리
    • 응답을 302로 주고 Location으로 결과 페이지 안내
    • 브라우저는 GET으로 결과 페이지 이동
    • 이렇게 하면 새로고침해도 GET만 다시 날아가서 중복 주문을 막는다.
  • 302 Found
    리다이렉트 시 GET으로 바뀔 수도 있음(MAY)
    현실적으로 라이브러리/브라우저들이 기본값으로 많이 쓴다.

  • 307 Temporary Redirect
    302랑 목적은 비슷한데, 메서드가 절대 바뀌면 안된다.(MUST NOT)
    즉, POST면 POST 유지.

  • 303 See Other
    리다이렉트 시 무조건 GET으로 변경한다.
    PRG 패턴에서 의도가 명확해서 깔끔하다.

결론적으로는

  • “GET으로 바뀌어도 상관없다” → 302도 실무에서 흔히 OK
  • “무조건 GET으로 바꿀 거다(PRG)” → 303
  • “POST 유지해야 한다” → 307

304 Not Modified (캐시용)

캐시를 위한 상태 코드를 이미한다.

  • “서버 기준으로 리소스 안 바뀌었으니까, 너 로컬 캐시 써”
  • 그래서 304 응답에는 바디가 있으면 안된다.
    (캐시를 써야 하니까)

4. 4xx / 5xx: 에러

4xx: 클라이언트

클라이언트 요청 자체가 잘못됐으니, 똑같이 재시도하면 보통 계속 실패한다.

  • 400 Bad Request
    요청 파라미터/바디가 이상함, 스펙 안 맞음 등
  • 401 Unauthorized
    “인증이 필요함”
    그리고 401이면 원칙적으로 WWW-Authenticate 헤더로 인증 방법도 알려줘야 한다.

인증(Authentication): 너 누구야? (로그인)
인가(Authorization): 너 이거 할 권한 있어? (ADMIN 같은 권한)

  • 403 Forbidden
    인증은 됐는데 권한이 없다.
  • 404 Not Found
    리소스가 없다.
    또는 권한이 없다는 걸 숨기고 싶을 때 “없는 척”할 때도 종종 쓴다.

5xx: 서버

서버가 터졌거나 처리가 실패했음을 의미한다.
그래서 재시도하면 성공할 수도 있다. (서버가 복구되면)

  • 500 Internal Server Error
    애매하면 500 (근데 실무에선 “애매하면 500”이 제일 위험한 말이기도 하다.)
  • 503 Service Unavailable
    서버 과부하/점검 등으로 잠깐 못 받은 경우이다.
    Retry-After 헤더로 “몇 초 뒤에 다시 와” 같은 힌트를 줄 수도 있다.

출처
모든 개발자를 위한 HTTP 웹 기본 지식 (김영한, 인프런, 2020)

0개의 댓글