본문 바로가기
HTTP

모든 개발자를 위한 HTTP 웹 기본 지식_섹션6_3xx_Redirection(2)

by 킴도TV 2022. 2. 14.

일시적인 리다이렉션

302, 307, 303

  1. 리소스의 URI가 일시적으로 변경된다.
  2. 따라서 검색엔진 등에서 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 를 받았을때 웹 브라우저에서 알아서 처리해주는가 아니면 웹 클라이언트 개발자가 직접 처리해주는가