response.sendRedirect( )와 pageContext.forward( ) - session 데이터를 넘길 때 유용한 것은?

jsp 문법 공부하기 getParameter와 getAttribute의 사용법을 이해하고 간단한 예제 코드를 확인해서 차이점을 알아보자 session 데이터를 넘길 때 pageContext.forward( )를 사용하는 이유
Jan 16, 2024
response.sendRedirect( )와 pageContext.forward( ) - session 데이터를 넘길 때 유용한 것은?
💡
Summary
response.sendRedirect( ) : 데이터를 넘길 때 사용, URL에 파라미터 노출됨 / URL encoding 필수
pageContext.forward( ) : 페이지를 이동할 때 사용 / setAttribute, getAttribute 사용
 

예제 02

index1.jsp : 현재 페이지 → default1.jsp : 이동할 페이지 내장함수 sendRedirect 사용
<!-- 2 --> <%-- pageContext : 이동, 데이터 전송 --%> <% String address = "부산시"; request.setAttribute("address", address); pageContext.forward("default1.jsp"); // response.sendRedirect("default1.jsp"); // 데이터를 전송을 할 수 없다 (이동만 됨) %>
index1.jsp
<!-- 2 --> <%-- String address = (String)request.getAttribute("address"); %> <p>주소: <%=address %></p>
default1.jsp
코드 해석
<1> response.sendRedirect("default1.jsp");
브라우저에게 새로운 요청을 하도록 응답(response) 헤더를 보내고, 브라우저는 새로운 URL로 이동한다. 브라우저에서 새로운 요청이 발생하므로, 새로운 요청 객체가 생성된다.
데이터를 공유하기 어렵고, 새로운 요청 객체에서 데이터를 전달해야 한다. 일반적으로 쿼리 문자열을 사용하여 데이터를 전달한다.
 
<2> pageContext.forward("default1.jsp"):
forward() 메서드를 사용하여 현재 페이지에서 다른 페이지로 전환한다. 이동할 페이지로 현재 요청(request) 객체를 전달하므로, 이동한 페이지에서는 동일한 요청 객체를 사용할 수 있다.
데이터를 공유하고 전달하기에 적합하다. `request.setAttribute()`로 데이터를 설정하면, 이동한 페이지에서 해당 데이터를 읽을 수 있다.
 
 
<!-- 3 --> <% Session : 저장공간. 로그인한 회원정보. 기한을 설정 --%> <% String id = "abc123"; session.setAttribute("id", id); // 세션에 "id"라는 이름으로 데이터를 저장하는 부분이다. session.setMaxInactiveInterval(60 * 60 * 2); // 세션의 유효시간 설정, 365 * 24 * 60 * 60 // 세션에 데이터를 저장하면 해당 세션이 유지되는 동안에는 이 데이터를 사용할 수 있다. pageContext.forward("default1.jsp"); %>
index1.jsp
<!-- 3 --> <% String id = (String)session.getAttribute("id"); %> <p>id: <%=id %></p>
default1.jsp
 
코드 해석
response.sendRedirect 대신 pageContext.forward 를 사용한 이유는 무엇일까?
세션에 데이터를 저장하면 해당 세션이 유지(session.setMaxInactiveInterval에 설정한 시간만큼 유지)되는 동안에는 이 데이터를 사용할 수 있어야 한다. pageContext.forward를 사용하여 세션의 데이터를 유지하면서 페이지 간에 데이터를 전달할 수 있다.
reponse.sendRedirect를 사용하지 않는 이유: 페이지 이동 후에 세션 데이터가 유지되지 않는 문제
`sendRedirect`는 웹 브라우저에게 새로운 URL로 이동하라는 명령을 내리고, 이때 브라우저는 새로운 요청을 생성하여 해당 URL로 이동하게 된다. 서버에서 새로운 요청을 받아들일 때 이전 요청과 별개의 세션 객체가 생성된다. 따라서 이전 요청에서 설정한 세션 데이터는 새로운 요청에서 접근할 수 없게 된다.
 
결과
indext1.jsp
index1.jsp
default1.jsp
default1.jsp
 

아직 이해하지 못한 부분 (추가 공부하기)

 
reponse.sendRedirect를 사용하지 않는 이유: 페이지 이동 후에 세션 데이터가 유지되지 않는 문제
간단한 코드를 구현했을 때는 문제가 없는 것처럼 보여서 차이점을 인식하기 어려웠다. 일반적인 경우를 봤을 때 `response.sendRedirect`로 설정하는 것 자체는 다음을 고려했을 때 서버 측에서 제대로 동작할 수 있지만, 효과적?이라 할 수 없기 때문에 `pageContext.forward`를 사용한다.
  1. 세션 데이터 유지:
    1. `sendRedirect`로 페이지를 이동할 때 세션 데이터가 유지되지 않는다는 점을 이해해야 한다. 이전 요청과 새로운 요청은 서버 측에서 별개의 요청으로 처리되며 세션 데이터가 공유되지 않는다. 따라서 세션 데이터를 새로운 페이지에서 사용하려면 다른 방법을 고려해야 한다.
  1. 클라이언트 측 리다이렉션:
    1. `sendRedirect`는 클라이언트에게 새로운 URL로 이동하라는 명령을 내린다. 클라이언트는 이 명령을 받고 해당 URL로 이동하게 된다. 서버에서 작동하는 것이 아니라 클라이언트 측에서 작동하는 것이다.
  1. 오류 페이지 및 예외 처리:
    1. `sendRedirect`로 이동할 때 발생할 수 있는 오류나 예외 처리하는 것도 중요하다. 이동하려는 페이지가 존재하지 않거나 접근 권한이 없는 경우 오류 처리를 고려해야 한다.
  1. 캐시:
    1. 브라우저가 이전에 방문한 URL의 캐시를 사용하여 리다이렉션된 페이지를 불러올 수 있으므로, 페이지 업데이트에 문제가 발생할 수 있다.
 
따라서 `response.sendRedirect`를 사용하여 페이지를 이동할 때 세션 데이터를 함께 유지하려면 추가적인 처리가 필요하다. 세션 ID를 URL 파라미터로 전달하거나, 쿠키를 사용하여 세션 ID를 클라이언트에 저장하고 이를 활용하여 세션을 유지한다.
→ `response.sendRedirect`를 사용하면 URL에 파라미터가 노출되니까 보안 이슈가 있을 것 같고, 세션 데이터를 유지하려면 `pageContext.forward`나 서버 측에서 데이터를 저장한 후 다시 불러오는 방식을 사용하는 것이 더 효과적이라고 이해하자.
 
?가 무엇일까 ( default.jsp?name=홍길동&age=25 )
쿼리 문자열의 시작을 의미한다. 쿼리 문자열은 웹 페이지에 데이터를 전달하는 데 사용되는 일련의 매개변수(key-value 쌍)를 포함할 수 있는 부분이다.
 
웹 애플리케이션은 이러한 매개변수를 읽어들여 처리하고, 사용자에게 동적으로 생성된 내용을 표시하는 데 사용할 수 있다. 이를 통해 웹 페이지는 사용자가 입력한 데이터에 따라 다른 내용을 표시하거나 동작을 수행할 수 있다.
 
getParameter 와 getAttribute
getParameter( )
getAttribute( )
return type
String - 웹 브라우저에서 서버로 전송된 파라미터 값을 문자열 형태로 반환한다.
Object - 빈 객체나 다른 클래스를 받아올 때 사용
설명
주로 클라이언트에서 서버로 요청(request)의 쿼리 문자열이나 POST 데이터를 읽어오는 데 사용된다.
서버 측에서 설정된 속성(attribute)값을 가져올 때 사용한다. 주로 서버 측에서 데이터를 저장하고 나중에 다른 서블릿 또는 JSP 페이지에 해당 데이터를 사용할 때 유용하다.
요약
클라이언트 → 서버로 전송된 데이터 가져오기
서버 측에 설정된 속성 값 가져오기
 
URLEncoder.encode
URL에 포함된 데이터가 올바르게 전달되고 해석될 수 있도록 문자열을 URL 인코딩하기 위함이다. URL 인코딩은 특수 문자나 공백과 같이 URL 규격에 맞지 않는 문자를 대체 문자열로 변환하는 프로세스이다.
웹 어플리케이션에서 URL에 데이터를 추가할 때 중요한 역할을 한다.
주로 response.sendRedirect() 와 함께 사용한다.
다른 경우에는 주로 사용자 입력 데이터를 웹 어플리케이션에서 데이터베이스에 저장하거나 다른 서버로 전송할 때 URL 인코딩이 필요하다. 사용자 입력 데이터를 URL에 직접 추가하지 않더라도 데이터를 처리하거나 전달할 때, 데이터에 공백 또는 특수 문자가 포함될 수 있으므로 이러한 데이터를 URL 인코딩하여 안전하게 처리한다.
notion image

함께 읽은 글
 
Share article

lamourwnl