3xx (Redirection) 상태 코드에 대해서 알아본다.
- 요청을 완료하기 위해 유저 에이전트의 추가 조치가 필요하다.
- 300 (여러 선택 항목, Multiple Choices): 서버가 요청에 따라 여러 조치를 선택할 수 있다. 서버가 사용자 에이전트에
수행할 작업을 선택하거나, 요청자가 선택할 수 있는 작업 목록을 제공한다. - 301 (영구 이동, Moved Permanently): 요청한 페이지를 새 위치로 영구적으로 이동했다. GET 또는 HEAD 요청에 대한
응답으로 이 응답을 표시하면 요청자가 자동으로 새 위치로 전달된다. - 302 (임시 이동, Found): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를
계속 사용해야 한다. - 303 (기타 위치 보기, See Other): 요청자가 다른 위치에 별도의 GET 요청을 하여 응답을 검색 할 경우 서버는 이 코드를 표시한다.
HEAD 요청 이외의 모든 요청을 다른 위치로 자동으로 전달한다. - 304 (수정되지 않음, Not Modified): 마지막 요청 이후 요청한 페이지는 수정되지 않았따. 서버가 이 응답을 표시하면 페이지의
콘텐츠를 표시하지 않는다. 요청자가 마지막으로 페이지를 요청한 후 페이지가 변경되지 않으면 이 응답(If-Modified-Since HTTP
헤더라고 함)을 표시하도록 서버를 구성해야 한다. - 307 (임시 리다이렉션, Temporary Redirect): 요청자는 프록시를 사용하여 요청한 페이지만 액세스할 수 있다. 서버가 이 응답을
표시하면 요청자가 사용할 프록시를 가리키는 것이기도 하다. - 308 (영구 리다이렉션, Permanent Redirect): RFC에서 실험적으로 승인됨.
위키백과의 내용을 정리해볼겸 적어보았는데 이해하기가 쉽지 않다...
먼저 Redirection이 무엇인지 먼저 알아보자.
웹 부라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동 (리다이렉트)
리다이렉션의 종류는 아래와 같다.
- 영구 리다이렉션: 특정 리소스의 URI가 영구적으로 이동
- 일시 리다이렉션: 일시적인 변경
- 특수 리다이렉션: 결과 대신 캐시를 사용
영구 리다이렉션(301, 308)
- 301 Moved Permantently
- 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 가능성이 있음.
- 308 Permanent Redirect
- 301과 같은 기능을 함
- 리다이렉트시 요청 메서드와 본문 유지(첫 요청이 PUT이라면 리다이렉트된 요청도 PUT)
301 요청 흐름
1) 요청
POST /car HTTP/1.1
Host: localhost:8080
manufacturer=hyunai&modelName=sonata
2) 응답
HTTP/1.1 301 Moved Permanently
Location: /new-car
3) 클라이언트는 /new-car 로 리다이렉트
4) 요청
GET /new-car HTTP/1.1
Host: localhost:8080
5) 응답
HTTP/1.1 200 OK
...
여기서 주의깊게 볼 곳은 4) 요청에서 ** HTTP 메서드가 GET으로 변경되었다는 것과
요청의 메시지가 제거되었다는 점이다.
308 요청 흐름
1) 요청
POST /car HTTP/1.1
Host: localhost:8080
manufacturer=hyundai&modelName=sonata
2) 응답
HTTP/1.1 308 Permanent Redirect
Location: /new-car
3) 클라이언트는 /new-car로 리다이렉트
4) 요청
POST /new-car HTTP/1.1
Host: localhost:8080
manufacturer=hyundai&modelName=sonata
5) 응답
HTTP/1.1 200 OK
...
역시 주의깊게 봐야할 곳은 4) 요청이다.
301과는 다르게 1) 요청과 같은 HTTP 메서드를 사용하고 있으며 메시지 또한 유지되고 있다.
일시 리다이렉션(302, 303, 307)
- 리소스의 URI가 일시적으로 변경된다. 때문에 검색 엔진 등에서 URL을 변경하면 안됨.
- 302 Found
- 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 가능성이 있음.
- 307 Temporary Redirect
- 302와 같은 기능을 한다.
- 리다이렉트시 요청 메서드와 메시지는 유지한다.
- 303 See Other
- 302와 같은 기능을 한다.
- 리다이렉트시 요청 메서드가 GET으로 변경된다.
PRG: Post/Redirect/Get
PGR 사용전의 주문 요청 화면과정을 살펴보자.
1) 요청
POST /car HTTP/1.1
Host: localhost:8080
manufacturer=hyundai&modelName=sonata
2) 차량 데이터 저장
3) 응답
HTTP/1.1 200 OK
...
4) 결과 화면에서 새로고침
5) 요청
POST /car HTTP/1.1
Host: localhost:8080
manufacturer=hyundai&modelName=sonata
6) 차량 데이터 중복 저장
7) 응답
HTTP/1.1 200 OK
...
문제점이 보일것이다.
차량 저장 완료후에 고객이 결과 화면 페이지에서 새로고침을 한다면 중복으로 저장이 된다.
이러한 문제를 방지하기 위해서 PGR이 사용된다.
- POST로 저장후에 새로 고침으로 인한 중복 저장 방지
- POST로 저장후에 저장 결과 화면을 GET 메서드로 리다이렉트
- 새로고침해도 결과 화면을 GET으로 조회
- 중복 저장 대신에 결과 화면만 GET으로 다시 요청
그러면 PGR이 적용되면 어떤식으로 작동하는지 살펴보자.
1) 요청
POST /car HTTP/1.1
Host: localhost:8080
manufacturer=hyundai&modelName=sonata
2) 차량 데이터 저장
3) 응답
HTTP/1.1 302 Found
Location: /car-result/100
4) /car-result/100으로 자동 리다이렉트
5) 요청
GET /car-result/100 HTTP/1.1
Host: localhost:8080
6) 100번 차량 조회
7) 응답
HTTP/1.1 200 OK
...
GET으로 리다이렉트되어 더 이상 중복으로 데이터가 저장되지 않는 것을 확인 할 수있다.
기타 리다이렉션(304)
- 304 Not Modified
- 캐시를 목적으로 사용한다.
- 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 클라이언트는 로컬PC에
저장된 캐시를 재사용한다. - 304 응답을 받은 클라이언트는 로컬 캐시를 사용해야하므로 응답에 메시지 바디를 포함하면 안된다.
- 조건부로 GET, HEAD 요청시 사용된다.
'Infrastructure > Network' 카테고리의 다른 글
[HTTP] 헤더 - 5 (캐시) (0) | 2021.06.25 |
---|---|
[HTTP] 헤더 - 1 (일반 헤더) (0) | 2021.06.25 |
[HTTP] 상태 코드 (5xx) (0) | 2021.06.24 |
[HTTP] 상태 코드 (4xx) (0) | 2021.06.24 |
[HTTP] 상태 코드 (2xx) (0) | 2021.06.24 |