Skip to content

헷갈리는 HTTP 상태 코드 3XX 정리

HTTP 상태 코드 중 3XX Redirection은 요청을 완료하기 위해 유저 에이전트의 추가 조치가 필요한 경우에 반환되는 코드인데, 표준 스펙의 설명이 헷갈리는 부분이 있어 정리해둔다.


3XX

기본적으로 웹 브라우저는 3XX 응답의 결과에 Location 헤더가 있으면 해당 위치로 자동 이동(redirect)한다.

redirection의 종류는 아래와 같다.

  • 영구 리다이렉션: 특정 리소스의 URI가 영구적으로 이동
  • 일시적 리다이렉션: 일시적인 변경(주문 완료 후 주문 내역 페이지로 이동하는 경우)
  • 특수 리다이렉션: 결과 대신 로컬 캐시를 이용

영구 리다이렉션

리소스의 URI가 영구적으로 이동했기 때문에 기존의 URI를 더 이상 사용하지 말라는 의미로, 검색 엔진들이 변경을 인지한다.

  • 301 Moved Permanently
    • 리다이렉트 시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음
  • 308 Permanent Redirect
    • 301과 기능은 같으나 리다이렉트 시 요청 메서드와 본문 유지

일시적 리다이렉션

리소스의 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 요청 시 사용함

Reference