👨🏻💻 스테이터스 코드의 중요성
- 스테이터스 코드는 클라이언트의 움직임을 좌우하는 중요한 역할을 담당
- 응답에 어떤 스테이터스 코드를 포함하느냐는 중요하다
👨🏻💻 스테이터스 라인의 복습
- 스테이터스 라인
- 프로토콜 버전
- 스테이터스 코드
- 텍스트 프레이즈
- 스테이터스 코드에 대응하는 설명구
- 스펙에 예시된 이외의 문구도 포함 가능, 단 사람이 읽을 수 있도록
👨🏻💻 스테이터스 코드의 분류와 의미
스테이터스 코드는 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에서 에러가 발생했을 때, 어떤 스테이터스 코드를 반환할지 결정하는 것은 아주 중요한 설계 검토사항입니다.