HTTP 상태코드
HTTP 상태코드란 클라이언트가 서버로 보낸 요청의 처리가 잘 진행 되었는지를 응답에서 알려주는 기능을 말한다. 상태 코드는 100~500번대 까지 존재하며 각 100번 대마다 가지는 의미는 다음과 같다.
- 1xx (Informational): 요청이 수신되어 처리중
- 2xx (Successful): 요청 정상 처리
- 3xx (Redirection): 요청을 완료하려면 추가 행동이 필요
- 4xx (Client Error): 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음
- 5xx (Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못함
그런데 만약 위의 상태코드 이외의 299와 같은 새로운 코드가 나타나면 어떻게 할까? 미래에서 새로운 상태 코드가 추가 되더라도 백의 자리 숫자 x00에 따라 의미를 인식하고 처리하면 된다. 예시로 말한 299와 같은 코드는 200번대 코드이므로 Successful하게 요청을 처리했다고 이해하면 될 것이다. 따라서 미래에 새로운 상태 코드가 추가되더라도 클라이언트 측에서는 변경할 필요가 없어진다.
1xx (Informational) - 처리중
100번대 상태 코드는 요청이 서버에서 처리중이라는 뜻이다. 그런데 보통 실무에서 거의 쓰이지 않는다. 아마도 처리중이라는 상태를 응답할 이유가 없기 때문이지 않을까 싶다.
2xx (Successful) - 성공
200번대 상태 코드는 클라이언트의 요청을 성공적으로 처리하고 응답이 왔다는 것을 뜻한다. 가장 흔히 사용되는 상태 코드는 다음과 같다.
- 200 OK
- 정상적인 요청 성공을 했다는 뜻이다.
- 201 Created
- POST 요청을 통해 새로운 리소스가 서버에 생겼음을 알릴 때 사용하는 상태 코드이다.
- 새롭게 생성한 리소스 경로는 응답의 Location 헤더에 담아 반환한다.
- 202 Accepted
- 요청이 접수되었지만 처리가 완료되지 않을 때 사용하는 코드이다.
- 배치 처리 같은 곳에서 사용할 수 있다. (등록은 되었지만 실제 처리는 나중에 되는 경우)
- 204 No Content
- 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없을 경우이다.
- 흔한 예시로 웹 문서 편집할 때를 들 수가 있는데 수시로 저장하는 환경에서 save만 하고 페이지는 넘어가지 않을 때 204를 반환함으로써 성공을 인식할 수 있도록 처리해줄 수 있다.
3xx (Redirection) - 리다이렉션: 성공을 위한 추가 행동 필요
300번대는 클라이언트가 서버에 요청하였을 때 서버의 로직을 완수하기 위해 유저의 추가 조치가 필요한 경우를 말한다. 만약 웹 브라우저가 300번대 상태 코드를 받고 응답의 Location 헤더가 존재하면 Location의 위치로 자동 이동(리다이렉트)시켜 클라이언트가 추가적인 조치를 취할 수 있도록 한다.
리다이렉션의 이해
리다이렉션에는 세 가지 종류가 있다. 영구 리다이렉션, 일시 리다이렉션, 특수 리다이렉션이다.
영구 리다이렉션은 특정 리소스의 URI가 영구적으로 이동한 것을 말한다. 예를들어 어떤 이벤트 페이지가 영구적으로 변경되어 새로운 이벤트 페이지로 자동 이동해야하는 경우를 말한다. 영구 리다이렉션은 기본의 URL을 사용하지 않게 되고, 검색 엔진 등에서도 이 변경을 인지하게 된다. 301, 308 상태 코드가 같은 기능을 하며 본문 내용을 유지하는 지에 대한 차이점이 있다.
일시 리다이렉션은 URI의 일시적 변경이 일어날 때이다. 일시적으로 바뀌는 리다이렉션이므로 검색 엔진 등에서 URL을 변경하면 안된다. 실무에서 많이 쓰이는 리다이렉션이다. 302, 307, 303 상태코드가 대표적 예시이며 기능은 똑같으나 미세한 차이가 있다.
일시 리다이렉션이 반드시 필요한 경우는 주문 완료 후 주문 내역 화면으로 이동하는 경우이다. 주문 완료(POST)가 일어나게되면 Redirect가 일어나게 되면서 다른 페이지를 보여주는(GET) 패턴이다. 주문은 중복 처리가 되면 안되기 때문에 302 Found나 303 See Other를 보냄으로서 주문 결과 화면(GET)으로 Redirect시키는 것이다. 사용자가 새로고침을 하더라도 마지막 요청이 결과 화면을 보여주는 요청이므로 중복 주문이 되지 않는다. 이를 PRG 패턴이라 부른다.
특수 리다이렉션은 클라이언트가 사용하던 캐시의 유효기간이 만료되어 서버에 요청하는 상황에서 서버가 새롭게 리소스를 보내줄 필요가 없다고 판단되었을 때 특수 리다이렉션을 통해 클라이언트가 캐시를 그대로 사용할 수 있도록 하는 리다이렉션이다.
리다이렉션의 예시
- 300 Multiple Choices - 기타 리다이렉션
- 사용하지 않음.
- 301 Moved Permanently - 영구 리다이렉션
- 기존에 사용하던 페이지(`/event`)가 변경되어 새로운 페이지(`/new-event`)로 이동해야할 때 사용한다.(사용자가 북마크를 해놓았을 수도 있기 때문에 편의성을 위하여 조치를 취해둔다.)
- 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있다(MAY)
- 만약 사용자가 등록하기 위한 정보 입력을 마친 후 POST 요청을 보내어 301 리다이렉트가 되게 되면 그 동안 작성했던 내용이 모두 사라지게 되어 사용자 경험상 좋지 않을 수도 있다.
- 하지만 실무에서는 보통 URI가 `/event`에서 `/new-event`로 바뀌게 되면 내부적으로 보내야하는 데이터가 바뀌는 경우가 많으므로 301을 사용하여 GET으로 리다이렉트하는 경우가 많다.
- 302 Found - 일시 리다이렉션
- 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거 될 수 있다.(MAY)
- 최초 HTTP 스펙에서는 리다이렉트를 하더라도 유지하는 것으로 생각하고 작성하였으나 이에 대한 디테일 설명이 없다보니 대부분의 웹 브라우저에서 GET 메서드로 바꾸어 리다이렉트 하도록 구현하였다. 이에 따라 요청 메서드 POST를 유지하는 307 상태 코드가 새롭게 만들어지게 되었다.
- 현실적으로는 명확한 의미의 303, 307을 사용하고 싶으나 실무에서는 대부분 302를 사용한다.
- 303 See Other - 일시 리다이렉션
- 302와 기능이 같으나 리다이렉트시 요청 메서드가 GET으로 바뀐다. 302의 GET 변경 확정 버전.
- 304 Not Modified - 기타 리다이렉션
- 캐시를 목적으로 사용하는 코드이다. 클라이언트에게 리소스가 수정되지 않았음을 알려줌으로써 네트워크 낭비를 줄이고 클라이언트가 가진 캐시로 리다이렉트 할 수 있도록 만들어준다.
- 304 응답은 응답에 메시지 바디를 포함하면 된단다. (로컬 캐시를 사용해야하기 때문)
- 조건부 GET, HEAD 요청시 사용한다.
- 307 Temporary Redirect - 일시 리다이렉션
- 302와 기능이 같지만 리다이렉트시 요청 메서드와 본문을 유지한다.(요청 메서드를 변경하면 안된다. MUST NOT)
- 308 Permanent Redirect - 영구 리다이렉션
- 301과 기능이 같지만 리다이렉트시 요청 메서드와 본문을 유지할 수 있다. 처음 POST를 보내면 리다이렉트될 때도 POST 요청의 바디 메세지까지 가지고 이동하여 서버에 요청해준다.
- 보통 301을 많이 사용한다.
4xx (Client Error) - 클라이언트 오류
400번대 코드는 클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없을 때 사용하는 오류이다. 중요한 점은 오류의 원인이 클라이언트에게 있다는 점이다. 클라이언트가 보내는 요청이 문제이므로 재시도를 하더라도 실패하게 된다.
- 400 Bad Request
- 클라이언트가 잘못된 요청을 해서 서버가 처리할 수 없음을 알리는 상태코드
- 요인으로는 요청 구문, 메시지(요청 파라미터 오류, API 스펙 불일치 오류) 등등 오류가 있을 수 있다.
- 서버 개발자는 이런 모든 가능성을 사전에 서버에서 차단하고 막아야 한다. 500 에러가 사용자에게 가면 안된다.
- 클라이언트는 요청 내용을 다시 검토하고 보내야만 처리가 가능하다.
- 401 Unauthorized
- 인증(Authentication - 로그인)이 되지 않은 경우에 응답되는 상태 코드이다.
- 401 에러가 발생되면 응답에 `WWW-Authenticate`헤더와 함께 인증 방법을 설명해줘야 한다.
- 401 에러 이름이 Unauthorized(권한 부여)이지만 인증(Authentication)에 대한 에러이다.(아쉬움)
- 403 Forbidden
- 서버가 요청을 이해했지만 승인을 거부한 경우이다.
- 주로 인증 자격 증명(로그인)은 있지만, 접근 권한이 불충분한 경우에 응답받게 된다.
- 예) 관리자가 아니라면 해당 정보를 접근할 수 없다.
- 404 Not Found
- 요청 리소스를 찾을 수 없을 때 나오는 상태 코드이다.
- 또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 때 사용한다.
5xx (Server Error) - 서버 오류
500번대 상태 코드는 서버에 문제가 생겨 응답할 수 없는 경우에 나오는 상태 코드이다. 클라이언트의 실패 요인이 아니므로 재시도의 경우에 성공할 가능성 존재하게 된다. 서버에서 발생하는 애매한 모든 문제는 500 에러를 사용하면 된다. 500 에러는 반드시 서버에 문제가 생겼을 때만 발생하도록 짜야한다.
- 503 Service Unavailable - 서비스 이용 불가
- 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없을 때 사용한다.
- Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수도 있다.
- 보통의 경우 서비스 장애는 갑자기 터지므로 503 코드를 보기가 힘들고 바로 500을 보게 된다.
'노트 정리 > 모든 개발자를 위한 HTTP 웹' 카테고리의 다른 글
[HTTP 웹] 8. HTTP 헤더 - 옵션 종류 (0) | 2022.10.31 |
---|---|
[HTTP 웹] 7. HTTP 헤더 (0) | 2022.10.30 |
[HTTP 웹] 5. HTTP 메서드 활용 (0) | 2022.10.28 |
[HTTP 웹] 4. HTTP 메서드 (0) | 2022.10.27 |
[HTTP 웹] 3. HTTP 기본 (0) | 2022.10.26 |