일시적인 리다이렉션
302, 307, 303
- 리소스의 URI가 일시적으로 변경된다.
- 따라서 검색엔진 등에서 URL을 변경하면 안된다(영구적으로 바뀐것이 아니므로).
307과 303의 탄생 비화 😂
원래는 302 statusCode로 리다이렉트시 요청 메소드가 POST 였으면 POST로 재요청하도록 스펙을 만든 것이었는데,
브라우저들이 301처럼 get으로 모두 바꿔서 요청하는 바람에 하는 수 없이 302는 get으로 변하도록, 307은 원래 요청 메소드와 변하지 않도록 스펙을 추가하였다고 한다. 303은 302가 거의 다 get으로 바꿔 보내지만 MAY이므로 무조건적으로 리다이렉트가 get이었으면 하는 바람 때문에 생긴 Status Code 이다.
- 302, 307, 303의 기능은 모두 같으나 아래처럼 내부적으로 다르다.
302 Found
- 리다이렉트시, 요청 메소드가 GET으로 변하고, 본문은 제거될 수 있음. (MAY)
- MAY의 범주는 (1)GET으로 변할 수 있고, (2) 본문이 제거될 수 있다는 것 둘 다 이다.
307 Temporary Redirect
- 리다이렉트시, 요청 메소드와 본문 유지(요청 메소드를 변경하면 안된다. (MUST NOT)
303 See Other
- 리다이렉트시, 요청 메소드가 GET으로 변경.
=> 하지만 302만으로도 모든 것을 다 할 수 있기 때문에 실무에서는 302만 사용한다고 한다.
꼭 일시적인 리다이렉션을 써야 하는 경우가 있다. 그건 바로 PRG.
PRG: POST/Redirect/Get
일시적인 리다이렉션 - 예시
- POST로 주문후에 웹 브라우저를 새로고침하면?
- 새로고침하면, 브라우저가 마지막 요청을 재요청하는 것이기 때문에 주문을 다시 요청하게 된다. (즉 POST로 주문을 재요청하게 된다, 사용자는 단순 목적으로 페이지 갱신을 위해 새로고침을 한것뿐일 수도 있지만 말이다 😭)
- 중복 주문이 될 수 있다.
PRG 사용전, 중복 주문이 될 수 있다.

=> 물론 이런건 서버에서 잘 막아야 한다. 클라이언트가 상품 id를 미리 만들어 놓고, 서버가 받아서 이건 잘못된 id(이미 사용된)라고 판단하는 식으로 막아놔야 한다. 하지만 클라이언트 단에서 먼저 막아줘야 한다. 그것이 바로 PRG이다.
PRG: POST/Redirect/Get
일시적인 리다이렉션 - 예시
사용자 사용성에서도 이것이 훨씬 좋다.
- POST로 주문 후에 새로 고침으로 인한 주문 중복 방지
- POST로 주문 후에 주문 결과 화면을 GET 메소드로 리다이렉트
- ⭐️새로고침해도 결과 화면을 GET으로 조회⭐️
- 중복 주문 대신에 결과 화면만 GET으로 다시 요청

그래서 뭘 써야 하나요?
302, 307, 303
- 잠깐 정리
- 302 Found -> GET으로 변할 수 있음
- 307 Temporary Redirect -> 메서드가 변하면 안됨
- 303 See Other -> 메서드가 GET으로 변경
- 역사
- 처음 302 스펙의 의도는 HTTP 메서드를 유지하는 것
- 그런데 웹 브라우저들이 대부분 GET으로 바꾸어버림(일부는 다르게 동작)
- 그래서 모호한 302를 대신하는 명확한 307, 303이 등장함(301 대응으로 308도 등장)
- 현실
- 307, 303을 권장하지만 현실적으로 이미 많은 애플리케이션 라이브러리들이 302를 기본값으로 사용
- 자동 리다이렉션시에 GET으로 변해도 되면 그냥 302를 사용해도 큰 문제 없음
기타 리다이렉션: 300, 304
304 Modified 는 정말 많이 사용한다고 한다. 따라서 잘 알아두자.
- 304 Modified
- 캐시를 목적으로 사용
- 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 클라이언트는 로컬PC에 저장된 캐시를 재사용한다. (캐시로 리다이렉트한다)
- 304 응답은 응답에 메시지 바디를 포함하면 안된다. (로컬 캐시를 사용해야 하므로)
- 조건부 GET, HEAD 요청시 사용
- 300 Multiple Choices: 안쓴다.
리다이렉션에서 제일 궁금한 것
리다이렉트 Status Code 를 받았을때 웹 브라우저에서 알아서 처리해주는가 아니면 웹 클라이언트 개발자가 직접 처리해주는가
'HTTP' 카테고리의 다른 글
[HTTP] Payload 용어 설명 (0) | 2022.02.15 |
---|---|
모든 개발자를 위한 HTTP 웹 기본 지식_섹션6_4xx_5xx_에러코드 (0) | 2022.02.15 |
모든 개발자를 위한 HTTP 웹 기본 지식_섹션6_3xx_Redirection(1) (0) | 2022.02.14 |
모든 개발자를 위한 HTTP 웹 기본 지식_섹션5_HTTP메소드_응용 (0) | 2022.02.08 |
모든 개발자를 위한 HTTP 웹 기본 지식_섹션4_HTTP_메서드 (0) | 2022.02.06 |