HTTP Status Code

Posted by , November 16, 2022
HTTP

안녕하세요, 이번 포스팅에서는 HTTP 의 상태코드에 대해 알아보겠습니다. 설명에 앞서, 300번대 상태코드는 내용이 길고 많이 때문에 따로 포스팅을 진행하도록 하겠습니다.


HTTP 상태코드(Status Code)란?

HTTP 상태코드는 클라이언트가 서버로 요청을 보내면, 그 요청이 잘 처리되었는지 아니면 문제가 있는지 등의 상태를 Response(응답)을 통해 알려주는 기능입니다.


HTTP 상태코드의 종류

종류는 아래와 같습니다.

  • 1xx (Informational) : 요청이 수신되어 처리중임을 의미
  • 2xx (Successful) : 요청이 정상 처리되었음을 의미
  • 3xx (Redirection) : 요청을 완료하려면 아직 추가적인 행동이 필요함을 의미
  • 4xx (Client Error) : 클라이언트의 오류, 또는 잘못된 문법등으로 인해 서버가 요청을 수행할 수 없음을 의미
  • 5xx (Server Error) : 서버 오류로, 서버가 정상적인 요청을 처리하지 못함을 의미

만약 모르는 상태의 코드가 나온다면?

미래에 새롭게 정의된 HTTP 상태코드가 나온다면, 디테일한 부분까지 이해할 필요를 하실필요는 없고 그냥 몇백번대의 코드인지만을 보시고 그에따라 코드를 처리해주시면 됩니다.

예를들어 299번과 같은 잘 모르는 상태코드를 보더라도, 2백번대 코드인것만을 인지하고 해석해서 처리해주시면 됩니다.


1xx (Informational)

  • 요청이 수신되어 처리중이라는 뜻읹데, 거의 사용하지 않으므로 스킵하셔도 됩니다.

2xx

클라이언트가 보낸 요청을 서버에서 정상적으로 잘 처리되었음을 의미

200 OK

  • 요청에 대한 처리를 성공했음을 의미합니다.

201 Created

  • 요청에 성공해서 새로운 리소스가 생성되었음을 의미합니다.
  • 이때 HTTP 헤더에 Location 이라는 것을 자동으로 넣어줍니다. 생성된 리소스는 응답의 Location 해더 필드로 식별합니다.

202 Accepted

  • 요청이 접수되었으나, 아직 처리가 완료되지 않았음을 의미합니다.

  • 활용 ex) 배치를 1시간뒤에 처리해달라는 요청일 경우, 요청을 받자마자 처리를 하나는 것이 아닌 1시간뒤에 처리를 해야합니다. 즉 이 요청을 받았다면 접수는 되었으나 아직 처리를 완료하지 않았을 떄 이러한 상태코드를 받을 수 있는 것입니다.

  • cf) 잘 사용하지 않는 경우의 상태코드임!

204 No Content

  • 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없는 경우를 의미합니다.

  • 활용 ex) 문서 편집기에서 save 저장버튼 : save 버튼을 눌러서 문서를 저장한다고 한들, 굳이 어떤 응답값을 받을 필요는 없을 겁니다.


4xx VS 5xx

다음으로는 4xx 번대 에러와, 5xx 번대 에러 상태코드에 대해 알아보겠습니다.

4xx 번대는 클라이언트가 잘못한 경우, 5xx 번대는 서버에 오류가 있을 때 발생합니다.

  • 400번대 오류 : 4xx 번대 오류는 클라이언트가 이미 잘못된 요청을 보내고 있기 떄문에, 똑같은 요청을 계속 재시도하더도 계속 실패하는 것입니다.

  • 500번대 오류 :

4xx (Client Error)

클라이언트의 요청에 잘못된 문법등으로 인해, 서버가 그 요청 자체를 받아서 수행할 수가 없을 때 발생하는 상태코드

  • 즉, 오류의 원인이 클라이언트에게 있는 경우입니다.

이때 중요한것이, 4xx 번대 오류는 클라이언트가 이미 잘못된 요청을 보내고 있기 떄문에, 똑같은 요청을 계속 재시도하더도 계속 실패하는 것입니다.

즉, 400번대 오류는 클라이언트가 제대로 올바른 요청을 보낼 때 까지 서버가 요청을 절대 못받는 상황입니다. (반면 500번대 오류는 클라이언트가 요청을 수정하지 않고, 나중에 똑같은 요청을 다시 보낸다면 성공할 가능성이 있습니다.)


400 Bad Request

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

주로 요청 구문이나, 메시지 등에 오류가 있을떄 발생하는 오류입니다. 클라이언트는 요청 내용을 다시 검토하고, 보내야합니다.

ex) 요청 파라미터가 잘못되거나, API 스펙이 맞지 않을때(예를들어 문자열을 보내야하는데 숫자를 보낸 경우)

백엔드 개발자는 API 스펙이 맞지 않는경우들에 대해 400번대 오류를 팅켜주면서 잘 처리를 해줘야한다. 그래야지 프론트가 백엔드에게 탓을 돌리지 않을수 있습니다.

  • 만일 400번대 오류로 백엔드 쪽에서 잘 처리해주지 않아서 500번대를 상태코드를 리턴하게 한다면, 클라이언트 입장에서는 서버쪽에서 잘못했다고 오해할 수도 있습니다.

401 Unauthorized

클라이언트가 해당 리소스에 대한 인증이 필요한 경우. 즉 인증(Authentication) 이 되지 않은경우다.

401 오류가 발생한다면, 응답(Response) 에 WWW-Authenticate 헤더와 함꼐 인증 방법을 설명해줘야 합니다.

이 상태코드와 관련해 참고하면 좋으실 개념은 아래와 같습니다.

인증(Authentication), 인가(Authorization)

  • 인증(Authentication) : 본인이 누구인지 확인하는 과정으로, 로그인을 의미합니다. (로그인 자체가 안되면 인증이 안되는 것이다)

  • 인가(Authorization) : 권한부여 (admin 권한처럼 특정 리소스에 접근할 수 있는 권한. 인증이 있어야 인가가 있을 수 있습니다.)

    • 로그인할 수 있는 것과, 권한이 있는 것은 다릅니다. 즉 인가라는 것은 로그인을 하고난(인증을 마친) 사용자에 대한 특정 리소스에 접근할 수 있는 권한의 레벨을 의미합니다.

403 Forbidden

서버가 클라이언트로부터 받은 요청을 이해했지만, 승인을 거부한 경우

주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우에 발생합니다. 예를들어 admin 레벨이 아닌 사용자가 로그인은 했지만, admin 만 접근할 수 있는 리소스에 접근하려는 경우에 발생합니다.


404 Not Found

요청 리소스를 찾을 수 없는 경우로, 요청 리소스가 서버에 없는 경우입니다.

  • 이게 왜 클라이언트쪽의 오류나면,** 서버 입장에서는 이런 리소스 자체가 없는데도 클라이언트가 리소스를 달라고 요청을 보낸 경우**입니다.

예를들어 클라이언트가 url 을 잘못 입력했다면, 서버 입장에서는 나는 이런 리소스(url) 이 없어서 클라이언트에게 제공해줄 수 없다는 것을 의미합니다.

또는 클라이언트가 권한이 부족한 리소스에 접근할 떄, 403 Forbidden 상태코드를 리턴하는 대신에 해당 리소스를 숨기고 싶을 떄 404 에러를 띄어줄 수 있습니다.


5xx (Server Error)

이름 그대로, 서버의 문제로 오류가 발생하 경우입니다. 서버에 문제가 있기 떄문에 재시도하면, 서버가 복구된다면 가끔씩 성공할 수도 있습니다.

백엔드 입장에서는, 왠만하면 500번대 에러는 절대 발생시키면 안됩니다. **이 에러는 진짜로 서버 내부에 심각한 문제가 터졌을 떄만 500번대 에러를 만들어야 합니다. **

예를들어 NullPointerException 예외가 터지거나, 데이터베이스에 접근이 불가능해지거나 하는 경우과 같이 서버에 내부적으로 큰 문제가 발생했을 떄만 500번대 에러를 발생시키도록 해야합니다.


500 Internal Server Error

서버 내부 안에 문제가 발생한 경우로, 대부분 백엔드 입장에서 애매한 문제들을 500번대 에러로 발생합니다.

503 Service Unavailable

서비스 이용불가 상태

서버가 일시적으로 과부화되거나, 또는 일시적으로 예정된 작업으로인해 잠시 요청을 처리할 수 없는 경우입니다.