본문 바로가기

Infrastructure/Network

[HTTP] 상태 코드 (3xx)

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