Backend/Spring

Rdeirect VS Forward

해로몬 2024. 11. 26. 16:46

Redirect와 forward의 차이

jsp 환경에서, 현재 작업중인 페이지 다른 페이지로 이동하는 두가지 방식의 페이지 전환이 가능합니다.

  • Forward
    • 동일한 웹 컨테이너에 있는 페이지로만 이동할 수 있다. 
    • 현재 실행중인 페이지와 forward에 의해 호출될 페이지는 request와 response 객체를 공유한다.
  • Redirect
    • 다른 웹 컨테이너에 있는 주소로 이동이 가능하다. 
    • 새로운 페이지에서는 request와 response객체가 새롭게 생성된다.

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로 이동:
    • 외부 사이트로 사용자를 리다이렉트.
@RequestMapping("/redirect")
public String redirectExample() {
    return "redirect:/[newPage]"; //redirect: 접두사를 사용하면 클라이언트를 지정된 URL로 리다이렉트.
}

Foward

2.1 개념

  • *Forward(포워드)는 서버가 클라이언트의 요청을 처리하다가, 같은 서버 내의 다른 리소스로 요청을 전달합니다.
  • 클라이언트는 자신이 요청한 리소스가 다른 리소스로 처리되었음을 알 수 없습니다.

2.2 특징

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

2.3 사용 사례

  • 데이터 전달:
    • 요청 데이터를 다음 리소스에서도 그대로 유지해야 할 때.
  • 뷰 렌더링:
    • 컨트롤러에서 JSP 파일로 직접 포워딩.
  • 에러 처리:
    • 특정 에러 페이지로 포워딩.
@RequestMapping("/forward")
public String forwardExample() {
    return "forward:/[newPage]"; //forward: 접두사를 사용하면 서버 내에서 요청을 전달.
}
@RequestMapping("/redirectWithParams")
public String redirectWithParams() {
    return "redirect:/newPage?status=success";
}

3. Redirect와 Forward의 주요 차이

특징 Redirect(리다이렉트) Forward(포워드)

동작 방식 클라이언트가 새 요청을 보냄 서버 내부에서 요청을 다른 리소스로 전달
URL 변경 URL이 변경됨 URL이 변경되지 않음
요청 데이터 유지 유지되지 않음 (새로운 요청이 시작됨) 유지됨 (원래 요청 데이터 그대로 전달)
브라우저 관점 브라우저가 리다이렉트를 인식하고 새로운 요청을 보냄 브라우저는 요청이 다른 리소스로 포워드된 것을 알지 못함
사용 사례 PRG 패턴, 외부 URL 이동 서버 내부 데이터 전달, 에러 페이지 렌더링
성능 네트워크 요청 추가로 약간 느림 서버 내부 처리로 상대적으로 빠름

 


Q.사용자가 보낸 요청 정보를 이용하여 글쓰기 기능을 수행하는 CGI가 있다면, 어느것을 사용해야 할까?

A.

이 응답 페이지는 redirection을 사용해야 한다.

사용자가 실수 혹은 고의로 응답 페이지에서 새로고침을 누를 경우 forward의 경우 요청 정보가 그대로 살아있기 때문에 똑같은 글이 여러번 등록될 수 있기 때문이다. 하지만 redirection의 경우 처음 글을 작성할 때 보냈던 요청 정보는 존재하지 않기 때문에 글쓰기가 여러번 수행 되지 않는다.

정리 하자면 시스템에 변화가 생길 수 있는 요청 (로그인, 회원가입, 글쓰기 등)의 경우 : redirection 방식으로, 시스템에 변화가 생기지 않는 단순 조회(글 목록, 검색 등)요청의 경우 : forwrad 방식으로 응답.

 

[참고]

https://doublesprogramming.tistory.com/63

https://blog.naver.com/saintw/100165339381

'Backend > Spring' 카테고리의 다른 글

[Spring Web MVC] HandlerInterceptor  (0) 2024.11.26
[Spring Web MVC] WebMvcConfigurer  (0) 2024.11.26
[Spring Web MVC] Session  (0) 2024.11.25
[Spring Web MVC] 🍪Cookie  (0) 2024.11.25
[Spring Web MVC] HTTP 요청 RequestMapping  (0) 2024.11.25