반응형

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

먼저 400대 를 쓰고 언제 500대를 쓰는걸까?

간단하게 이렇게 구분하면 좋다.

400대 는 클라이언트 오류, 500대는 서버 오류

 

먼저 400대 Client Error 를 살펴보자.

 

4xx (Client Error)

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

 

400대 오류와 500대오류를 가르는 중요한 차이는,
400대 오류는 클라이언트가 이미 잘못된 요청을 한 것이기 때문에, 똑같이 여러번 재시도해도 계속 실패한다.

그런데  500대 오류는, 예를 들어 서버에 데이터베이스가 장애가 낫다고가정하면, 그러면 서버에 요청을 보내면 500대오류가 날 것이다. 그런데, 데이터베이스가 나중에 복구가 되었다면, 클라이언트가 다시 똑같은 요청을 재시도해도 요청이 성공할 가능성이 있다.

 

4xx 대 오류를 하나씩 자세히 살펴보자.

400 Bad Request 는,
클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없는 것이다.

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

 

401  Unauthorized 는,
클라이언트가 해당 리소스에 대한 인증이 필요한 것이다.

  • 인증(Authentication) 되지 않음
  • 401 오류 발생시, 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명
  • 참고
    • 인증(Authentication): 본인이 누구인지 확인, (로그인)
    • 인가(Authorization): 권한 부여 (ADMIN 권산처럼 특정 리소스에 접근할 수 있는 권한, 인증이 있어야 인가가 있음)
    • 오류 메시지가  Unauthorized 이지만 아예 인증 자체가 되지 않은(로그인되지 않은 것이라서)인증 되지 않은것이맞다.

 

403 Forbidden 은,
서버가 요청을 이해했지만 승인을 거부한 것이다.

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

 

404 Not Found는,
요청 리소스를 찾을 수 없는 것이다.

이것이 왜 클라이언트 오류냐면, 서버입장에서는 이러한 리소스 자체가 없는데, 클라이언트가 잘못된요청을 보낸 것이기 때문이다.

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

 

이번에는 500대 를 알아보자.

5xx (Server Error)는 서버에 문제가 있어서 발생한 것이다.

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

 

하나씩 살펴보자.

500 Internal Server Error
서버 문제로 오류 발생한 것이다. 백엔드에서 발생한 애매오류는 500오류로.

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

 

503  Service Unavailable는,
서비스 이용이 불가한 것을 말한다.

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

 

 

500에러는 정말 서버에 문제가 있는 것이 아니면 5xx 에러를 내면 안된다.

예를 들면, 만19세 미만의 사람이 만19세 이상만 구입가능한 물건을 주문을 요청했을 때, 500에러를 내면 안된다.
왜냐하면, 5xx에러는 정말 서버에 문제가 있을 때 내야한다. 그래야 모니터링 툴로 5xx에러가 발생하면 "이건 서버에 심각한 문제가  있다!"라고 모니터링을 하기 때문이다.

사실 이 기준이 사람마다 좀 다르긴한데, 
예를 들어 20세 이상에게만 제공하는 서비스인데, 15세가 들어오면, 이것은 "정상 프로세스"인 것이다.
이런것은 비즈니스 로직상 예외 케이스 인 것인데 이런것을 5xx대 에러를 내면 안된다.

서버가 내부적으로 문제가 생가서 쿼리에 문제가 생긴다든지, nullpointerException이 나거나 DB가 내려가거나 등
정말 서버에 문제가 있을 때 500대 에러를 내야한다.

나머지는 400으로 해결하거나 200으로 해결해야 한다.

 

 

반응형