1. 3xx (Rediretion)
300번대의 상태코드는 요청을 완료하기 위하여 유저 에이전트의 추가 조치가 필요한 것을 의미한다.
유저 에이전트는 클라이언트 프로그램을 말하며 대부분의 경우 브라우저이다.
300번대의 대표적인 상태 코드는 다음과 같다.
- 300 Multiple Choices
- 301 Moved Permanently
- 302 Found
- 303 See Other
- 304 Not Modified
- 307 Temporary Redirect
- 308 Permanent Redirect
이 중에서 300은 거의 사용되지 않으며 301 ~ 308은 중요하게 사용된다.
300번대를 설명하기 전에 리다이렉션에 대해서 이해를 할 필요성이 있다.
웹 브라우저는 300번대의 응답의 결과에 Location 헤더가 있으면 해당 Location의 위치로 자동으로 이동하는데 이것을 리다이렉트라고 한다.
리다이렉션에는 크게 3가지 종류가 있다.
- 영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동
- 일시 리다이렉션 - 일시적인 변경
- 특수 리다이렉션 - 결과 대신 캐시를 사용
그럼 리다이렉션의 종류별 상태코드를 살펴보자
영구 리다이렉션
301, 308 코드가 대표적이다.
리소스의 URI가 영구적으로 이동한 것을 말한다.
원래의 URL을 더이상 사용하지 않고 검색 엔진 등에서도 변경을 인지할 수 있다.
301과 308은 사실 기능이 비슷한데 둘다 경로가 완전히 변동되었다는 것을 알려주지만 301은 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거 될 수도 있다.
다만, 반드시 변하는 것은 아니고 변화 시킬 수도 있다(MAY)
반대로 308은 리다이렉트시 요청 메서드와 본문을 유지(처음 POST를 보내면 리다이렉트도 POST로 보낸다)하는 것이 차이점이다.
쉽게 말하면 301의 경우 내가 입력한 정보를 리다이렉트된 페이지에서 다시 입력을 해야하지만 308의 경우 본문을 그대로 유지하므로 반복해서 입력 할 필요가 없다.
일시적인 리다이렉션
일시적 리다이렉션은 문자 그대로 리소스의 URI가 일시적으로 변경된 것으로 검색엔진 등에서 URL을 변경해선 안된다.
실무에서 가장 많이 사용되며 302, 307, 308이 대표적이다.
먼저 302 Found는 301번과 동일한데 리다이렉트시 요청 메서드가 GET으로 변하고 본문이 제거 될 수 있다.
307 Temporary Redirect는 308과 동일하며 리다이렉트시 요청 메서드와 본문을 유지한다.
303 See Other은 302와 동일하지만 리다이렉트시 요청 메서드가 항상 GET으로 바뀐다.
그럼 이런 일시적인 리다이렉션은 어디에서 사용할까?
일반적으로 PRG라고 불리는 POST/Redirect/GET 패턴에서 많이 사용된다.
예를 들어, Post로 주문 후 웹 브라우저를 새로고침 하는 경우 중복 주문이 발생할 수 있다.
이런 현상을 방지하기 위하여 Post로 주문 후 주문 결과하면을 GET 메서드로 리다이렉트 한다.
그러면 새로고침을 해도 결과 화면이 GET이기 때문에 중복으로 POST 요청을 보내는 대신 GET 요청을 보내게 되어 중복 주문이 발생하는 현상을 막을 수 있다.
이런 패턴을 POST/Redirect/GET 이라고 하며 줄여서 PRG라고도 부른다.
PRG 사용시 사용성이 올라가고 서버 입장에서도 할 일이 줄어드는 장점이 있다.
정리 해보면 302는 Get으로 메서드가 변경이 될 수 있지만 307은 메서드가 변해선 안되며 303은 반드시 GET으로 변경되어야 한다.
실무에서는 대부분 302를 사용하며 307,303을 권장하지만 많은 애플리케이션 라이브러리들이 302를 기본값으로 사용하고 있다.
기타 리다이렉션
304 Not Modified 는 캐시를 목적으로 사용되는데 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 이렇게 하면 클라이언트는 로컬 PC에 저장된 캐시를 재사용하며 이를 통해 대용량 이미지 파일을 여러번 다운로드 하거나 하는 리소스 낭비, 시간을 줄일 수 있다.
로컬 캐시를 사용해야 하므로 304 응답은 응답에 메시지 바디를 포함하면 안된다는 특징이 있다.
2. 4xx (클라이언트 오류)
400번대는 클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할수 없는 것을 의미한다.
오류의 원인이 클라이언트에 있으며 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에, 똑같은 재시도가 계속해서 실패하게 된다.
대표적인 400번대 스펙을 살펴보자.
1. 400 Bad Request
클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없는 것을 의미한다.
요청 구문, 메시지 등에서 오류가 발생한 것을 말하며 클라이언트는 요청 내용을 다시 검토하고 보내야 한다.
예를 들어, 요청 파라미터가 잘못 되었거나 API 스펙이 맞지 않을 때 발생한다.
2. 401 Unauthorized
클라이언트가 해당 리소스에 대한 인증이 필요한 경우를 의미한다.
401 오류 발생시에는 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명해야 한다.
3. 403 Forbidden
서버가 요청을 이해했지만 승인을 거부한 경우를 말한다.
주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우 발생한다.
예를 들어 사용자가 로그인을 한 후 Admin 등급의 리소스에 접근하는 경우, Admin 등급이 아니면 접근에 대한 권한이 없기 때문에 403을 발생시킨다.
4. 404 Not Found
요청 리소스를 찾을 수 없는 경우를 의미한다.
요청한 리소스가 서버에 없는 경우 발생하며 클라이언트가 권한이 부족한 리소스에 접근 시 해당 리소스를 숨기고 싶은 경우에도 404 스펙을 이용하기도 한다.
3. 5xx (Server Error)
400번대와는 다르게 서버의 문제로 오류 발생한 경우를 의미한다.
서버에 문제가 있기 때문에 재시도시 성공할 수도 있다.
500번대의 주요 스펙은 다음과 같다.
1. 500 Internal Server Error
서버 문제로 오류 발생을 의미한다.
일반적으로 서버에서 발생한 애매한 오류인 경우 대부분 500 에러를 발생시킨다.
2. 503 Service Unavailable
서비스가 이용 불가능한 것을 의미한다.
서버가 일시적인 과부하, 혹은 예정된 작업으로 인해 잠시 요청을 처리할 수 없는 경우 503을 사용하게 된다.
Retry-After 헤더 필드로 얼마뒤에 복구되는지 응답을 보낼 수도 있다.
'HTTP' 카테고리의 다른 글
HTTP - HTTP 일반 헤더(2) (0) | 2024.01.23 |
---|---|
HTTP - HTTP 일반 헤더(1) (0) | 2024.01.19 |
HTTP - HTTP 상태코드 (1) (1) | 2024.01.16 |
HTTP - HTTP API 설계 (0) | 2024.01.15 |
HTTP - HTTP 메서드 활용하기 (0) | 2024.01.12 |