본문 바로가기
HTTP

모든 개발자를 위한 HTTP 웹 기본 지식_섹션6_4xx_5xx_에러코드

by 킴도TV 2022. 2. 15.

4xx - 클라이언트 오류, 5xx - 클라이언트 오류

에러 Status Code에 알아보자!

4xx (Client Error)

클라이언트 오류

  • 클라이언트의 요청에 잘못된 문법등으로 서버가 요청을 수행할 수 없음
  • 오류의 원인이 클라이언트에 있음
  • 중요! 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에, 똑같은 재시도가 실패함

NOTE
4xx vs 5xx
(1) 400대 오류는 클라이언트 오류로 요청 자체가 잘못된 것으로 똑같은 요청&데이터로 재요청을 해도 항상 실패한다.
(2) 반면에 500대 오류는 서버 오류로 서버가 복구만 된다면 똑같은 요청&데이터로 재요청해도 성공할 수 있다.

400 Bad Request

클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음

  • 요청 구문, 메시지 등등 오류
    클라이언트는 요청 내용을 다시 검토하고, 보내야함
    예) 요청 파라미터가 잘못되거나, API 스펙이 맞지 않을 때

NOTE
백엔드 개발자가 잘못된 요청이면 400 코드를 보낼수 있도록 철저하게 다 막아내야 한다. 스펙이 안 맞다 싶으면 요청을 다 쳐내야한다.
그래야 500오류로 안보낼수 있다. 따라서 클라이언트 개발자 오해가 없이 잘못된 요청이 아닌 스펙에 딱 맞는 요청을 보낼수 있도록 코드를 수정할 수 있다.

401 Unauthorized

클라이언트가 해당 리소스에 대한 인증이 필요함

  • 인증(Authentication) 되지 않음
  • 401 오류 발생시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명
  • 참고
    • 인증(Authentication): 본인이 누구인지 확인, (로그인) -> 단순히 로그인을 했다, 안했다.
    • 인가(Authorization): 권한부여 (ADMIN 권한처럼 특정 리소스에 접근할 수 있는 권한, 인증이 있어야 인가가 있음)
    • 오류 메시지가 Unauthorized 이지만 인증 되지 않음 (이름이 아쉬움, 왜냐하면 인증은 Authorization이 아닌 Authenication이기 때문이다)

403 Forbidden

서버가 요청을 이해했지만 승인을 거부함

  • 주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우
  • 예) 어드민 등급이 아닌 사용자가 로그인은 했지만, 어드민 등급의 리소스에 접근하는 경우

404 Not Found

요청 리소스를 찾을 수 없음

  • 요청 리소스가 서버에 없음
  • 또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 때

NOTE
이게 왜 클라이언트 오류냐면 해당 url로 애초에 리소스가 서버에 없을 수 있는데, 클라이언트가 잘못된 url로 요청할 수 있기 때문에 클라이언트 오류이다.
또 보안상 권한이 부족한 클라이언트가 리소스에 접근할때 해당 리소스를 숨기고 싶을때 404를 사용한다.

5xx (Server Error)

서버 오류

  • 서버 문제로 오류 발생
  • 서버에 문제가 있기 때문에 재시도 하면 성공할 수도 있음(복구가 되거나 등등)

NOTE
예를 들어 NullPointerException이 터질 때나 데이터베이스에 접근이 불가할때 등등이다.

500 Internal Server Error

서버 문제로 오류 발생, 애매하면 500 오류

  • 서버 내부 문제로 오류 발생
  • 애매하면 500 오류

503 Service Unavailable

서비스 이용 불가

  • 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음
  • Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수도 있음

NOTE
하지만 대부분 서비스 장애는 예측불가능한 것이 많으므로 예측가능한 503은 잘 보기가 쉽지 않고, 500 에러를 많이 보게 된다.

  • 5xx 에러는 조심해야 할 것이 있다. 웬만하면 서버는 500대 에러를 만들면 안된다. 정말 500대 에러는 서버가 터졌을때만 500대 에러를 만들어야 하기 때문이다.
    • 예를 들어 비즈니스 로직상, 요청의 api 스펙도 다 맞고 고객의 잔고가 부족한 경우 이런 경우에는 500에러로 내면 안된다. 왜냐하면 정말 5xx 에러는 서버에 문제가 있을때만 내야 하기 때문이다. 모니터링 할때도 500에러를 발견하면 심각한 오류로 판단해야 하는데 고작 사용자의 잔고 부족이라는 상대적으로 minor 한 이슈로 500에러를 내면 상황 판단에 착오가 있을 수 있기 때문이다.