웹 개발에서 redirect와 forward는 서버가 클라이언트에게 페이지 전환을 지시하는 방법을 나타내는 용어이다. 이 두 가지가 각각 어떤 역할을 하고 어떤 상황에서 사용되는지 알아보자.
Redirect
Redirect는 서버가 클라이언트에게 다른 URL로 이동하라고 지시하는 방법이다. 이 과정은 클라이언트의 브라우저가 두 번의 요청을 보내도록 만든다.
특징:
- HTTP 응답 코드: 주로 302 (임시 이동)이나 301 (영구 이동) HTTP 상태 코드를 사용한다.
- 브라우저 주소 변경: 클라이언트의 브라우저 주소창이 새 URL로 변경된다.
- 새로운 요청: 클라이언트가 새 URL로 새로운 요청을 보내게 되어, 두 개의 서로 다른 HTTP 요청/응답 사이클이 발생한다.
- URL 노출: 최종적으로 이동한 URL이 클라이언트에게 노출된다.
사용 예:
- 사용자가 로그인 후 메인 페이지로 이동시키고자 할 때.
- 페이지가 다른 도메인이나 URL로 이동했음을 알릴 때.
- 폼 제출 후 데이터 중복 제출을 방지하기 위해 다른 페이지로 이동시킬 때.
- Spring에서는 Controller 메서드에서 'redirect:' 접두사를 사용한다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class RedirectController {
@GetMapping("/redirectExample")
public String redirectExample() {
return "redirect:/newPage";
}
@GetMapping("/newPage")
public String newPage() {
return "newPage"; // newPage.html을 반환
}
}
Forward
Forward는 서버가 요청을 다른 자원(서블릿, JSP 등)으로 전달하는 방법이다. 이는 서버 내부에서 이루어지는 작업이므로 클라이언트는 이를 인식하지 못한다.
특징:
- HTTP 응답 코드: 클라이언트에게 200 OK로 응답한다.
- 브라우저 주소 변경 없음: 클라이언트의 브라우저 주소창은 처음 요청한 URL을 그대로 유지한다.
- 단일 요청/응답 사이클: 서버 내부에서 요청을 다른 자원으로 전달하므로 하나의 HTTP 요청/응답 사이클만 발생한다.
- URL 비노출: 클라이언트는 서버 내부에서 어떤 자원이 처리되었는지 알 수 없다.
사용 예:
- 서버 내부에서 로직을 분기하여 다른 페이지로 이동할 때.
- 동일한 웹 애플리케이션 내에서 요청 처리를 다른 서블릿이나 JSP로 넘길 때.
- 보통 요청을 처리하는 동안 필요한 데이터를 전달할 때 사용된다.
- Spring에서는 Controller 메서드에서 'forward:' 접두사를 사용한다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ForwardController {
@GetMapping("/forwardExample")
public String forwardExample() {
return "forward:/newPage";
}
@GetMapping("/newPage")
public String newPage() {
return "newPage"; // newPage.html을 반환
}
}
주요 차이점
- 동작 방식:
- redirect: 클라이언트가 서버로부터 새로운 URL로 이동하라는 응답을 받아 다시 요청을 보낸다.
- forward: 서버 내부에서 요청을 다른 자원으로 넘기며 클라이언트는 이를 알지 못한다.
- 브라우저 주소 표시줄:
- redirect: 새로운 URL로 변경된다.
- forward: 원래 요청한 URL이 그대로 남는다.
- 요청 처리:
- redirect: 새로운 요청이 발생한다. 따라서 모든 요청 속성이나 파라미터가 초기화된다.
- forward: 같은 요청 내에서 처리된다. 따라서 요청 속성이나 파라미터가 그대로 유지된다.
- 사용 용도:
- redirect: 새로운 페이지로 이동을 명시적으로 클라이언트에게 알려주고 싶을 때 사용한다.
- forward: 서버 내부에서 요청을 다른 자원으로 넘겨야 할 때, 클라이언트가 이동을 인식할 필요가 없을 때 사용한다.