[WEB] Redirect와 Forward

Minyoung kim·2024년 11월 26일

WEB

목록 보기
2/6

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 특징

  1. 클라이언트가 새로운 요청을 보냄:
    • 클라이언트는 기존 요청이 끝난 후, 새로 지정된 URL로 새 요청을 시작합니다.
  2. URL 변경:
    • 브라우저의 주소창에 새로운 URL이 표시됩니다.
  3. 요청 데이터 손실:
    • 이전 요청의 데이터는 유지되지 않습니다(새로운 요청이기 때문).
  4. 브라우저 캐싱 가능성:
    • 브라우저는 리다이렉트 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 특징

  1. 서버 내부에서 요청 전달:
    • 클라이언트가 다시 요청하지 않으며, 요청 데이터가 그대로 유지됩니다.
  2. URL 변경 없음:
    • 브라우저의 주소창 URL은 초기 요청 URL로 유지됩니다.
  3. 빠른 처리:
    • 추가적인 네트워크 요청 없이 서버 내부에서 바로 처리.

2.3 사용 사례

  • 데이터 전달:
    • 요청 데이터를 다음 리소스에서도 그대로 유지해야 할 때.
  • 뷰 렌더링:
    • 컨트롤러에서 JSP 파일로 직접 포워딩.
  • 에러 처리:
    • 특정 에러 페이지로 포워딩.

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 추천 사례

  1. 로그인 후 이동
    • 로그인 성공 후 메인 페이지로 이동:
      @PostMapping("/login")
      public String login() {
          // 로그인 성공 로직
          return "redirect:/home";
      }
      
  2. 로그아웃 처리
    • 로그아웃 후 로그인 페이지로 이동:
      @RequestMapping("/logout")
      public String logout() {
          // 로그아웃 처리 로직
          return "redirect:/login";
      }
      
  3. POST/Redirect/Get 패턴
    • 사용자가 폼 데이터를 제출한 후 새로고침 시 중복 제출 방지:
      @PostMapping("/submitForm")
      public String submitForm() {
          // 폼 데이터 처리 로직
          return "redirect:/successPage";
      }
      

4.2 Forward 추천 사례

  1. 데이터 전달
    • 클라이언트의 요청 데이터를 다른 컨트롤러 또는 JSP로 전달:
      @RequestMapping("/process")
      public String processData() {
          return "forward:/nextStep";
      }
      
  2. 뷰 렌더링
    • 데이터를 준비한 후 뷰 템플릿으로 바로 전달:
      @RequestMapping("/showView")
      public String showView() {
          return "forward:/WEB-INF/views/result.jsp";
      }
      
  3. 에러 처리
    • 에러 발생 시 에러 페이지로 전달:
      @RequestMapping("/handleError")
      public String handleError() {
          return "forward:/errorPage";
      }
      

0개의 댓글