(인프런) 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식을 공부하고 리뷰한 글입니다.
5. 4xx(클라이언트 오류), 5xx(서버 오류)
상태코드 | 원인 | ||
클라이언트 오류 | 400 | 요청 구문, 메시지 오류(요청 파라미터 잘못됨, API 스펙이 맞지 않을 때) | |
401 | 인증이 되지않은 경우 | ||
403 | 인증은 됐지만 접근권한이 불충분한 경우 | ||
404 | 요청 리소스가 서버에 없는 경우 | ||
서버 오류 | 500 | 서버 문제(NullPointerException, DB 접근 불가) | 애매하면 사용 |
503 | 일시적 과부하/예정 작업(서비스 이용 불가) |
1. 4xx (Client Error)
클라이언트 오류
- 오류의 원인 = 클라이언트 (e.g. 클라이언트 요청에 잘못된 문법)
(중요!) 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있으므로 재시도해도 실패함
1) 400 Bad Request
클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음
- 요청 구문, 메시지 등 오류
- 클라이언트는 요청 내용을 재검토 후 보내야 함
e.g. 요청 파라미터가 잘못되거나, API 스펙이 맞지 않을 때
2) 401 Unauthorized
클라이언트가 해당 리소스에 대한 인증이 필요함
- 인증이 되지 않아 생긴 오류
- 401 오류 발생시, 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명
(참고) 오류 메시지는 Unauthorized이지만 실제로는 인증이 되지않아 생긴 오류임
3) 403 Forbidden
서버가 요청을 이해했지만 승인을 거부함
- 주로 인증은 됐지만 접근 권한이 불충분한 경우
e.g. 어드민 등급이 아닌 사용자가 로그인은 했지만, 어드민 등급의 리소스에 접근하는 경우
4) 404 Not Found
- 요청 리소스가 서버에 없는 경우
- 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶은 경우
2. 5xx (Server Error)
서버 오류
- 오류의 원인 = 서버 (e.g. NullPointerException, DB 접근 불가)
- 서버에 문제가 있으므로 재시도하면 성공할 수도 있음
왠만하면 5xx 오류는 내면 안된다. 진짜 심각한 서버 오류가 있을 때만 5xx 오류를 내야 한다.
1) 500 Internal Server Error
서버 문제로 오류 발생, 애매하면 500오류
2) 503 Service Unavailable
서비스 이용 불가
- 서버가 일시적인 과부하/예정된 작업으로 잠시 요청을 처리할 수 없음
- Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수 있음
6-5. 4xx(클라이언트 오류), 5xx(서버 오류) 질문 정리
Q. 20세 이상에게만 제공하는 서비스에 15살이 들어온 경우, 5xx가 아닌 어떤 에러를 출력해야하나요?
1) 클라이언트와 서버가 서로 약속한 HTTP API 스펙을 만족하면 -> 200, 만족하지 않으면 -> 400
2) 비즈니스 로직이 정상 수행되지만 다양한 결과가 존재하는 경우(승인, 거절 등) -> 200 + 비즈니스 코드 반환(봉투 패턴)
3) 비즈니스 로직을 수행하다가 내부에서 시스템 예외나 NullPointerException 등 비즈니스와 관계없는 시스템 예외 발생 -> 500
(참고) 다양한 비즈니스 응답이 있는 복잡한 비즈니스 로직이 있는 HTTP API는 봉투 패턴 고려,
비즈니스 로직이 거의 없는 단순한 조회는 봉투 패턴 고려X
[출처] https://www.inflearn.com/questions/111465
Q. 구글에서 검색해서 나온 페이지를 클릭해 들어가면 404 Not Found가 뜨는 경우는 리소스가 있는데 리소스를 숨기는 건가요?
이 경우는 대부분 검색 엔진이 크롤링 하는 단계에서는 리소스가 있었는데, 이후 리소스가 사라져 404 Not Found가 뜨는 것이다.
[출처] https://www.inflearn.com/questions/152077
200 vs 400
[참고] https://brainbackdoor.tistory.com/137
'Spring > 모든 개발자를 위한 HTTP 웹 기본 지식' 카테고리의 다른 글
[모든 개발자를 위한 HTTP 웹 기본 지식] 07. HTTP 헤더1(일반헤더) - 콘텐츠 협상 (0) | 2022.06.07 |
---|---|
[모든 개발자를 위한 HTTP 웹 기본 지식] 07. HTTP 헤더1(일반헤더) - HTTP 헤더 개요, 표현 (0) | 2022.06.07 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 06. HTTP 상태코드 - 3xx(리다이렉션1), 3xx(리다이렉션2) (0) | 2022.06.02 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 06. HTTP 상태코드 - HTTP 상태코드 소개, 2xx(성공) (0) | 2022.06.02 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 05. HTTP 메서드 활용 - HTTP API 설계 예시 (0) | 2022.05.30 |