DEV/cs

[CS] HTTP 상태 코드란 - 자주 보는 코드 정리

강한 2026. 10. 8. 23:30

HTTP 상태 코드가 뭐고, 200/400/404/500 같은 자주 보는 코드들이 각각 무슨 뜻인지 정리했습니다.


 

HTTP 상태 코드란

서버가 요청을 처리한 결과를 숫자 세 자리로 알려주는 코드입니다. 첫 번째 숫자가 결과의 큰 분류를 나타냅니다.

 
1xx - 처리 중 (정보성)
2xx - 성공
3xx - 리다이렉션 (다른 곳으로 이동)
4xx - 클라이언트 쪽 문제 (요청이 잘못됨)
5xx - 서버 쪽 문제 (서버에서 처리 실패)

 

2xx - 성공

  • 200 OK: 요청 성공, 가장 흔하게 보는 코드
  • 201 Created: 새 자원을 성공적으로 생성함 (POST 요청 후)
  • 204 No Content: 성공했지만 응답 본문이 없음 (삭제 요청 후 등)

 

3xx - 리다이렉션

  • 301 Moved Permanently: 자원이 영구적으로 다른 주소로 이동함
  • 302 Found: 자원이 임시로 다른 주소에 있음 (다음 요청 때는 원래 주소로 다시 가도 됨)
  • 304 Not Modified: 캐시된 데이터가 아직 유효함, 다시 안 보내도 됨

 

4xx - 클라이언트 문제

  • 400 Bad Request: 요청 형식 자체가 잘못됨 (필수 값 누락 등)
  • 401 Unauthorized: 인증 안 됨 (로그인이 필요함)
  • 403 Forbidden: 인증은 됐지만 권한이 없음 (로그인은 했는데 접근 권한이 없는 경우)
  • 404 Not Found: 요청한 자원이 없음
  • 409 Conflict: 요청이 서버의 현재 상태와 충돌함 (중복 가입 등)

 

5xx - 서버 문제

  • 500 Internal Server Error: 서버 내부에서 예상치 못한 에러 발생
  • 502 Bad Gateway: 서버 앞단(프록시, 로드밸런서)이 뒷단 서버로부터 잘못된 응답을 받음
  • 503 Service Unavailable: 서버가 일시적으로 요청을 처리할 수 없음 (과부하, 점검 등)

 

자주 헷갈리는 401 vs 403

401 Unauthorized: "누구세요? 로그인부터 하세요" (인증 자체가 안 됨)
403 Forbidden:    "누군지는 알겠는데, 권한이 없어요" (인증은 됐지만 권한 부족)

로그인 안 한 사용자가 마이페이지에 접근하면 401, 일반 사용자가 관리자 페이지에 접근하면 403이라고 구분하면 기억하기 쉽습니다.

 

스프링부트에서 상태 코드 지정하기

 
java
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody UserRequest request) {
    User user = userService.create(request);
    return ResponseEntity.status(HttpStatus.CREATED).body(user); // 201
}

@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    return userService.findById(id)
            .map(ResponseEntity::ok) // 200
            .orElse(ResponseEntity.notFound().build()); // 404
}

 

마무리

HTTP 상태 코드는 "요청이 어떻게 됐는지"를 숫자 하나로 압축해서 알려주는 약속입니다. 2xx는 성공, 4xx는 요청한 쪽 잘못, 5xx는 서버 잘못이라는 큰 분류만 기억해도, 처음 보는 코드가 나와도 대략 어느 쪽 문제인지 짐작할 수 있습니다.