[웹] - 서블릿을 이용한 상태 유지(session tracking)

yeom yaloo·2023년 12월 26일
0

FISA

목록 보기
26/61
post-thumbnail

상태 유지

[클라이언트의 지속적인 상태 유지 개발 기술에 대한 기본]

1. 세션

2. 쿠키

[http 웹 통신 프로토콜 특징]

1. 무상태

  • 별도의 개발 기술이 없이 http의 기본 기질은 상태를 유지하지 않는다.
  • 예시)
    a.html -> b.html로 링크 클릭 시 서버는 a.html에서 특정 클라이언트가 b.html로 이동했다는 것을 인지하지 못한다.
  • 서버의 업무 부하 감소를 위해서 http는 무상태를 기본으로 한다.

[로그인과 로그아웃 상태유지 개발 기술]

1. 세션

  • 상태 유지값을 서버 메모리에 저장한다.
  • 데이터 저장 형식은 key=value 구조로 저장한다.
  • value 타입은 모든 객체 타입을 사용할수 있다.

2. 쿠키

  • 상태 유지값을 클라이언트 시스템에 저장한다.
  • 타입과 메모리 제한이 있다.
    • 타입 : 문자열
    • 메모리 : 클라이언트 시스템 사양에 종속적이다.
  • 클라이언트에서 쿠키를 지우면 상태값 유지가 불가하다.(절대적인 보장이 불가하다.)
  • 보안을 고려한 데이터에는 부적합하다.

[Servlet을 이용한 상태 유지 개발 - 1]

servlet API를 이용한 상태 유지 개발

  • API 사용이 굉장히 쉽게 되어 있다.
  • 그러나 서블릿만을 사용해서 이를 진행하게 되면 매우 비효율적인 코드가 양상된다. 이를 해결하기 위해서 JSP라는 기술이 도입됐고 이를 사용해 해당 문제를 해결했다.

1. 세션

  • HttpSession 사용해서 세션을 사용한 상태 유지 개발을 진행한다.

2. 쿠키

  • Cookie 사용해서 쿠키를 사용한 상태 유지 개발을 진행한다.

3. GET 방식만을 사용하는 이동 방식에서 상태 유지를 위한 방법

3-0. Http에서 Get 방식을 사용하는 몇가지 방법

  • redirect
    • sendRedirect 메서드의 경우엔 HTTP 프로토콜의 특성상 새로운 URL로 GET 요청을 보내도록 설계되어있으며, 이를 준수하기 위해서 리다이렉션은 주로 GET 방식으로 이루어지게 된다.
  • Hyperlink (하이퍼링크)
    • <a> 태그를 사용하여 HTML 문서에서 다른 페이지로 이동합니다.
      사용자가 링크를 클릭하면 브라우저가 해당 URL로 GET 요청을 보냅니다.
  • Redirect (리다이렉트)
    • 서버에서 클라이언트에게 새로운 URL로 이동하라고 지시합니다.
    • 주로 HTTP 상태 코드 302(Found)나 303(See Other)와 함께 Location 헤더를 사용하여 클라이언트를 다른 URL로 리다이렉트합니다.
  • URL 호출
    • 브라우저의 주소 표시줄에 URL을 직접 입력하여 해당 페이지로 이동합니다.
    • 이 경우 브라우저는 입력된 URL로 GET 요청을 전송합니다.
    • 이미지나 자바스크립트를 통한 이동
      이미지나 자바스크립트를 사용하여 클라이언트를 다른 URL로 이동시킬 수 있습니다.
      이 경우 클라이언트가 이미지를 요청하거나 자바스크립트를 실행할 때 GET 요청이 발생합니다.
  • 포워드 방식 이외에 모든 페이지 이동 방식은 전부 다른 서블릿을 이용하고 있기 때문에 사용자 입력값 정보를 가지고 있는 getParameter를 공유할 수 없는 것이다.
    • 서블릿의 라이프사이클을 보면 생성은 요청이 서블릿 컨테이너에도착하면 객체를 생성하고 서버가 요청을 처리 후 클라이언트에게 응답을 보내면 HttpservletRequest의 객체도 소멸된다.

3-1. 기존의 포워드 방식

  • 로그인할 때 사용자 인증, 유효성 검사가 됐다면 forward 방식으로 이를 넘겨주어 굳이 사용자 로그인 아이디 값등은 request.setAttribute 해주지 않아도 request.getParameter 해주면 됐다.
  • 즉, HttpServletRequest 객체를 통해 사용자가 입력한 값들을 계속 유지할 수 있는 이유는 리다이렉트와 달리 포워드 방식에서는 클라이언트(브라우저)는 새로운 요청을 보내지 않고 서부 내부에서만 처리되기 때문에 사용자 입력값을 굳이 setAttribute로 처리해 주지 않더라도 다음 서블릿 내에서 getParameter로 계속 입력값을 받아올 수 있다.

[Servlet을 이용한 상태 유지 개발 - session]

1. HttpSession을 사용한 방식

  • HttpSession은 서버 메모리에 클라이언트의 상태 유지값을 저장하는 기술의 API이다.
  • 개발자는 API를 활용해서 쉽게 상태 유지를 할수 있다.
  • 스펙 지원 서버인 servlet container에서 HttpSession을 사용할 수 있게 해준다.

2. 하이퍼링크를 사용한 GET 방식 사용시 상태 유지 방법 코드

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/check")
public class LoginCheck extends HttpServlet {


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 클라이언트가 전송한 데이터를 getParameter로 받아와 유효성 검증하기
		
		String id = request.getParameter("userId");
		String pwd = request.getParameter("pwd");
		
		//응답 객체 컨텐츠 설정 작업
		response.setContentType("text/html;charset=utf-8");
		
		//접속한 user의 브라우저에 출력할 때 사용한다.
		PrintWriter out = response.getWriter();
		
		//브라우저에 보이는 ui는 servlet 관점에서는 문자열로 개발한다.
		if (id.equals("fisaman")  && pwd.equals("11")) {
			//step 01 - redirect를 이용해도 사용자 정보를 사용할 수 있게 하는 방법 
			// 상태 유지를 위한 정보 세션 객체에 저장
			
			/* 클라이언트만의 고유한 세션 객체 생성 - new로 생성이 불가하다.
			 * 해당 클라이언트만의 세션에 이름 저장.
			 * 클라이언트마다 세션의 아이디값이 다르다. 
			 * */
			HttpSession session = request.getSession();
			System.out.println(session.getId());
			
			session.setAttribute("name", "연아");
			session.setAttribute("id", id);
			
			
			out.println("안녕 <br>");
			out.println("<button onclick=\"location.href='welcome'\">두번째 페이지로 이동</button>");
			
		
			return;
		}

	}

}
  • 해당 방식은 하이퍼링크를 사용해서 페이지를 이동하고 있다. 이때 하이퍼링크를 사용한 방식은 포워드 방식이 아니기 때문에 사용자 입력값이 공유되지 않기 때문에 이를 다음 서블릿에서 사용하려면 세션, 쿠키 같이 상태 유지에 사용하는 기술을 이용해서 지속해줘야 한다.
  • 포워드 방식을 제외한 모든 이동 방식
    • 새로운 요청에 대해서 브라우저가 다른 서블릿에게 요청하는 방식이다.
  • 포워드 방식
    • 서버 내의 이동 작업이다.
    • url1 -> url2로 옮겨가는 작업이다.

2-1. 세션마다 다 다른 Id값을 가진다.

클라이언트마다 다 다른 세션 아이디 값

  • 클라이언트마다 세션id 값은 다 다르다.
  • HttpServletRequest.getSession()에서 세션을 받아올 때 web container에서 이를 요청해서 받아온다.

1. Cookie를 이용한 방식

  • Cookie는 클라이언트 서버에 저장하는 기술이다.
  • 요즘은 메모리 부하를 고려해서 쿠키를 이용한 방식을 선호한다고 한다. 이때는 물론 개인정보를 담는 것이 아닌 UUID 값을 랜덤으로 넣어주고 이를 이용하는 식의 방식을 이용할 것이다.

2. 하이퍼링크를 사용한 GET 방식 사용시 사태 유지 방법 코드 - 쿠키

import javax.servlet.http.Cookie;


@WebServlet("/check")
public class LoginCheck extends HttpServlet {

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 클라이언트가 전송한 데이터를 getParameter로 받아와 유효성 검증하기
		
		String id = request.getParameter("userId");
		String pwd = request.getParameter("pwd");
		
		//응답 객체 컨텐츠 설정 작업
		response.setContentType("text/html;charset=utf-8");
		
		//접속한 user의 브라우저에 출력할 때 사용한다.
		PrintWriter out = response.getWriter();
		
		//브라우저에 보이는 ui는 servlet 관점에서는 문자열로 개발한다.
		if (id.equals("fisaman")  && pwd.equals("11")) {
			Cookie name = new Cookie("name", "재석");
			Cookie age = new Cookie("age","40");
			
			name.setMaxAge(60*60*24*365);
			age.setMaxAge(60*60*24);
			
			response.addCookie(name);			
			response.addCookie(age);
			
			
			out.println("안녕 <br>");
			out.println("<button onclick=\"location.href='welcome'\">두번째 페이지로 이동</button>");
			
			return;
		}
	
	}

}
  • 해당 작업을 진행하면 쿠키를 클라이언트가 지우지 않으면 만료 시간을 설정한 만큼 쿠키는 살아있다.
  • 위의 설명한대로 포워드 방식이외에는 모두 객체 공유가 되지 않고, httpServletReqeust.setAttribute 작업을 해준다고 해도 요청 범위에서만 데이터를 유지하기 때문에 상태 유지를 위해서 Session이나 Cookie를 사용한다.
profile
즐겁고 괴로운 개발😎

0개의 댓글