HTTP 307 임시 리다이렉션 프로그래밍: 302, 301, 303 비교 및 대안

2024-06-15

HTTP 상태 코드 307 Temporary Redirect 프로그래밍

이 상태 코드는 다음과 같은 경우에 유용합니다.

  • 웹 페이지의 URL이 변경되었지만 아직 모든 검색 엔진 및 링크가 업데이트되지 않은 경우
  • 웹 서버가 유지 관리를 위해 일시적으로 중단되고 다른 서버로 트래픽을 전환해야 하는 경우
  • 콘텐츠가 여러 URL로 분산되어 있으며 클라이언트가 올바른 URL로 리다이렉트되어야 하는 경우

프로그래밍 방법

307 상태 코드를 프로그래밍하는 방법은 서버 프로그래밍 언어와 웹 프레임워크에 따라 다릅니다. 하지만 일반적인 방법은 다음과 같습니다.

응답 헤더에 Location 헤더 추가:

Location 헤더에는 클라이언트가 리다이렉트해야 할 새로운 URL을 지정합니다.

HTTP/1.1 307 Temporary Redirect
Location: https://new-url.example.com

요청 메서드 유지:

307 상태 코드는 원래 요청의 메서드를 유지하도록 합니다. 즉, GET 요청이 307 리다이렉션으로 응답되면 클라이언트는 새로운 URL에 대해 GET 요청을 수행해야 합니다.

참고 사항

  • 일부 오래된 클라이언트는 307 응답을 잘 처리하지 못할 수 있습니다. 이러한 경우 302 Found 상태 코드를 사용하는 것이 더 안전할 수 있습니다.
  • 307 상태 코드는 SEO에 영향을 미치지 않습니다. 즉, 검색 엔진은 새 URL을 인덱싱하지 않고 오래된 URL을 계속 인덱싱합니다.
  • HTTPS에서 307 리다이렉션을 사용하는 경우 HTTPS를 사용하여 새 URL로 리다이렉트해야 합니다.

예제

다음은 Python의 Flask 웹 프레임워크를 사용하여 307 Temporary Redirect를 구현하는 방법의 예입니다.

from flask import Flask, redirect

app = Flask(__name__)

@app.route('/old-url')
def old_url():
    return redirect('https://new-url.example.com', status=307)

if __name__ == '__main__':
    app.run(debug=True)

이 코드는 /old-url 엔드포인트에 대한 요청을 https://new-url.example.com으로 리다이렉트합니다.



HTTP 307 Temporary Redirect 관련 샘플 코드

Python (Flask):

from flask import Flask, redirect

app = Flask(__name__)

@app.route('/old-url')
def old_url():
  return redirect('https://new-url.example.com', status=307)

if __name__ == '__main__':
  app.run(debug=True)

Node.js (Express):

const express = require('express');

const app = express();

app.get('/old-url', (req, res) => {
  res.redirect(307, 'https://new-url.example.com');
});

app.listen(3000, () => console.log('Server started on port 3000'));

C# (ASP.NET Core):

using Microsoft.AspNetCore.Mvc;

public class MyController : Controller
{
    [HttpGet("/old-url")]
    public IActionResult OldUrl()
    {
        return RedirectPermanent("https://new-url.example.com");
    }
}

PHP:

<?php

header('Location: https://new-url.example.com', 307);
exit;

Java (Spring Boot):

@Controller
public class MyController {

    @GetMapping("/old-url")
    public ResponseEntity<Void> oldUrl() {
        return ResponseEntity.status(HttpStatus.TEMPORARY_REDIRECT)
                .location("https://new-url.example.com")
                .build();
    }
}

이 코드는 모두 /old-url 엔드포인트에 대한 요청을 https://new-url.example.com으로 리다이렉트합니다. 실제 코드는 사용하는 특정 프레임워크 및 라이브러리에 따라 다를 수 있습니다.



"307 Temporary Redirect"의 대안

하지만 상황에 따라 307 대신 다른 상태 코드를 사용하는 것이 더 적합할 수 있습니다.

대안으로 사용할 수 있는 HTTP 상태 코드는 다음과 같습니다.

302 Found:

  • 302는 영구적인 리다이렉션을 나타냅니다. 즉, 요청한 리소스는 이제 새로운 URL에 있으며 향후 변경될 가능성이 적습니다.
  • 307과 달리 302는 클라이언트가 요청 메서드를 GET으로 변경하고 요청 본문을 제거하도록 합니다.
  • SEO에 영향을 미쳐 검색 엔진이 새 URL을 인덱싱하고 오래된 URL을 인덱싱하지 않도록 합니다.

사용 시나리오:

  • 웹 페이지의 URL이 영구적으로 변경된 경우
  • 웹 서버가 영구적으로 다른 위치로 이동된 경우

301 Moved Permanently:

  • 301은 302와 유사하지만 더 강력한 영구적인 리다이렉션을 나타냅니다.
  • 일부 검색 엔진은 301을 302보다 더 선호합니다.
  • 웹 페이지의 URL이 영구적으로 변경되고 SEO에 영향을 미치고 싶은 경우

303 See Other:

  • 303은 새로운 리소스를 참조하도록 클라이언트에게 알려줍니다.
  • 303은 요청 메서드를 유지하지만 요청 본문은 제거합니다.
  • SEO에 영향을 미치지 않습니다.
  • POST 또는 PUT 요청을 처리한 후 클라이언트가 GET 요청을 수행해야 하는 경우

선택 가이드

  • 요청한 리소스가 영구적으로 이동되었는지 임시적으로 이동되었는지에 따라 302, 301 또는 303을 선택합니다.
  • SEO에 영향을 미치고 싶은지 여부를 고려합니다. 302와 301은 SEO에 영향을 미치는 반면 303은 영향을 미치지 않습니다.
  • 요청 메서드와 본문 처리 방식을 고려합니다. 302는 요청 메서드를 GET으로 변경하고 본문을 제거하는 반면 301과 303은 요청 메서드를 유지하지만 본문을 제거합니다.

결론

"307 Temporary Redirect"는 다양한 상황에서 유용한 HTTP 상태 코드이지만, 상황에 따라 302, 301 또는 303과 같은 다른 상태 코드를 사용하는 것이 더 적합할 수 있습니다.