https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet/viewresolver.html#mvc-redirecting-redirect-prefix
1. Redirect
1.1 개념
- Redirect(리다이렉트)는 클라이언트의 요청을 서버가 처리한 후, 새로운 요청을 클라이언트로 다시 보냅니다.
- 서버가 클라이언트에게 HTTP 상태 코드 302(임시 이동)과 함께 Location 헤더에 새 URL을 전달하면, 클라이언트는 새 URL로 다시 요청을 보냅니다.
1.2 특징
- 클라이언트가 새로운 요청을 보냄:
- 클라이언트는 기존 요청이 끝난 후, 새로 지정된 URL로 새 요청을 시작합니다.
- URL 변경:
- 브라우저의 주소창에 새로운 URL이 표시됩니다.
- 요청 데이터 손실:
- 이전 요청의 데이터는 유지되지 않습니다(새로운 요청이기 때문).
- 브라우저 캐싱 가능성:
- 브라우저는 리다이렉트 URL을 캐싱할 수 있습니다.
1.3 사용 사례
- PRG 패턴(Post/Redirect/Get):
- POST 요청 후 브라우저에서 새로고침(F5) 시 중복 요청을 방지하기 위해 리다이렉트를 사용.
- 로그아웃 처리:
- 외부 URL로 이동:
1.4 코드 예제
Spring에서 리다이렉트
@RequestMapping("/redirect")
public String redirectExample() {
return "redirect:/newPage";
}
redirect: 접두사를 사용하면 클라이언트를 지정된 URL로 리다이렉트.
리다이렉트와 쿼리 파라미터
@RequestMapping("/redirectWithParams")
public String redirectWithParams() {
return "redirect:/newPage?status=success";
}
2. Forward
2.1 개념
- Forward(포워드)는 서버가 클라이언트의 요청을 처리하다가, 같은 서버 내의 다른 리소스로 요청을 전달합니다.
- 클라이언트는 자신이 요청한 리소스가 다른 리소스로 처리되었음을 알 수 없습니다.
2.2 특징
- 서버 내부에서 요청 전달:
- 클라이언트가 다시 요청하지 않으며, 요청 데이터가 그대로 유지됩니다.
- URL 변경 없음:
- 브라우저의 주소창 URL은 초기 요청 URL로 유지됩니다.
- 빠른 처리:
- 추가적인 네트워크 요청 없이 서버 내부에서 바로 처리.
2.3 사용 사례
- 데이터 전달:
- 요청 데이터를 다음 리소스에서도 그대로 유지해야 할 때.
- 뷰 렌더링:
- 에러 처리:
2.4 코드 예제
Spring에서 포워드
@RequestMapping("/forward")
public String forwardExample() {
return "forward:/newPage";
}
forward: 접두사를 사용하면 서버 내에서 요청을 전달.
3. Redirect와 Forward의 주요 차이
| 특징 | Redirect(리다이렉트) | Forward(포워드) |
|---|
| 동작 방식 | 클라이언트가 새 요청을 보냄 | 서버 내부에서 요청을 다른 리소스로 전달 |
| URL 변경 | URL이 변경됨 | URL이 변경되지 않음 |
| 요청 데이터 유지 | 유지되지 않음 (새로운 요청이 시작됨) | 유지됨 (원래 요청 데이터 그대로 전달) |
| 브라우저 관점 | 브라우저가 리다이렉트를 인식하고 새로운 요청을 보냄 | 브라우저는 요청이 다른 리소스로 포워드된 것을 알지 못함 |
| 사용 사례 | PRG 패턴, 외부 URL 이동 | 서버 내부 데이터 전달, 에러 페이지 렌더링 |
| 성능 | 네트워크 요청 추가로 약간 느림 | 서버 내부 처리로 상대적으로 빠름 |
4. 사용 사례별 추천 방법
4.1 Redirect 추천 사례
- 로그인 후 이동
- 로그아웃 처리
- POST/Redirect/Get 패턴
4.2 Forward 추천 사례
- 데이터 전달
- 뷰 렌더링
- 에러 처리