헷갈리는 HTTP 상태 코드 3XX 정리
HTTP 상태 코드 중 3XX Redirection은 요청을 완료하기 위해 유저 에이전트의 추가 조치가 필요한 경우에 반환되는 코드인데, 표준 스펙의 설명이 헷갈리는 부분이 있어 정리해둔다.
3XX¶
기본적으로 웹 브라우저는 3XX 응답의 결과에 Location
헤더가 있으면 해당 위치로 자동 이동(redirect)한다.
redirection의 종류는 아래와 같다.
- 영구 리다이렉션: 특정 리소스의 URI가 영구적으로 이동
- 일시적 리다이렉션: 일시적인 변경(주문 완료 후 주문 내역 페이지로 이동하는 경우)
- 특수 리다이렉션: 결과 대신 로컬 캐시를 이용
영구 리다이렉션¶
리소스의 URI가 영구적으로 이동했기 때문에 기존의 URI를 더 이상 사용하지 말라는 의미로, 검색 엔진들이 변경을 인지한다.
301
Moved Permanently- 리다이렉트 시 요청 메서드가
GET
으로 변하고, 본문이 제거될 수 있음
- 리다이렉트 시 요청 메서드가
308
Permanent Redirect301
과 기능은 같으나 리다이렉트 시 요청 메서드와 본문 유지
일시적 리다이렉션¶
리소스의 URI가 일시적으로 변경됨. 검색 엔진 등이 URL을 변경하면 안 된다.
302
Found- 리다이렉트 시 요청 메서드가
GET
으로 변하고, 본문이 제거될 수 있음
- 리다이렉트 시 요청 메서드가
307
Temporary Redirect- 리다이렉트 시 요청 메서드와 본문 유지
303
See Other- 리다이렉트 시 요청 메서드가
GET
으로 변경
- 리다이렉트 시 요청 메서드가
일시적 리다이렉션의 활용
POST
로 주문 후에 웹 브라우저를 새로고침하면 재요청이 되어 중복 주문/결제가 발생할 수 있다. 이런 현상을 PRG(Post/Redirection/Get) 패턴을 통해 방지하고자 하는 경우 302
, 303
코드를 반환하면 된다.
Note
302
코드의 최초 의도는 HTTP 메서드를 유지하는 것이었으나, 웹 브라우저 구현 시 대부분 GET
으로 바꾸어 버려 작동 방식이 통일되지 않는 문제가 발생했다.
302
스펙을 재정의 하는 대신 명확한 의미를 가진 307
, 303
을 새롭게 정의했다.
표준 스펙은 일시적 리다이렉션 시 307
, 303
사용을 권장하지만 현실적으로 이미 많은 애플리케이션 라이브러리들이 302
를 기본값으로 사용하고 있기 때문에, 자동 리다이렉션 시 GET
으로 변해도 되는 경우 그냥 302
를 사용해도 문제가 없다.
기타 리다이렉션¶
304
Modified- 캐시를 목적으로 사용하며, 클라이언트에게 리소스가 수정되지 않았음을 알려줌
- 클라이언트는 로컬 PC에 저장된 캐시를 재사용해야함
- 로컬 캐시를 사용해야하기 때문에
304
응답은 메세지 바디를 사용해서는 안 됨 - 조건부
GET
,HEAD
요청 시 사용함