🌳 상태정보 유지

인터넷 웹 서비스는 클라이언트와 서버가 통신할 때 http 프로토콜을 사용한다.

Http는 비연결성(Connectionless)과 무상태(Stateless)로 동작하는 프로토콜이라 이전 연결 때의 상태 정보를 서버가 유지해주지 않는다.

그러므로 상태정보를 일정시간 동안 지속해서 유지해주는 기술인 '상태 정보(State Information) 유지 기술'을 필요로 한다. 클라이언트 측에 저장하여 우지하는 기술과 서버측에 저장하여 유지하는 기술이 있다.

상태 정보 유지 필요성 - Http의 비연결성을 보완
- 장바구니와 같이 여러 페이지로 이동하더라도 사용자 정보와 필요 정보 유지 필요
- 페이지 간의 지속성 서비스를 제공하기 위한 기법

 

1️⃣ 웹에서 사용하는 http 프로토콜의 통신 방식

클라이언트와 서버간의 연결을 클라이언트로부터 요청이 있을 때마다 매번 새롭게 연결하는 방식이다.

요청이 있을때 마다 연결 작업이 새롭게 이루어지고, 서버가 클라이언트에세 응답을 보내는 즉시 끊어진다.

이처럼 클라이언트와 서버 간에 연결상태가 유지되지 않는 통신 방식을 무상태라고 한다.

 

2️⃣ 무상태 통신 방식의 특징

한번 접속한 후 연결이 유지되지 않고 끊어지기 때문에 서비스를 요청한 클라이언트에 대한 정보가 유지되지 않는다.

즉 클라이언트에서 연속해서 서버에 정보를 요청하더라도 요청 단위로 연결이 맺어져서 이전의 작업은 지금의 연결 작업과는 아무런 관계가 없다.

 

3️⃣ 클라이언트가 이전 요청에서의 처리결과를 계속해서 다른 요청에서도 사용하고 싶다면?

클라이언트 측에 저장하여 우지하는 기술과 서버측에 저장하여 정보를 유지한다.

 

 

 

🌳 http의 비연결성

웹에서 클라이언트가 요청을 하면 서버는 응답을 한다

즉 한 페이지의 요청과 그 요청에 대한 응답이 있을 때만 클라이언트와 서버가 연결될 뿐 그 이후에는 연결이 자동으로 종료된다.

웹을 지원하는 http 통신 규약은 비연결 또는 무상태 특성을 가지기 때문이다

 

 

 

 

🌱 - 1. 저장 위치 분류

클라이언트의 어떤 요청에서 처리된 결과를 계속 사용하려면 정보를 저장해서 유지해야 하는데 저장하는 위치에 따라 상태정보 유지 기술을 분류하면 다음과 같다.

클라이언트 측에 저장기술
  설명 : 웹에서 클라이언트는 웹 브라우저를 의미한다.
- 그래서 클라이언트 측에 저장한다는 것은 웹브라우저가 저장하는 것을 뜻한다.
( 클라이언트측에 정보를 유지하는 기술을 쿠키(Cookie)가 있다. )
  객체 javax.servlet.ServletContext
javax.servlet.http.HttpSession
javax.servlet.http.HttpServletRequest

 

서버 측에 저장 기술
  설명 : 서버의 힙 메모리 영역에 만들어진 객체에 상태 정보를 저장하는것을 의미한다.
- 상태정보가 저장된 객체가 힙메모리 영역에 존재하는 한 등록된 상태정보는 계속해서 사용할 수 있다
  객체 javax.servlet.ServletContext
javax.servlet.http.HttpSession
javax.servlet.http.HttpServletRequest

 

🌱 - 2. 유지 기간 분류

웹 애플리케이션 단위로 유지
: 웹 애플리케이션이 서비스되고 있는 동안은 유지하는 것을 의미한다.
- 웹 애플리케이션과 같은 객체는 ServletContext이다.
- ServeltContext 객체는 웹 애플리케이션 서비스가 시작될 때 생성되고 종료될 때 소멸한다.
- 그래서 ServletContext 객체에 상태정보를 정하면 웹 애플리케이션이 서비스 되고있는 동안에 사용이 가능하다.
javax.servlet.ServletContext

 

클라이언트 단위로 유지
클라이언트별로 구분해서 상태정보를 유지하는 것을 의미한다.
A 클라이언트가 사용하는 상태정보는 다른 클라이언트는 사용을 못해야한다 ( 대표적인것이 로그인 )
쿠키는 클라이언트 측에 상태정보를 유지하는 기술이어서 당연히 클라이언트 단위 상태정보 유지되어 사용되며, 서버 측에서 클라이언트별로 생성되는 HttpSession 객체를 통해 클라이언트 단위로 상태정보를 유지할 수 있다.

   클라이언트 단위로 상태정보를 유지해야되는 상황
  • 이전에 방문한 적이 있는 웹 서버에 다시 방문했을때 몇번째 방문인지 출력하는 상황
  • 회원가입 화면에서 자동으로 주소, 전화번호등이 입력되는 상황
  • 로그인하고 난 후 로그아웃 할 때 인증상태 유지
  • 쇼핑몰에서 클라이언트가 체크했던 상품 정보 유지
  • 포털 사이트에서 클라이언트가 특별히 관심있어 하는 항목에 대한 정보 유지
javax.servlet.http.Cookie
javax.servle.http.HttpSession

 

요청단위로 유지
클라이언트 서비스 요청 단위로 유지한다는 것을 의미한다.

클라이언트로부터 요청이 들어오고 응답이 나가기까지가 하나의 요청이다.
하나의 요청에서만 상태정보를 유지할때는 HttpServletRequest 객체를 통해서 할 수 있다.
javax.servlet.http.HttpServletRequest

 

 

 

🌳 쿠키와 세션 (cookie and session)

클라이언트 단위 유지

이처럼 클라이언트 단위로 상태정보를 유지하려면 쿠키와 세션을 사용해야한다.

 

쿠키와 세션을 사용하는 기준

  • 상태정보의 유지기간이 브라우저가 종료될 때까지 인지의 여부
  • 유지하려는 정보의 저장위치 (서버, 클라이언트)
  • 유지하려는 정보가 공개되어도 되는지의 여부

 

  쿠키 (cookie) 세션 (session)
저장위치 클라이언트
: 클라이언트 정보 관히 방법으로 클라이언트의 사용자 컴퓨터에 사용자 정보를 저장 관리
서버 (서버의 메모리)
: 웹 페이지간의 정보를 유지하기 위해 브라우저마다 각기 다른 사용자 정보를 서버에 저장하는 방법
저장 데이터 타입 텍스트 (문자열 형태만 가능) 객체 (자바의 모든 객체)
저장 데이터 크기 제한있음 서버에서 수용할 수 있는 만큼
정의 ⦁ Client의 정보를 클라이언트 PC에 저장하는것
: 쿠키는 서버에서 만들어진 작은 정보의 단위,
서버가 클라이언트에 저장하는 정보
Client마다 각기 다른 정보를 서버에 저장하는것
: 세션은 Http기반으로 동작하는 클라이언트가 서버에 정보를 요청할 때 상성되는 "상태 정보"
특징  저장된 정보를 다른 사람 또는 시스템이 볼 수 있는 단점
 유효기간이 지나면 사라짐
⦁  서버가 종료되거나 유효시간이 지나면 사라짐
⦁  세션은 클라이언트 사용자 별로 여러 페이지 이동을 인식
⦁  HttpSession 객체가 생성될 때는 요청을 보내온 클라이언트 정보, 요청 시간 정보 등을 조합한 세션 ID가 부여되며, 이 세션 ID는 클라이언트 측에 쿠키 기술로 저장된다.
사용 Class, Interface class javax.servlet.http.Cookie Interface javax.servlet.http.HttpSession
관련 내장 객체 response, request session
정보 크기 4KB 이하의 크기로 총 1.2M로 제한 있음 제한 없읍
보안 어려움 강력함
더보기

🌳 쿠키의 이용 방법

  쿠키는 그수와 크기에 제한

- 하나의 쿠키는 4KB이하의 크기로 일반적으로 생성
- 브라우저는 각각의 웹사이트당 20개의 쿠키를 허용
- 쿠키 값은 문자열을 지원하고 쿠키 정보는 클라이언트 컴퓨터에 파일 형태로 저장되어 다른 사람이나 시스템이 볼 수 있으므로 비밀유지가 어렵다

 

  이용 방법

- 서버에서 클라이언트의 브라우저로 전송되어 사용자의 컴퓨터에 저장
- 저장된 쿠키는 다시 해당하는 웹 페이지에 접속 할 때, 브라우저에서 서버로 쿠키를 전송
- 쿠키는 이름과 값으로 구성된 자료를 저장
- 이름값 외에도 path(경로), version(버전), domain(도메인), maxage expiry유효기간과 같은 추가적인 정보를 저장

 

 쿠키 클래스 🍎🍎🍎

반환형 메소드 이름 메소드 기능
int getMaxAge() 쿠키의 최대 지속 시간을 초 단위로 반환.
-1일 경우 브라우저가 종료되면서 쿠키도 바로 만료되게 한다
String getName() 쿠키의 이름을 String으로 반환
String getValue() 쿠키의 값을 String으로 반환
void setMaxAge(int expiry) 쿠키의 만료시간을 초단위로 설정
void aetValue(String value) 쿠키에 값을 설정할 때 사용

 

 

🌳 쿠키 추가 

 쿠키 생성

-  쿠키는 (이름, 값)의 쌍 정보를 입력하여 생성.

-  쿠키의 이름은 알파벳과 숫자로만 구성되고, 쿠키값은 공백, 괄호, 등호, 콤마, 클론, 세미클론 등은 포함 불가능

Cookie cookie = new Cookie(name, value);

 

 클라이언트의 컴퓨터에 파일 형태로 저장

-  내장 객체 response의 addCookie 메소드를 이용

response.addCookie(cookie);

 

 쿠키의 유효기간 설정

  • 메소드 setMaxAge(초단위)
  인자는 유효기간을 나타내는 초 단위의 정수형
  만일 유효기간을 0으로 지정하면 쿠키의 삭제
  음수(-1)를 지정하면 브라우저가 종료될 떄 쿠키가 삭제
  • 유효기간을 2분으로 지정하려면
  2분 동안 유효 : cookie.setMaxAge(2 * 60);
  7일동안 유효: cookie.setMaxAge(7 * 24 * 60 * 60);
  365일동안 유효: cookie.setMaxAge(365 * 24 * 60 * 60);

 

 

🌳 쿠키 조회

  클라이언트에 저장된 쿠키를 조회

- 내장객체 request의 getCookies() 메소드를 이용

- 메소드 getCookies()의 반환 값은 저장된 모든 쿠키의 배열

// 쿠키가 없으면 null 값이 반환
Cookie[] cookies = request.getCookies();

 

  각각의 쿠키를 얻는 방법

- 쿠키 배열 변수 cookies는 다음과 같이 for each문 이용

for (Cookie c : cookies) {
	out.println("쿠키 이름(name):" + c.getName() + ",");
	out.println("쿠키 값(value):" + c.getValue());
	out.println("<br/>")
}
더보기

🌳 세션 트래킹 (session tracking)

HttpSession객체 : 클라이언트마다 개별적으로 생성되어 유지됨

HttpSession객체는 요청을 보내온 클라이언트와 서버간에 일정 시간동안(최대 시간은 브라우저가 살아 있는 동안) 각 클라이언트의 상태 정보를 서버에 저장하여 유지하고자 하는 목적으로 사용하는 객체이다.

 

세션 트래킹(session tracking) : 클라이언트마다 상태정보를 일정 시간 동안 개별적으로 유지하여 사용하는 기술.

  세션 트래킹 기능의 구현 순서는 다음과 같다
  1. 클라이언트를 위한 세션을 준비한다.
  2. 세션을 생성한다. (이전에 이 클라이언트를 위해 생성된 세션이 이미 존재하면 존재하는 세션을 추출)
  3. 유지하고자 하는 정보를 저장할 목적의 객체를 생성하여 세션에 등록한다.
  4. 클라이언트가 요청을 전달할 떄마다 세션에 등록된 정보를 담고있는 객체를 추출하여 원하는 기능에 사용한다.
  5.  세션이 더이상 필요없는 시점에서 세션을 삭제한다.

 

 

🌳 HttpSession 클래스를 이용한 세션 처리 방법

  • 세션의 정보는 클라이언트가 서버에 접속해서 종료될 때까지(브라우저를 종료할 때까지)유지된다.
  • 상태정보가 서버에 저장되기 떄문에 서버의 부하가 클 수 있다
  • time-out 제한을 걸어 일정시간동안 요청이 없으면 서버는 세션정보를 유지하지 않고 제거한다.

 

반환영 메서드 이름 메서드 기능
long getCreationTime()  
String getId()  
int getMaxInactiveInterval()  
void setMaxInactiveInterval()
(int interval)
 
void setAttribute(String name, Object value)  
Object getAttribute(Sttring name)  
Enumeration getAttributeNames()  
void removeAttribute(String name)  
void invalidate()  
boolean isNew()  

 

'Language > JSP (Java Server Pages)' 카테고리의 다른 글

JSP 내장 객체  (0) 2022.07.25
JSP 기본 문법  (0) 2022.07.10
Servlet (서블릿)  (0) 2022.06.26
Web Programming (인터넷 프로그래밍)  (0) 2022.06.23
JSTL 표준 커스텀 태그  (0) 2022.06.15