네트워크

[네트워크] Redirect 와 Forward

wjdwwidz 2024. 12. 15. 21:19

Redirect 와 Forward

 

 

 

예시 

사례를 통해 redirect 와 forward 를 이해해보자

  • 클라이언트 : 고객
  • 서버 : 상담원
  • URL : 123

 

redirect 

  • 고객이 고객센터로 상담원에게 123 번으로 전화를 건다.
  • 상담원은 고객에게 다음과 같이 이야기 한다 "고객님 해당 문의사항은 124번으로 다시 문의해주시겠어요?"
  • 고객은 다시 124번으로 문의해서 일을 처리한다.

 

forward

  • 고객이 고객센터로 상담원에게 123번으로 전화를 건다.
  • 상담원은 해당 문의사항에 대해 잘 알지 못해서 옆의 다른 상담원에게 해당 문의사항에 답을 얻는다.
  • 상담원은 고객에게 문의사항을 처리해준다. 


그렇다면 redirect 와 forward의 차이점이 무엇인지 구체적으로 알아보자.

 

설명

redirect

1. redirect 명령이 들어오면 웹 브라우저에게 다른 페이지로 이동하라는 명령을 내린다 

(첫 번째 사례의 경우 고객은 전화를 끊고 124번으로 다시 전화를 건다) 

 

2. 웹 브라우저는 URL을 지시된 주소로 바꾸고 그 주소로 이동한다.

 

3. 다른 web container에 있는 주소로 이동이 가능하다. (123 > 124) 

 

4. 새로운 페이지에서는 request, response 객체가 새롭게 생성된다. (123번에서 고객이 요청했던 문의사항은 사라지고, 124번으로 다시 걸어서 요청한 문의사항을 다시 말해야한다.)

 

 

 

redirect 의 경우 최초 요청을 받은 URL1 에서 클라이언트에 redirect 할 URL2를 리턴하고, 클라이언트는 전혀 새로운 요청을 생성하여 URL2에 다시 요청을 보낸다. 따라서 처음 보냈던 최초의 요청정보는 더이상 유효하지 않게 된다.

 

 

forward

1. web container 차원에서의 페이지 이동, 실제로 웹 브라우저는 다른 페이지로 이동했는지 알 수 없다. (두 번째 사례의 경우, 고객은 상담원이 누구한테 물어봤는지 알 수 없다) 

 

2. 웹 브라우저에는 최초 호출한 URL 만 표시되고, 이동한 페이지의 URL 정보는 볼 수 없다. (두 번째 사레의 경우, 고객은 123번으로만 전화했기 때문에 알 수 없다)

 

3. 동일한 web container에 있는 페이지로만 이동이 가능하다. 

 

4. 현재 실행중인 페이지와 forward에 의해 호출될 페이지는 request, response 객체를 공유한다. (고객이 요청한 문의사항은 고객이 전화를 끊을 때까지 유효하다.) 

 

forward 방식은 다음 이동한 URL 로 요청정보를 그대로 전달한다. 말 그대로 forward (건네주기) 하는 것이다. 그렇기 때문에 사용자가 최초로 요청한 요청정보는 다음 URL 에서도 유효하다. 

 

 

정리 

  redirect  forward
URL 의 변화  O X
객체의 재사용 X O

 

위와 같은 차이점 때문에 웹 애플리케이션을 작성할 때 forward 와 redirect 두 가지 방식 중 하나를 적절히 선택하여 사용해야 한다. 예를 들어 게시판 애플리케이션을 작성한다고 해보자. 사용자가 보낸 요청 정보를 이용하여 글쓰기 기능을 수행하는 Common Gateway Interface 가 있다면, 이 CGI 의 응답 페이지는 forward 와 redirect 중 어느 것을 사용해야 할까? 정답은 redirect이다.

 

사용자가 실수 혹은 고의로 글쓰기 CGI 응답 페이지에서 새로고침을 누르면 어떻게 될까? forward의 경우 요청정보가 그대로 살아있기 때문에 똑같은 글이 여러번 등록될 수 있다. 하지만 redirecct의 경우 처음 글을 작성할 때 보냈던 요청정보는 존재하지 않는다. 또한 글쓰기 기능을 하는 URL1 이 아닌 URL2로 요청을 보내기 때문에 글쓰기가 여러번 수행되지 않는다.

 

즉 시스템 (session, DB) 에 변화가 생기는 요청 (로그인, 회원가입, 글쓰기 ) 의 경우 redirect방식으로 응답하는 것이 바람직하며, 시스템에 변화가 생기지 않는 단순 조회 (리스트보기, 검색) 의 경우 forward 방식으로 응답하는 것이 바람직하다.

 

 

 

 

 


ref : 

 

RequestDispatcher.forward() vs HttpServletResponse.sendRedirect()

What is the conceptual difference between forward() and sendRedirect()?

stackoverflow.com