[목차]
chapter 01. 웹이란 무엇인가?
chapter 02. 웹의 역사
chapter 03. REST 웹의 아키텍처 스타일
chapter 04. URI의 스펙
chapter 05. URI의 설계
chapter 06. HTTP의 기본
chapter 07. HTTP 메서드
chapter 08. 스테이터스 코드
스테이터스 코드의 중요성
- HTTP의 스테이터스 코드는 클라이언트의 움직임을 좌우하는 중요한 역할을 담당
- 응답에 잘못된 스테이터스 코드를 할당해버리면 클라이언트가 혼동하여 시스템 전체의 동작에 지장을 초래함
- 스펙에서 정해진 스테이터스 코드의 의미를 바르게 이해하는 것이 중요함
스테이터스 라인의 복습
응답 메시지의 첫째 줄에 있는 스테이터스 라인은 프로토콜 버전, 스테이터스 코드, 텍스트 프레이즈로 이뤄진다. → 이중 가장 중요한 것이 스테이터스 코드
HTTP/1.1 **200 OK**
Content-Type: application/xhtml+xml; charset=utf=8
...
- 위 메시지에서의 스테이터스 코드는 200으로 클라이언트의 요청이 정상적으로 종료되었음을 나타냄
- 텍스트 프레이즈에는 스테이터스 코드에 대응하는 설명구가 들어감 → 사람이 읽을 수 있도록 한 것. 스펙 이외의 문구도 들어갈 수 있음
스테이터스 코드의 분류와 의미
RFC 2616에 정의된 바에 의하면 HTTP 1.1 스테이터스 코드는 3자리의 숫자며, 첫째 자리의 숫자에 따라 다음의 5가지로 분류한다.
1xx: 처리중
- 처리가 계속되고 있음을 의미.
- 클라이언트는 그래도 요청을 계속하던지 서버의 지시에 따라 프로토콜을 업데이트하여 재전송
2xx: 성공
- 요청이 성공했음을 나타냄
3xx: 리다이렉트
- 다른 리소스로의 리다이렉트를 의미
- 클라이언트는 이 스테이터스 코드를 받았을 때 응답메시지의 Location 헤더를 보고 새로운 리소스로 접속함
4xx: 클라이언트 에러
- 클라이언트 에러로, 원인이 클라이언트의 요청에 있음
- 에러를 해결하지 않는 한, 정상적인 결과를 얻을 수 없기 때문에 같은 요청을 그대로 재전송할 수 없음
5xx: 서버 에러
- 서버 에러로, 원인이 서버에 있음
- 서버 측의 원인이 해결되면, 동일한 요청을 재전송해서 정상적인 결과를 얻을 가능성이 있음
이렇게 첫번째 숫자로 스테이터스 코드를 분류함으로써, 클라이언트는 우선 그 숫자를 보고 서버가 어떤 응답을 보낸 것인지 이해할 수 있으며, 클라이언트 측에서 어떻게 처리해야 할지 대략 알 수 있게 된다.
- 클라이언트와 서버 간의 약속을 최소한으로 억제하고 클라이언트와 서버의 결함을 가능한 한 완화시킴
- 클라이언트가 모르는 스테이터스 코드가 오더라도 처음 숫자의 약속만 지켜지면 최소한의 처리가 가능해짐
자주 사용되는 스테이터스 코드
200 OK - 요청 성공
- 요청이 성공했음을 의미
- GET의 경우 바디에 리소스의 표현이, PUT과 POST의 경우엔 바디에 처리 결과가 들어감
201 Created - 리소스 작성 성공
- 리소스를 새로 작성했음을 의미
- POST와 PUT에 대한 응답으로서 반환됨
- 응답 바디에 관습적으로 새로 작성한 리소스의 표현을 넣는데 의무사항은 아님
- 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과 같은 처리를 하도록 스펙으로 지정됨
401 Unauthorized - 접근 권한 없음, 인증 실패
- 적절한 인증 정보를 부여하지 않은 채 리다이렉트를 수행했음을 의미
- WWW-Authenticate 헤더에서 클라이언트에 대해 인증방식을 전달함
404 Not Found - 리소스 없음
- 지정한 리소스를 찾을 수 없음을 의미
- 응답 바디에 그 이유가 들어감
500 Internal Server Error - 서버 내부 에러
- 서버 측에서 무엇인가 이상이 발생해서 정상적인 응답을 보낼 수 없다는 것을 나타냄.
- 응답 바디에 그 이유가 들어감
- 다른 적절한 서버 에러를 나타내는 스테이터스 코드가 없는 경우에도 사용
- 클라이언트가 모르는 5xx 계열 스테이트 코드가 반환된 경우, 500과 같은 처리를 하도록 스펙으로 지정됨
503 Service Unavailable - 서비스 정지
- 서버가 점검 등으로 일시적으로 액세스 할 수 없다는 것을 보여줌
- 응답 바디에 그 이유가 들어감
- 응답의 Retry-After 헤더로 서비스 재개 시기가 대략 몇 십 초 후인지 통지할 수 있음
스테이터스 코드와 에러 처리
에러 코드는 HTTP 스펙에 규정되어 있지만 바디에 어떤 에러 메시지가 들어가는지는 규정되어 있지 않음
- 보통 사람을 대상으로하는 웹 서비스에서 404이면, ‘페이지를 찾을 수 없다’는 메시지가 담긴 HTML을 추가하는 것이 일반적
- 프로그램용 웹 API의 경우, 클라이언트가 HTML을 해석할 수 없는 경우도 있기 때문에, 클라이언트가 해석할 수 있는 형식으로 에러 메시지를 반환하는 것이 좋음
- 프로토콜에 따른 포맷으로 에러를 반환하거나, Accept 헤더에 따른 포맷으로 에러를 반환하는 방법이 있다.
스테이터스 코드의 오용
- HTTP의 스테이터스 코드를 바르게 사용하는 것은 최소한의 매너다.
- 빠르게 사용하지 않은 경우, 에러를 웹 API 측의 의도대로 처리하기 위해서는 전용 클라이언트를 구현해야 하는데, 이는 다양한 클라이언트에서 이용할 수 있다는 웹 API의 특징을 훼손하게 된다.
스테이터스 코드를 의식해서 설계한다
- 스테이터스 코드는 크게 5종류로 분류할 수 있으며 각각 의미가 있다.
- 스테이터스 코드는 스펙에 의해 고정되어 있기 때문에 임의로 추가할 수 없다.
- 중요한 것은 스테이터스 코드를 바르게 사용하는 것!
- 개발 중인 서비스에서 에러가 발생했을 때, 어떤 스테이터스 코드를 반환할지 결정하는 것은 아주 중요한 설계 검토사항임
스테이터스 코드의 구현
스테이터스 코드의 구체적인 구현방법은 웹 서비스와 프레임워크에 따라 달라짐
Apache
- 정적인 파일을 보내는 경우, 보내는 파일의 조건에 따라 자동적으로 결정
- 요청한 파일이 존재하지 않으면 404, 파일 접근 시 인증이 필요하면 401 반환
- mod_rewrite 모듈을 통해 임의의 스테이터스 코드를 반환하도록 설정 가능
서블릿
- HttpServletResponse 클래스의 setStatus()와 setError()를 사용하여 설정
- 각 스테이터스 코드는 HttpServletResponse의 상수 필드로 정의되어 있음
Ruby on Rails
- 컨트롤러에서 render메서드를 사용해 결과를 렌더링할 때 인수로 스테이터스 코드 값을 전달
- 각 스테이터스 코드는 심볼(:ok(200), :not_found(404))로 참조
반응형
'개발 서적 > 웹을 지탱하는 기술' 카테고리의 다른 글
[웹을 지탱하는 기술] chatper 09. HTTP 헤더 (0) | 2022.04.18 |
---|---|
[웹을 지탱하는 기술] chatper 07. HTTP 메서드 (0) | 2022.04.07 |
[웹을 지탱하는 기술] chapter 06. HTTP의 기본 (0) | 2022.03.28 |
[웹을 지탱하는 기술] chapter 05. URI의 설계 (0) | 2022.03.15 |
[웹을 지탱하는 기술] chapter 04. URI의 스펙 (0) | 2022.03.14 |