ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HTTP Redirect
    💻 computer science/🌐 network 2025. 9. 24. 23:31

    ⭐ Redirect HTTP 상태 코드

    HTTP Redirect는 3xx 상태 코드를 지닌 응답

     

    상태 코드 설명
    300 Multiple Choices
    301 Moved Permanently
    302 Found
    303 See Other
    304 Not Modified
    305 Use Proxy
    307 Temporary Redirect
    308 Permanent Redirect

     

    🔖 Location 헤더

    Location 응답 헤더는 리다이렉트 할 페이지의 URL을 나타냅니다.

    이 헤더는 3xx (redirection) 또는 201 (created) 응답 상태와 함께 제공됩니다.

     

    🧩 리다이렉션의 경우

    • 303 (See Other) 응답 코드는 항상 GET 메서드를 사용합니다.
    • 307 (Temporary Redirect), 308 (Permanent Redirect)은 원본 요청에서 사용한 메서드를 변경하지 않습니다.
    • 301 (Moved Permanently), 302 (Found)는 대부분 메서드를 변경하지 않습니다.

    상태 코드 중 하나가 포함된 모든 응답은 Location 헤더를 보냅니다.

    - 리소스 생성의 경우 새로 만들어진 리소스의 URL을 나타냅니다.

     

    예시

    Location: /index.html

     

    🆚 Content-Location

     

    LocationContent-Location는 서로 다릅니다.

    Location은 리다이렉션의 대상이나 새로 만들어진 리소스의 URL을 나타냅니다.

     

    Content-Location

    • 응답 본문에 대한 추가적인 정보를 제공합니다. (주로 콘텐츠 협상(content negotiation) 과정에서 사용)
    • 콘텐츠 협상 예시:
      • 사용자가 example.com/page를 요청했는데 서버는 한국어(page.ko.html)와 영어(page.en.html) 두 가지 버전의 페이지를 가지고 있다고 가정해 봅시다.
      • 서버는 클라이언트의 언어 설정을 확인하고 한국어 페이지를 응답으로 보냅니다.
    • 역할: 이때 서버는 응답 헤더에 Content-Location: /page.ko.html을 포함시킵니다.
      • 이는 "/page를 요청했지만 지금 전달하는 콘텐츠의 원본은 사실 /page.ko.html에 있습니다"라고 알려주는 것입니다.

     

    Content-Location은 클라이언트에게 새로운 요청을 보내라고 명령하지 않습니다.

    • 단지 반환된 콘텐츠가 어디에 위치한 원본인지에 대한 메타데이터 역할을 합니다.

     

    ↪️ Redirect

    Redirect 응답을 수신한 브라우저는 제공된 새로운 URL을 사용하며 그것을 즉시 로드합니다

    대부분의 경우 리다이렉션은 사용자에게는 보이지 않는데다가 적은 성능 저하를 일으킵니다.

    • 3가지 카테고리의 리다이렉트 유형이 있습니다.

    https://inpa.tistory.com/entry/HTTP-🌐-3XX-Redirection-상태-코드-제대로-알아보기#303_see_other

     

    1️⃣ 영속적인 리다이렉션 (Permanent)

    해당 Redirection은 영원히 지속됨을 의미

    • 특정 리소스의 URL이 영구적으로 이동

     

    브라우저는 이 응답을 받으면 새 URL을 캐시에 저장하여 다음부터는 이전 URL로 요청하지 않고 바로 새 URL로 이동

     

    301 Moved Permanently  GET 메서드는 변경되지 않고 다른 메서드들은 GET으로 변하거나 변하지 않을 수 있습니다.
    308 Permanent Redirect 301과 유사하지만 메서드를 보존합니다. (301이 POST 요청을 GET으로 바꾸는 문제를 해결)

     

     

    📌 301 Moved Permanently

     

    HTTP 301 Moved Permanently 리디렉션 상태 응답 코드는 요청한 리소스가 Location 헤더에 주어진 URL로 완전히 옮겨졌다는 것을 나타냅니다.

     

    🏄‍♂️ 동작 과정

     

    1. 링크 클릭: https://site.com/redirect URL을 전송해 클릭
    2. 요청: 서버에 GET 요청을 보냅니다.
    3. 301 응답: 서버는 301 Moved Permanently와 Location: https://site.com/page 헤더로 응답합니다.
    4. 자동 리디렉션: 브라우저는 301 상태와 Location 헤더를 봅니다.
      • 즉시 자동으로 Location 헤더의 URL로 새로운 요청을 보냅니다.
      • 이 과정은 사용자에게 보이지 않게 발생
    5. 최종 목적지: 서버는 새 요청에 200 OK와 페이지의 콘텐츠로 응답합니다.
    6. 브라우저 주소 표시줄 업데이트: 브라우저의 주소 표시줄이 새 URL인 https://site.com/page 로 업데이트

     

    ⚠️ POST 요청에서의 문제

     

    1. 클라이언트에서 /redirect 로 param1, param2 바디 정보를 담은 POST 요청을 보냅니다.
    2. 이때, 서버는 301 상태코드와 Location 필드를 통해 /page 로 페이지 주소가 영구적으로 변경되었다는 사실을 알려주고 리다이렉트를 지시합니다.
    3. 클라이언트는 해당 location으로 요청을 하는데 메서드가 GET으로 변경되면서 요청을 하고 바디가 제거되어집니다.
    4. 따라서 클라이언트의 원래 의도와 다르게 흘러가 원하지 않는 문제가 발생할 수 있습니다.

     

    💡 POST 요청은 308 Permenant Redirect 를 사용하기.

     

    📌 308 Permanent Redirect

    • 301과 기능은 동일하지만 리다이렉트시 요청 메서드와 본문을 유지합니다.
    • 클라이언트가 처음에 POST 메서드, 본문에 데이터에 담아 전송하면 새로운 URL로 리다이렉트하더라도 그 메서드와 본문내용이 유지
    • 첫 요청에 POST가 사용되었다면 두번째 요청도 반드시 POST를 사용

     

    2️⃣ 일시 리다이렉션 (Temporary)

    특정 리소스의 URL이 일시적으로 이동

     

    302 Found 브라우저는 새 URL로 이동하지만 캐시에 저장하지 않습니다. 따라서 다음 요청 시에는 이전 URL로 다시 요청합니다.
    307 Temporary Redirect 302와 유사하지만 메서드(GET, POST 등)를 변경하지 않도록 보장합니다. 302는 브라우저에 따라 POST 요청을 GET으로 바꾸는 경우가 있어 안전한 리다이렉트를 위해 사용됩니다.

     

     

    📌 302 Found

    다른 URL에서 리소스를 찾습니다 (일시 리다이렉션)

    • 요청된 리소스가 Location 헤더가 지정한 URL로 일시적으로 이동되었음을 나타냅니다.
    • 301와 같이 요청 메서드가 GET으로 변하고 본문이 제거될 수 있습니다.
      • 무조건적으로 변경하지는 않습니다!! (불확실성)

     

    🤔 왜 301, 302는 리다이렉션 후 메서드를 GET으로 바꿀까?? - PRG(Post - Redirect - Get) 패턴

    📍 예시 상황

    사이트에서 POST를 통해 요청하고 브라우저를 새로고침을 한다면 이전의 요청을 재전송 하기 때문에 POST 요청을 다시하게 되고 따라서 중복된 POST 요청이 서버에게 전달될 수 있습니다.

     

    🧩 PRG 를 사용하지 않는 경우

     

    1. 클라이언트가 출금 요청을 POST 메서드로 서버에 전송
    2. 서버에서는 출금 처리를 하고 데이터베이스를 갱신 후 200 OK 반환
    3. 사용자가 브라우저를 새로고침
    4. 이때, 이전의 POST 요청이 그대로 재전송되고 같은 출금 요청이 중복되어 처리

     

    따라서 PRG 패턴은 위처럼 일시적인 리다이렉션에서 중복 요청의 전송을 방지하기 위해 사용합니다.

     

     

    🧩 PRG 를 사용하는 경우

     

    📌 303 See Other

    다른 URL에서 리소스를 찾습니다 (일시 리다이렉션)

     

    302 Found와 동일하게 일시 리다이렉트 시 요청 메서드가 GET, 본문을 제거합니다.

    • 하지만 요청 메서드의 변경과 본문 제거 행위를 무조건적으로 보장해줍니다.

    이처럼 303은 302 리다이렉트의 오용을 막기 위해서 HTTP 1.1에서 추가되었습니다.

    • 폼 제출 요청에 응답시에는 이 메서드를 사용..!

     

    📌 307 Temporary Redirect

    • 302 Found 과 기능은 동일하지만 일시 리다이렉트 시 요청 메서드와 본문을 유지합니다.
    • 클라이언트가 처음에 POST 메서드와 본문에 데이터를 담아 전송하였다면 새로운 URL로 리다이렉트하더라도 그 메서드와 Body 내용이 유지
      • 첫 요청에 POST가 사용되었다면 두번째 요청도 반드시 POST를 사용

     

    3️⃣ 특수 리다이렌션 (Special)

    • 캐시를 활용할 것인지의 여부

     

    📌 304 Not Modified

    리소스가 수정 되지 않아 최신 상태이므로 캐시를 이용하라는 특수 리다이렉션

    • 클라이언트가 리소스 요청시 서버로부터 304 응답이 오면 클라이언트가 요청한 리소스가 최신 상태이므로 캐시에 가지고 있는 리소스를 그대로 사용해도 된다는 의미
    • GET과 HEAD 메소드에만 동작

    ⚠️ 304 응답 메시지는 Body 본문에 어떠한 데이터도 포함되면 안됩니다.

     

    댓글

Designed by Tistory.