[HTTP] HTTP 상태 코드 - 3xx Redirection
이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
⛅️ 3xx - Redirection
✅ Redirection 리다이렉션이란?
서버의 3xx 응답의 결과에 Location 헤더가 있다면, 웹 브라우저가 Location 위치로 자동으로 이동하는 것을 말한다.
⛅️ 영구 리다이렉션 - 301, 308
✅ 영구 리다이렉션이란?
● 특정 리소스의 URI가 영구적으로 이동하는 것을 말한다. ex) /event → /new-event
● 원래 URL을 사용하지 않음 → 검색 엔진 등에서도 변경을 인지해야 함
✅ 301 Moved Permanently
● 리다이렉트 시, 요청 메서드가 GET으로 무조건 변경.
● 본문(body)이 제거될 가능성이 있음.
POST를 통해 메세지 바디에 등록할 정보 전달 → 서버에서 301와 함께 Location 헤더에 새로 이동해야 할 URL 제공
→ 301은 리다이렉트 시, 요청 메서드가 GET로 변경 & 메세지 바디 제거 → ...
✅ 308 Permanent Redirect
● 리다이렉트 시, 요청 메서드 & 본문이 유지된다.
(처음에 POST를 보냈으면, 리다이렉트 후에도 POST 유지 & 본문 내용 유지)
● 그 외엔 301과 기능은 같음.
POST를 통해 메세지 바디에 등록할 정보 전달 → 서버에서 308과 함께 Location 헤더에 새로 이동해야 할 URL 제공
→ 308은 리다이렉트 시, 요청 메서드와 메세지 바디 유지 → ...
⛅️ 일시적 리다이렉션 - 302, 307, 303
✅ 일시적 리다이렉션이란?
● 리소스의 URI가 일시적으로 변경되는 것.
● 일시적으로 변경되는 것이기 때문에 검색 엔진 등에서 URL을 변경하면 안됨.
● 주문 후 결과 페이지로 이동과 같은 경우에 사용한다.
✅302 Found
● 리다이렉트 시, 요청 메서드가 GET으로 변경된다.
● 본문(body)이 제거될 수 있음
✅ 307 Temporary Redirect
● 리다이렉트 시, 요청 메서드 & 본문이 반드시 유지된다.
(처음에 POST를 보냈으면, 리다이렉트 후에도 POST 유지 & 본문 내용 유지)
● 그 외엔 302와 기능이 같다.
✅ 303 See Other
● 리다이렉트 시, 요청 메서드가 GET으로 변경된다.
● 그 외엔 302와 기능이 같다.
✅ 302, 307, 303 정리
307, 303을 권장하지만, 현실적으로 이미 많은 어플리케이션 라이브러리들이 302를 기본값으로 사용
자동 리다이렉션 시, 요청 메서드가 GET으로 변해도 되면 302를 사용해도 큰 지장은 없음.
✅ PRG : Post/Redirect/Get
예시 상황 : POST로 주문 후, 새로고침하는 경우 중복 주문이 되지 않도록 막아야 한다.
→ 해결 방법 : POST로 주문 후, 주문 결과 화면으로 리다이렉트할 때 요청 메서드가 GET 변경되도록 하기.
ⓐ 클라이언트가 POST를 통해 주문을 요청
ⓑ 서버가 302 Found/303 See Other + Location을 응답 메세지에 담아서 전달
ⓒ 이 후, 자동 리다이렉트
ⓓ 요청 메서드가 GET으로 변경 → 주문 완료 페이지 요청
ⓔ 클라이언트가 새로고침을 하더라도, GET 결과 화면을 다시 요청하는 것이기 때문에 중복 주문을 방지할 수 있다.
⛅️ 304 Not Modified
- 캐시를 목적으로 사용
- 클라이언트에게 리소스가 수정되지 않았음을 알려줌 → 클라이언트가 로컬 PC의 캐시를 재사용
→ 네트워크의 부담을 줄일 수 있다. - 로컬 캐시를 사용하기 때문에 응답에 message body가 포함되지 않는다.