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는 서버 잘못이라는 큰 분류만 기억해도, 처음 보는 코드가 나와도 대략 어느 쪽 문제인지 짐작할 수 있습니다.
'DEV > cs' 카테고리의 다른 글
| [CS] 해시테이블(HashMap)이란 - 내부 동작 원리 (0) | 2026.10.10 |
|---|---|
| [CS] Docker란 - 컨테이너 개념과 기본 사용법 (0) | 2026.10.01 |
| [CS] Redis란 - 자료구조와 활용 예시 (0) | 2026.09.29 |
| [CS] 애자일(Agile) 방법론이란 (1) | 2026.09.28 |
| [CS] 오버로딩 vs 오버라이딩 비교 (0) | 2026.09.27 |