-
HTTP 응답 메시지 - 상태 코드(State Code)CS/네트워크 2021. 12. 28. 23:03728x90
상태 코드(State Code)란?
HTTP 응답 메시지가 클라이언트가 보낸 요청의 처리 상태를 알려주는 코드입니다.
이 코드를 통해서 클라이언트는 요청이 성공했는지 실패했는지 확인할 수 있습니다.
만약 이런 상태 코드가 없다면 에러를 감지하기 위해서 해석하는 과정이 필요할 것입니다.
상태 코드의 구조
상태 코드는 3자리 숫자로 만들어져 있으면 첫째 자리는 1~5로 구성됩니다.
숫자 뒤에는 사람이 이해할 수 있는 간단한 문구가 들어갑니다.
다음은 첫번째 자리별 의미입니다. (xx는 임의의 숫자가 올 수 있음을 의미합니다.)
1xx(Informational) : 요청이 수신되어 처리 중
2xx(Successful) : 요청 정상 처리
3xx(Redirection) : 요청을 완료하려면 추가 행동이 필요
4xx(Client Error) : 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음
5xx(Server Error) : 서버 오류, 서버가 정상 요청을 처리하지 못함
첫 번째 자리별 의미를 통해 클라이언트가 인식할 수 없는 상태 코드를 받았을 때 해석할 수 있습니다.
예를 들어 클라이언트가 299 상태 코드에 대한 정보가 없어도 첫 번째 자리가 2이므로 요청이 정상 처리되었다고 해석하여 처리합니다.
그렇기 때문에 미래에 새로운 상태 코드가 추가되어도 클라이언트를 변경하지 않아도 됩니다.
1xx의 상태 코드는 거의 사용하지 않아서 생략하고 많이 사용되는 2xx ~ 5xx의 상태코드 의미를 알아보겠습니다.
2xx (Successful) - 성공
클라이언트의 요청을 성공적으로 처리
200 OK
요청이 성공적으로 완료됨 - (우리가 가장 많이 볼 수 있음)
201 Created
요청을 성공하였고 새로운 리소스가 생성됨 - (POST 요청에 의해 서버에서 자원이 생성됨)
Location 헤더 필드에 새로운 리소스의 URI를 제공합니다.
202 Accepted
요청이 접수되었으나 처리가 완료되지 않았음 - (요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리하는 경우)
배치 프로세스란?
컴퓨터로 처리하는 데이터를 일정 시간 또는 일정량에 달하기까지 축적했다가 일괄해서 연속적으로 처리하는 방식
204 No Content
서버가 요청을 성공적으로 수행하였지만, 응답 페이로드 본문에 보낼 데이터가 없음 - (결과 내용이 없어도 204 메시지만으로 성공을 인식할 수 있다.)
예를 들어 웹 문서 편집기에서 save 버튼을 눌러도 결과로 아무 내용이 없어도 됩니다.
3xx (Redirection) - 리다이렉션
요청을 완료하기 위해 유저 에이전트의 추가 조치 필요(유저 에이전트란 웹 브라우저를 의미)
웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동으로 이동합니다.
리다이렉션이란?
1. 클라이언트가 서버에게 event 페이지를 요청합니다.
2. 하지만 event 페이지는 더 이상 존재하지 않고 new-event 페이지만 존재합니다.
3. 서버는 클라이언트에게 301 Moved Permanently라는 상태 코드와 Location 헤더에 /new-event를 담아서 응답 메시지로 보냅니다.
4. 클라이언트는 응답 메시지의 상태 코드를 보고 3xx이므로 Location 정보로 리다이렉션을 합니다.
5. 클라이언트는 자동적으로 서버에게 new event 페이지를 요청합니다.
6. 서버는 클라이언트에게 200 OK라는 상태 코드와 new-event 페이지에 대한 정보를 전송합니다.
리다이렉션의 종류
영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동(위의 예제에 해당)
301 Moved Permantly
리다이렉트 시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음(GET으로 변하지 않을수도 있고 본문이 제거되지 않을 수도 있음)
처음에 POST 메서드를 사용하였지만 리다이렉트시 자동으로 GET으로 변경될 수 있습니다.(등록을 하기 위해 입력했던 정보를 다시 입력해야 할 수 있는 문제가 발생할 수 있음)
308 Permanent Redirect
301과 같은 기능이지만 301 상태 코드의 문제를 해결하기 위해 등장
리다이렉트 시 요청 메서드와 본문 유지(POST를 보내면 리다이렉트도 POST)
하지만 리다이렉션이 발생하면 내부적으로 전달해야 하는 데이터가 바뀌는 경우가 많아서 실무에서 잘 사용하지 않음
일시 리다이렉션 - 일시적인 변경 ( 주문 완료 후 주문 내역 화면으로 이동하는 경우)
실무에서 많이 쓰는 상태 코드
302 Found
리다이렉트 시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음(301 상태 코드와 같은 상황)
303과 307이 사용되기가 권장되지만 실무에서 가장 많이 사용됨
307 Temporary Redirect
302와 같은 기능이지만 302 상태 코드의 문제를 해결하기 위해 등장
리다이렉트 시 요청 메서드와 본문 유지(POST를 보내면 리다이렉트도 POST)
303 See Other
302와 같은 기능이지만 리다이렉트시 요청 메서드가 명확하게 GET으로 변경
일시 리다이렉션 예시 - PRG : Post/Redirect/Get
POST로 상품 주문 후에 웹 브라우저를 새로고침 한다면?
중복 주문이 될 수 있습니다.
따라서 중복 주문을 방지하기 위해 POST로 상품 주문 요청이 서버로 들어왔을 때 GET 메서드로 리다이렉트 합니다.
새로고침을 할 경우에도 중복 주문 대신에 결과 화면을 GET으로 조회합니다.
특수 리다이렉션 - 결과 대신 캐시를 사용(서버가 응답을 할 때 결과 대신에 캐시를 사용하라고 알려주는 경우)
304 Not Modified
캐시를 목적으로 사용
클라이언트에게 리소스가 수정되지 않았음을 알려주고 클라이언트는 로컬 PC에 저장된 캐시를 재사용한다.
로컬 캐시를 사용하므로 응답 메시지에 메시지 바디를 포함하면 안 된다.
4xx (Client Error) - 클라이언트 오류
클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없음
재시도를 하더라도 복구가 불가능한 오류
400 Bad Request
클라이언트는 요청 내용을 다시 검토하고 보내야 함(요청 파라미터가 잘못되거나, API 스펙이 맞지 않는 경우)
401 Unauthorized
클라이언트가 해당 리소스에 대한 인증이 필요함(로그인을 하지 않는 경우)
403 Unauthorized
서버가 요청을 이해했지만 승인을 거부함(주로 로그인은 했지만, 접근 권한이 불충분한 경우)
404 Not Found
요청 리소스가 서버에 없음
또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 때
5xx (Server Error) - 서버 오류
서버 문제로 오류 발생(메모리, 데이터베이스 접근 불가의 경우)
재시도를 할 때 복구가 가능할 수도 있음
500 Internal Sever Error
서버 내부에서 발생한 내부 오류는 보통 500으로 처리
503 Service Unavailable
서버가 일시적으로 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음
Retry-After 헤더 필드로 얼마 뒤에 복구되는지 보낼 수도 있음
하지만 대부분의 장애는 예측 불가능하기 때문에 보통 500이 흔하게 발생
출처
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/
https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C
'CS > 네트워크' 카테고리의 다른 글
웹 스토리지란? (0) 2022.01.03 HTTP 헤더 - 일반 헤더 (0) 2022.01.02 REST API란? RESTful API란? (0) 2021.12.27 HTTP API란? (0) 2021.12.24 HTTP 기본 (0) 2021.12.22