[웹 개발자를 위한 웹을 지탱하는 기술] - 스테이터스 코드

김성혁·2022년 4월 25일
0

👨🏻‍💻 스테이터스 코드의 중요성

  • 스테이터스 코드는 클라이언트의 움직임을 좌우하는 중요한 역할을 담당
    • 응답에 어떤 스테이터스 코드를 포함하느냐는 중요하다

👨🏻‍💻 스테이터스 라인의 복습

  • 스테이터스 라인
    • 프로토콜 버전
    • 스테이터스 코드
    • 텍스트 프레이즈
      • 스테이터스 코드에 대응하는 설명구
      • 스펙에 예시된 이외의 문구도 포함 가능, 단 사람이 읽을 수 있도록

👨🏻‍💻 스테이터스 코드의 분류와 의미

스테이터스 코드는 3자리의 숫자이며, 첫째 자리의 숫자에 따라 5가지로 분류함

  • 1XX : 처리중
    • 처리가 계속되고 있음을 나타낸다. 클라이언트는 그대로 요청을 계속하던지 서버의 지시에 따라 프로토콜을 업데이트 하여 재전송
  • 2XX : 성공
    • 요청이 성공했음
  • 3XX : 리다이렉트
    • 다른 리소스로의 리다이렉트를 나타낸다. 클라이언트는 이 스테이터스 코드를 받았을 때 응답 메시지의 Location 헤더를 보고 새로운 리소스로 접속한다.
  • 4XX : 클라이언트 에러
    • 클라이언트 에러를 나타낸다. 원인은 클라이언트의 요청에 있다. 에러를 해결하지 않는 한, 정상적인 결과를 얻을 수 없기 때문에 같은 요청을 그대로 재전송할 수는 없다.
  • 5XX : 서버 에러
    • 서버 에러를 나타낸다. 원인은 서버에 있다. 서버 측의 원인이 해결되면, 동일한 요청을 재전송해서 정상적인 결과를 얻을 가능성이 있다.

첫 번째 숫자를 이용한 스테이터스 코드의 분류 방식은 클라이언트와 서버 간의 약속을 최소한으로 억제하고 클라이언트와 서버의 결합을 가능한 한 완화하기 위해, 즉 소결합을 위해 고안된 것입니다.

  • 시스템이 소결합 되었을 때의 이점
    • 컴포넌트 간의 독립성이 높아짐
    • 컴포넌트의 치환이나 확장이 용이해짐

👨🏻‍💻 자주 사용되는 스테이터스 코드

200 OK - 요청 성공

  • GET의 경우 바디에 리소스의 표현이 들어갑니다.
  • PUT과 POST의 경우 바디에 처리결과가 들어갑니다.

201 Created - 리소스 작성 성공

  • 응답 바디에 관습적으로 새로 작성한 리소스의 표현을 넣는 일이 많은데, 특별히 아무것도 넣지 않아도 상관없습니다.
  • POST의 경우, 새로 작성한 리소스의 URI는 응답 메시지의 Location 헤더에 절대 URI로 들어갑니다.
  • PUT의 경우, 클라이언트가 새로운 리소스의 URI를 이미 알고 있으므로 Location 헤더는 들어가지 않습니다.

301 Moved Permanently - 리소스의 항구적인 이동

  • 요청에서 지정한 리소스를 새로운 URI로 이동했다는 것을 나타냅니다.
    • 예전 URI를 계속 유지하면서 새로운 URI로 이동할 때 이 스테이터스 코드를 이용
    • 새로운 URI는 응답의 Location 헤더에 절대 URI로 들어감

303 See Other - 다른 URI의 참조

  • 리다이렉트에 대한 처리 결과를 다른 URI로 취득할 수 있음
  • 일반적으로 POST로 리소스를 조작한 결과를 GET으로 가져올 때 사용

400 Bad Request - 요청 오류

  • 요청 구문이나 파라미터가 잘못됨
  • 또한 적절한 클라이언트 에러를 나타내는 스테이터스 코드가 없는 경우에 사용
  • 또한 클라이언트가 모르는 4XX 계열 스테이터스 코드가 반환된 경우, 400 Bad Request와 같은 처리를 하도록 스펙으로 정해짐

401 Unauthorized - 접근 권한 없음, 인증 실패

  • 적절한 인증정보를 부여하지 않은 채 리다이렉트를 수행했다는 것을 나타냄
  • 응답의 WWW-Authenticate 헤더에서 클라이언트에 대해 인증방식을 전달

404 Not Found - 리소스 없음

  • 응답 바디에는 그 이유가 들어갑니다.

500 Internal Server Error - 서버 내부 에러

  • 응답 바디에는 이상의 이유가 들어갑니다.
  • 다른 적절한 서버 에러를 나타내는 스테이터스 코드가 없는 경우에도 사용
  • 또한, 클라이언트가 알지 못하는 5XX 계열이 스테이터스 코드가 반환된 경우, 500 Internal Server Error와 같은 동작을 처리하도록 스펙으로 정해짐.

503 Service Unavailable - 서비스 정지

  • 서버가 점검 등의 이유로 일시적으로 액세스 할 수 없다는 것을 알림
  • 응답 바디에 그 이유가 들어감
  • 응답의 Retry-After 헤더로 서비스 재개 시기가 대략 몇 십 초 후인지 통지할 수 있습니다.

👨🏻‍💻 스테이터스 코드와 에러처리

에러 상황 시 바디에 어떤 에러 메시지가 들어가는지는 규정되어 있지 않기 때문에 보통 웹 서비스에서 404 Not Found이면, ‘지정한 페이지를 찾을 수 없다'는 메시지가 들어간 HTML을 바디에 추가하는 것이 일반적.

하지만 프로그램용 웹 API의 경우 클라이언트가 반드시 HTML을 해석할 수 있다고는 단정할 수 없기 때문에 에러 메시지를 반환해 주는 것이 친절하다.

  • 프로토콜에 따른 포맷으로 에러를 반환
  • Accept 헤더에 따른 포맷으로 에러를 반환
    • 클라이언트가 Accept 헤더를 전송하고 있는 경우는, 그것을 이용해 에러 정보의 표현을 동적으로 변경 가능

👨🏻‍💻 스테이터스 코드의 오용

스테이터스 코드는 바르게 목적에 맞게 사용해야 합니다.

👨🏻‍💻 스테이터스 코드를 의식해서 설계한다

개발 중인 웹 서비스나 웹 API에서 에러가 발생했을 때, 어떤 스테이터스 코드를 반환할지 결정하는 것은 아주 중요한 설계 검토사항입니다.

0개의 댓글