리다이렉션 이해 흐름와 종류
리다이렉션은 웹 서버가 클라이언트의 요청을 받아서 새로운 URL로 방향 전환하는 것을 의미한다.
이는 특정 상황에서 사용되며, 종류에는 영구 리다이렉션, 일시 리다이렉션, 특수 리다이렉션이 있다.
영구 리다이렉션
영구 리다이렉션은
특정 리소스의 URI가 영구적으로 이동하는 경우에 사용된다. 예를 들어, /members에서 /users로 URI가 변경되거나, /event에서 /new-event로 URI가 변경된 경우이다. 이 경우, 클라이언트가 원래의 URL을 사용할 수 없으며, 검색 엔진 등에서도 변경 사항을 인지한다.
영구 리다이렉션에는 301 Moved Permanently와 308 Permanent Redirect가 있으며, 301 Moved Permanently는 요청한 리소스의 URI가 영구적으로 이동되었음을 나타내며, 리다이렉트 시 요청 메서드가 GET으로 변경된다. 또한, 본문이 제거될 수 있다. 308 Permanent Redirect는 301과 기능은 같지만, 리다이렉트 시 요청 메서드와 본문을 유지한다. 따라서, 처음에 POST를 보내면 리다이렉트도 POST를 유지된다.
일시적 리다이렉션 302, 307, 303
일시적인 리다이렉션은 리소스의 URI가 일시적으로 변경되어 원래 URL을 사용해야한다. 검색 엔진 등에서도 URL을 변경하면 안되기 때문이다.
- 302 Found : 리다이렉트시 요청 메서드가 GET으로 변경되고, 본문이 제거될 수 있다.
- 307 Temporary Redirect : 302와 기능이 같지만, 요청 메서드와 본문을 유지해야 한다. (요청 메서드를 변경하면 안된다는 점이 중요하다.)
- 303 See Other : 302와 기능이 같지만, 리다이렉트시 요청 메서드가 GET으로 변경된다.
💡예를 들어, POST로 주문한 후에 주문 내역 화면으로 리다이렉트하는 경우 303 See Other 상태 코드를 사용할 수 있다. 이렇게 하면 브라우저에서 새로고침할 경우, 중복 주문이 되지 않도록 할 수 있다.
.
PRG: Post/Redirect/Get
PRG(Post/Redirect/Get)는 일시적인 리다이렉션의 한 종류이다. 이는 웹 어플리케이션에서 폼 데이터를 처리하고 나서 새로고침 등의 이유로 중복 제출되는 것을 방지하기 위해 사용된다.
PRG 방식에서는 먼저 클라이언트에서 폼 데이터를 POST 메서드로 서버에 전송한다. 서버에서는 이 폼 데이터를 처리한 후, 클라이언트에게 302 상태 코드를 전송하여 일시적인 리다이렉션을 요청한다. 이때, 리다이렉션된 URI는 GET 메서드로 요청된다. 이를 통해 중복 제출을 방지할 수 있다.
예를 들어, 사용자가 로그인 폼에 아이디와 비밀번호를 입력하고 로그인 버튼을 누른 경우, 서버에서는 이 폼 데이터를 검증하고 로그인 처리를 수행하는데. 이후, 서버는 클라이언트에게 302 상태 코드와 함께 로그인 성공 후 보여줄 페이지의 URI를 전송하게된다. 클라이언트는 이 URI를 GET 메서드로 요청하고, 로그인 성공 페이지를 보여주게 된다.
⭐️PRG 방식을 사용하면, 중복 제출을 방지할 뿐만 아니라, 브라우저의 뒤로 가기 버튼 등으로 인한 문제도 해결할 수 있다.
정리
잠깐 정리
• 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
300 Multiple Choices: 안쓴다.
304 Not Modified
• 캐시를 목적으로 사용
• 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 클라이언트는 로컬PC에 저장된 캐시를 재사용한다. (캐시로 리다이렉트 한다.)
• 304 응답은 응답에 메시지 바디를 포함하면 안된다. (로컬 캐시를 사용해야 하므로)
• 조건부 GET, HEAD 요청시 사용
출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본지식 by 우아한형제 김영한이사님
'WEB HTTP > HTTP 기본' 카테고리의 다른 글
HTTP 헤더 - 콘텐츠 협상 (0) | 2023.03.21 |
---|---|
HTTP 상태코드 - 4xx(Client Error), 5xx(Server Error) (0) | 2023.03.20 |
HTTP 상태코드 (0) | 2023.03.20 |
HTTP API 설계 (0) | 2023.03.20 |
HTTP 메서드속성 - 안전, 멱등, 캐시가능 (0) | 2023.03.19 |