[WEB] Servlet 상태 유지

geesuee·2021년 9월 1일
1

Web

목록 보기
4/8

1. 상태 유지 기술

💥 http의 기본 특성 💥

  • 비연결성(Connectionless) : 클라이언트와 서버가 한 번 연결을 맺은 후, 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어버리는 성질
  • 무상태(Stateless) : 비연결성으로 인해 서버가 클라이언트를 식별하지 못하는 상태

>> 다 이유는 있다..💨
서버가 모든 클라이언트와의 연결을 유지하면 많은 리소스 발생

하지만 서버가 클라이언트를 기억하고 있지 않으면,
1) 동일한 클라이언트의 모든 요청에 대해 매번 새롭게 연결/해제 과정 진행 = 연결/해제에 대한 오버헤드 발생!

KeepAlive로 개선 : Http의 KeepAlive 속성으로 지정된 시간동안 서버-클라이언트 간 패킷 교환이 없을 시 확인용 패킷 주기적 발송, 패킷에 반응이 없으면 연결 끊음! (주기적으로 클라이언트 상태를 체크하는 것이 완벽한 해결책은 ❌)


2) 웹에서 물건 구매하는 상황 가정

  • 로그인
  • 물건 서치 후 클릭(화면 이동)
  • 다시 로그인
  • 장바구니에 넣기
  • 다시 로그인..
  • 결제
  • 또...로그인.........

이렇게 매번 새로운 인증을 해야하는 클라이언트 측 번거로움 발생

ㄴ 서버가 클라이언트 정보를 기억하기 위해 상태 유지 기술 필요!

참고 자료 : victolee




2. 상태 유지 처리 방법

http는 위의 기본 특성에 따라 클라이언트 정보를 기억하고 있지 않기 때문에,
상태 유지 처리는 개발자가 코드로 구현하여 처리해주어야 함


👇 개발자가 구현하는 상태 유지 처리 방법 👇

  • 로그인 ~ 로그아웃까지의 고유한 user 인증 및 권한 부여를 위한 기본 설정
  • web page 이동 방식(forward, redirect)과 무관하게 상태 유지

1) 쿠키..🍪

  • 클라이언트 시스템에 상태 유지 값 몰래 스윽 저장
  • 저장하는 데이터 타입 = 문자열(String) 한정
  • 보안 고려 ❌, 보안이 필요한 데이터는 쿠키로 ❌
[생성 및 저장]
  Cookie cookie = new Cookie("key", "value");
  cookie.setMaxAge(초단위로 저장 기간 설정); 	//client 시스템에 잔존 시간 설정
  response.addCookie(cookie); 			//client 시스템에 전송해서 저장

  ... 여러 개 생성 가능 
				
[활용]
  Cookie[] 변수명 = request.getCookies();
  getName() - key 반환
  getValue() - value 반환

2) 세션

  • 서버 시스템에 상태 유지 값 저장 → 쿠키보다 보안 고려 + 안정적
  • 저장하는 데이터 타입 = 객체 타입이라면 다 가능!
  • 클라이언트가 많아질수록 부하 야기.. → 다른 상태 유지 기술과 적절히 혼용하여 서버 부하 방지해야함

세션의 원리
1. 웹 컨테이너가 클라이언트 한 명씩 구분하여 HttpServletRequest 개별 생성
2. 해당 클라이언트에 매핑된 상태 유지 정보가 없을 경우 HttpSession 객체 생성, 이미 있을 경우 재사용


그렇다면, 다수의 클라이언트들을 어떻게 구분하는걸까?
1. 클라이언트(유저)가 접속하면 무조건 JSESSIONID를 중복되지 않도록 랜덤하게 생성하여 매핑
2. 해당 값을 쿠키🍪로 저장
3. 웹 컨테이너가 JSESSIONID로 클라이언트를 구분하여 특정 클라이언트(유저)에 대한 상태 유지 값을 세션에 저장

[생성 및 저장]
   HttpSession session = request.getSession();
   session.setAttribure("key", value);
				
[활용]
   HttpSession session = request.getSession();
   Object 변수명 = session.getAttribute("key");
	
   //세션 자원 보호를 위해서 가령 login 후 logout 시에 반드시 자원 해제
   session.invalidate();

3) 토큰(JWT)

ㄴ 강력한 보안으로 토큰 사용을 선호하는 추세

라고 하는데 토큰에 대해서는 아직 자세히 배우지 않아서 이건 다음 기회에..!

ㄴ 쿠키, 세션은 forward/redirect 상관없이 상태 유지!🔥

profile
기록하는 오늘의 노력🌻

0개의 댓글