[Web] 페이지 이동과 정보 공유(Cookie, Session, Scope Object)

2022. 10. 20. 18:17·Programming/Web
728x90

웹 프로그래밍에서 서블릿이 주로 사용되는 영역은 MVC 패턴 구조의 컨트롤러에 해당한다. 컨트롤러는 사용자 요청을 받아 데이터베이스와 연동 등의 작업을 처리한 다음 결과에 따라 적절한 페이지로 전환해주는 기능을 담당한다. 이때 페이지 이동과 함께 페이지 간 정보 공유 기법에 대한 이해가 필요하다.

페이지 이동

컨트롤러에서 사용자 요청을 처리한 다음에는 적절한 뷰로 이동할 수 있어야 한다. 이때 뷰에서 보여줄 데이터를 포함해서 이동해야 하는 경우와 그렇지 않아도 되는 경우가 있다.

데이터를 포함하지 않는 경우

사용자 요청 처리 후 별도의 데이터를 포함하지 않는다면 해당 페이지로 바로 리디렉션할 수 있다. 혹은 세션에 데이터를 저장한 경우라면 세션이 유효한 동안 모든 페이지에서 세션 정보를 참조할 수 있어 리디렉션을 통해서도 데이터 참조가 가능하다.

JSP, 서블릿 모두 response.sendRedirect()를 사용할 수 있다.

response.sendRedirect("main.jsp");

데이터를 포함하는 경우

만일 데이터를 포함하여 이동한다면 request 속성으로 데이터를 넣은 후 원하는 페이지로 포워딩해야한다. 데이터 활용 목적에 따라 session이나 application을 사용할 수도 있으며 여러 데이터를 포함하는 것도 가능하다.

데이터를 포함하여 포워딩할 경우, 다음과 같이 구현할 수 있다.

JSP로 구현할 경우

<%
    request.setAttribute("member", m);
    pageContext.forwared("userInfo.jsp");
%>

서블릿으로 구현할 경우

doGet(...){
    ...
    request.setAttribute("member", m);
    RequestDispatcher dispatcher = request.getRequestDispatcher("userInfo.jsp");
    dispatcher.forword(request, response);
}

스프링 프레임워크로 구현할 경우

인자로 전달된 모델 객체에 원하는 데이터를 저장하고 뷰 페이지 이름을 리턴하기만 하면 된다.

@GetMapping("info")
public String getMemberInfo(int id, Model model) {
    ...
    model.addAttribute("member", m);
    return "userInfo";
}
  • 리턴되는 문자열 값을 뷰 페이지의 이름이며 확장자는 생략한다.

정보공유

WWW은 비연결형 구조의 HTTP를 사용하기 때문에 페이지 요청과 응답이 완료되면 연결이 유지되지 않는다. 따라서 클라리언트가 다른 페이지를 요청할 때 부가적인 정보가 없다면 서버는 클라이언트의 현재 상태를 알 수 없기 때문에 처음 접속한 것과 마찬가지로 인식할 수밖에 없다.

예를 들어 온라인 쇼핑몰에서 여러 페이지에 걸쳐 상품의 정보가 흩어져 있기 때문에 현재 페이지에서 선택된 상품에 대한 정보는 다른 페이지로 전달되지 않는다. 이러한 문제를 해결하기 위해 사용하는 방법으로 URL rewriting, 쿠키, 세션이 있다.

URL rewriting

HTTP의 Query String을 이용하는 방식으로 URL에 파라미터를 추가해 서버로 요청하는 형식이다. 이 방식은 정보 유지를 위해 파라미터를 매 페이지마다 확인하고 계속 추가해주어야하며 복잡한 정보 유지는 어렵다는 문제점이 있다.

https://www.abc.com/shop/productInfo?user=hong&p1=0112&p2=12021&sel=11786
  • productInfo라는 서버 프로그램(JSP 혹은 서블릿)을 요청한다.
  • 현재 상품 정보를 보여주면서 사용자 정보와 지금까지 선택된 상품 정보를 모두 URL에 포함한다.

쿠키

쿠키(Cookie)란 클라이언트에 저장되는 작은 정보를 의미한다. 서버의 요청에 의해 브라우저가 저장하게 되며 서버가 요청할 때 제공하는 형식이다.

 

쿠키의 특징

  • 파일로 클라이언트의 컴퓨터에 저장되는 방식이며 보안상 문제가 있을 수 있다.
  • 광고 혹은 기타 목적으로 사용자의 이용 형태 추적에 이용될 수 있으며, 이러한 목적의 경우 사용자 정보 활용 동의가 필요하다.
  • 연속되는 페이지 이동에 대한 정보 저장보다는 재방문 등의 확인 용도로 많이 사용된다.
  • 'name=value' 형식이며 유효 기간, 요청 경로, 도메인 지정 등의 부가 속성을 포함한다.
  • 주로 자바스크립트를 통해 처리하지만 HttpOnly 설정으로 서버에서만 사용할 수 있도록 설정 가능하다.

쿠키의 동작 과정

쿠키의 동작 과정

  1. 서버에서 쿠키를 생성한다.
  2. 쿠키를 응답 헤더에 넣어 클라이언트로 전송한다.
  3. 웹 브라우저는 쿠키를 (a) 하드 디스크(유효 기간 설정) 혹은 (b) 브라우저 메모리(유효 기간 미설정)에 저장한다.
  4. 쿠키에 지정된 경로에 요청 시 받은 쿠키를 서버에 전송한다.

②의 서블릿 코드에서 쿠키를 저장하는 방법은 다음과 같다.

response.addCookie(new Cookie("name", "hong"));
response.addCookie(new Cookie("tel", "010-1234-1234"));
response.addCookie(new Cookie("email", "hong@korea.com"));

위의 코드는 다음의 HTTP 응답으로 클라이언트에 전달된다.

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: name=hong
Set-Cookie: tel=010-1234-1234
Set-Cookie: email=hong@korea.com
Content-Type: text/html;charset=utf-8
Content-Length: 160
Date: Thu, 20 Oct 2022 11:11:10 GMT

...HTTP BODY...

세션

세션(Session)은 클라이언트가 웹 애플리케이션 서버에 접속할 때 서버 쪽에 생성되는 공간으로 내부적으로는 세션 아이디를 통해 참조된다. 즉 브라우저는 서버에 접속할 때 발급받은 세션 아이디를 기억하고 서버는 해당 세션 아이디로 할당된 영역에 접근하는 형식이다.

 

세션의 특징

  • 세션 유효 시간이나 브라우저 종료 전까지 유지되므로 서로 다른 페이지에서도 정보 공유가 가능하다.
  • 로그인 유지, 장바구니, 컨트롤러 구현 등에서 다양하게 사용된다.
  • 사용자마다 생성되는 공간으로, 동시에 많은 사용자가 세션을 통해 대량의 데이터를 관리한다면 충분한 메모리를 비롯한 세션 관리 대책이 필요하다.

세션이라는 개념은 자바 웹 개발에만 있는 개념이 아니며 Scope Object중 하나로 속성 관리와 함께 자바 웹 개발에서 중요한 개념이니 잘 알아둔다.

효율적인 세션 관리
세션관리의 효율을 위해 별도의 세션 관리 데이터베이스를 사용하는 경우도 있다. 가장 일반적인 형태는 redis라고 하는 인메모리 데이터베이스를 사용하는 것이다. redis는 NoSQL 형태로 단순 key-value 구조의 데이터를 빠르게 처리할 수 있어 인기가 많다.

속성 관리

컨테이너는 서블릿 관리를 위해 몇몇 객체를 자동으로 생성하고 유지하는데, 이러한 객체 중 속성 관리 기능을 제공하며 특정 범위 동안 유지되는 객체를 Scope Object라고 한다. 각각의 객체는 관리 목적에 따라 별도의 메서드로 구현된 기능을 가지고 있고 공통적으로 '키-값' 형태의 맵(Map) 자료구조를 가진다. 이를 활용하면 페이지 간, 사용자 간 데이터 공유가 가능하다. JSP 역시 서블릿으로 변환되기 때문에 동일하다고 볼 수 있으며, useBean 액션의 scope에 사용되는 page, request, session, application이 여기에 해당된다.

이러한 객체는 각각 생성, 소멸 시기가 정해져 있고 서로 다른 JSP, 서블릿 간의 데이터 전달이나 공유를 위한 용도로 활용된다.

Scope Object의 종류와 특징
Scope Object 클래스 생성 소멸 범위
Request javax.servlet.ServletRequest 현재 페이지가 요청될 때 다른 페이지로 이동할 때 현재 페이지, 포워딩의 경우 다음페이지까지 참조 가능
Session javax.servlet.http.HttpSession 클라이언트가 서버에 접속할 때 일정 시간이 지나거나 브라우저가 종료될 때 동일 클라이언트에 대해 다른 페이지에서도 참조 가능
Web Context javax.servlet.ServletContext 웹 애플리케이션이 시작될 때 웹 애플리케이션이 종료될 때 모든 클라이언트에서 참조 가능

Request와 Session을 주로 활용하게 되며 모든 사용자가 공유하거나 웹 애플리케이션 전체에서 참조가 필요한 경우 Web Context를 사용할 수 있다.

이러한 객체는 속성을 저장하고 참조하기 위해 다음 메서드가 공통적으로 제공된다.

setAttribute(String name, Object o) // 속성 저장
Object getAttribute(String name) // 속성 참조
  • name은 속성을 저장하고 참조하기 위한 키값이다.
  • 속성은 Object 타입으로 모든 자바 클래스 타입이 가능하다.
  • getAttribute()의 리턴은 Object이므로 적절한 형 변환이 필요하다.

이때 저장하고자 하는 데이터가 Object 형태라는 점을 주의해야 한다. Object 타입은 저장할 때는 상관없지만 데이터를 가지고 오는 경우 리턴된 Object 타입을 원래 저장된 데이터 타입으로 변환해야 하기 때문이다.

String name = "홍길동";
request.setAttribute("name", name);
String rname = (String) request.getAttribute("name");

페이지 이동과 정보 공유 시나리오

페이지 이동 및 정보 공유가 웹 애플리케이션 프로그래밍에 어떻게 적용되는지 살펴본다.

로그인

로그인 후 세션을 이용해 사용자 이름을 저장하고 메인 화면으로 이동하는 경우다.

  1. 클라이언트가 로그인한다.
  2. 컨트롤러는 request.getParameter()를 통해 클라이언트의 id와 password를 확인한다.
  3. 로그인 정보가 맞을 경우 사용자 이름이나 기타 정보를 세션에 저장한다.
  4. 메인 화면으로 리디렉션한다.
// 컨트롤러(controller)
session.setAttribute("uname", "홍길동"); // 이름을 세션에 저장
response.sendRedirect("/main.jsp") // 메인 화면으로 리디렉션

// main.jsp
<h2>${uname}</h2> // 이름 출력

게시판 목록

데이터베이스 연동을 통해 리스트 형태의 데이터를 저장하고 JSP에서 사용하는 경우다.

  1. 컨트롤러는 DB로부터 게시판의 첫 번째 페이지 데이터를 가지고 온다.
  2. request에 리스트 형태로 데이터를 저장한다.
  3. 목록 화면으로 포워딩한다.
//컨트롤러(controller)
List<Member> mlist = dao.getMemberList();
request.setAttribute("mlist", mlist); // 리스트 형태로 데이터 저장
request.getRequestDispatcher("./mlist.jsp").forward(request, response);
  • session과 달리 request에 저장된 데이터는 페이지 리디렉션을 이용하면 전환할 때 데이터가 소멸되므로 포워딩 방식을 사용해야 한다.

'Programming > Web' 카테고리의 다른 글

[Web] 템플릿 데이터와 스크립트 요소(<%! %>, <%= %>, <% %>)  (0) 2022.10.20
[Web] JSP의 개요(JSP의 장단점, page지시어, include지시어, taglib지시어)  (0) 2022.10.20
[Web] 서블릿 클래스 구조와 생명 주기  (0) 2022.10.20
[Web] 서블릿의 개요  (0) 2022.10.20
[Web] 스프링 프레임워크  (0) 2022.10.20
'Programming/Web' 카테고리의 다른 글
  • [Web] 템플릿 데이터와 스크립트 요소(<%! %>, <%= %>, <% %>)
  • [Web] JSP의 개요(JSP의 장단점, page지시어, include지시어, taglib지시어)
  • [Web] 서블릿 클래스 구조와 생명 주기
  • [Web] 서블릿의 개요
arajo
arajo
  • arajo
    아라 메모장
    arajo
  • 전체
    오늘
    어제
    • 분류 전체보기 (509)
      • Language (298)
        • HTML (55)
        • CSS (11)
        • JavaScript (70)
        • TypeScript (8)
        • Python (33)
        • Java (119)
        • C (0)
        • C# (2)
      • Programming (92)
        • Programming (14)
        • Web (51)
        • Apache (1)
        • MySQL (23)
        • AWS (3)
      • Framework | Library (26)
        • Framework | Library (3)
        • Vue.js (2)
        • React.js (5)
        • React Native (4)
        • Node.js (1)
        • Ajax (1)
        • Bootstrap (8)
        • Spring (1)
        • Flutter (1)
      • etc (2)
      • 휴식 (19)
        • 책 (13)
        • 일기 (5)
        • 게임 일기 (1)
      • A (71)
        • 공부 (18)
        • 기타 (6)
        • 일 (47)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    object
    CSS
    변수
    JavaScript
    react
    제어문
    MySQL
    타입스크립트
    array
    HTML
    Java
    파이썬
    TypeScript
    리액트
    자바스크립트
    event
    next.js
    web
    객체
    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
arajo
[Web] 페이지 이동과 정보 공유(Cookie, Session, Scope Object)
상단으로

티스토리툴바