Published on

HTTP 상태 코드

HTTP 상태 코드

HTTP 상태 코드는 웹 개발에서 자주 마주치지만, 자주 헷갈리고 까먹는다. ;; 자주 쓰이는 상태 코드들을 상황에 맞게 정리하고, 헷갈리기 쉬운것들을 나열해보자.


1. 상태 코드 분류

HTTP 상태 코드는 크게 다섯 가지로 나뉜다:

범위의미
1xxInformational (정보 제공)
2xxSuccess (성공)
3xxRedirection (리다이렉션)
4xxClient Error (클라이언트 오류)
5xxServer Error (서버 오류)

2. 실무에서 자주 쓰는 코드 정리

✅ 2xx Success

  • 200 OK: 요청 성공. 일반적인 응답.
  • 201 Created: 리소스 생성 성공 (ex. 회원가입, 게시글 작성).
  • 204 No Content: 요청 성공했지만 반환할 콘텐츠 없음 (ex. 삭제 요청 성공 시).

🔄 3xx Redirection

  • 301 Moved Permanently: 리소스 영구 이동.
  • 302 Found: 일시적 이동.
  • 304 Not Modified: 캐시 사용. 콘텐츠 변경 없음.

⚠️ 4xx Client Error

  • 400 Bad Request: 잘못된 요청 (ex. 유효성 검증 실패).
  • 401 Unauthorized: 인증 필요 또는 실패 (ex. 토큰 없음/만료).
  • 403 Forbidden: 권한 없음 (ex. 접근은 되었지만 권한 없음).
  • 404 Not Found: 요청한 리소스 없음.
  • 409 Conflict: 충돌 (ex. 이메일 중복, 리소스 상태 불일치).

❌ 5xx Server Error

  • 500 Internal Server Error: 서버 내부 오류.
  • 502 Bad Gateway: 게이트웨이/프록시 서버의 잘못된 응답.
  • 503 Service Unavailable: 일시적인 서버 과부하/점검 중.

3. 실무에서 자주 헷갈리는 사례

🔐 로그인 실패: 401 vs 403?

  • 401 Unauthorized: 로그인 실패, 인증 필요.
  • 403 Forbidden: 로그인은 했지만 접근 권한 없음.

🗑️ 삭제 요청한 리소스가 없음: 404 vs 204?

  • 이미 삭제된 리소스일 경우:
  • 204 No Content: 삭제 성공 (존재하지 않아도 응답 자체는 OK로 처리).
  • 존재하지 않는 리소스를 삭제하려는 경우:
  • 404 Not Found 사용 가능.

🆔 서버와 리소스 충돌: 409 Conflict

  • 이미 존재하는 리소스와 충돌 발생 시 409를 사용하는 게 명확.
  • 논리적인 충돌을 의미하며, 서버의 상태나 제약조건과 맞치 않을 때 발생.
  1. 중복된 리소스 생성시 상황: 회원가입 요청이 들어왔는데, 이미 해당 이메일을 가진 사용자가 존재함.
POST /users
Content-Type: application/json

{
  "email": "email@example.com",
  "password": "123456"
}

서버응답:

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

{
  "errorCode": "EMAIL_ALREADY_EXISTS",
  "message": "이미 등록된 이메일입니다."
}

새로운 리소스를 생성하려는 요청이지만 서버의 현재 리소스 상태와 충돌하므로 409를 반환함.

  1. 버전 충돌 상황: 누군가가 게시글을 수정하는 중에, 다른 사람이 먼저 수정해버림
  • A 사용자가 게시글을 수정하려고 함.
  • B 사용자가 먼저 수정해서 서버에 저장된 버전이 변경됨
  • A 사용자의 수정 요청은 서버의 최식 상태와 버전 충돌

서버응답:

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

{
  "errorCode": "VERSION_MISMATCH",
  "message": "다른 사용자가 먼저 수정했습니다. 다시 시도해주세요."
}

데이터의 일관성을 유지하기 위한 용도로, 버전 충돌 시에도 409를 사용함.

  1. 리소스 상태와 충돌
  • 어떤 리소스가 특정상태일 때만 갱신 가능하다고 정해져있다고 예를 들면, 그 상태가 아닐 때 예: 주문이 배송환료 상태인 경우는 취소 할 수 없음 -> 이경우도 409

왜 400 Bad Request가 아닌가? 400은 요청 자체가 잘못됐을 때 - 예: 필수 파라미터 누락, 타입 오류 등 409는 요청은 형식상 문제없지만, 서버의 현재 상태와 논리적으로 맞지 않을 때 씀

상황적절한 상태 코드
JSON 형식 오류, 필드 누락400 Bad Request
인증 누락401 Unauthorized
권한 없음403 Forbidden
존재하지 않는 리소스404 Not Found
리소스 중복, 상태 불일치, 버전 충돌✅ 409 Conflict

참고

MDN Web Docs - HTTP Status Codes RFC 7231 - Semantics and Content