Developer/Spring eGov4.0 (Java11, Tomcat9)

Servlet Scope와 세션 관리 이해하기: 객체 생성부터 소멸까지

단님 2024. 11. 4. 16:29
728x90
생명 주기(Scope 개념 알아보기)

 

서블릿 기반의 웹 애플리케이션에서 각 객체의 생명 주기(Scope)세션 관리는 웹 서비스의 중요한 요소이다.

특히 요청(Request), 세션(Session), 애플리케이션(Application) 등 서로 다른 생명 주기를 가진 객체들은 각기 다른 시점에 생성되고 소멸된다. 이 글에서는 Servlet Scope의 개념과 함께 setAttribute와 getAttribute 메서드를 이용하여 데이터를 관리하는 방법을 알아보고, 로그인 정보 관리와 쿠키 사용 등 실무에서 필요한 정보를 정리해보고자 한다.


Servlet Scope 종류와 객체의 생명주기

 

메모리에 각각의 객체를 생성하고 소멸하고 반복적으로 일어나는데 이에 대한 Scope를 알아보자.

PageContext

하나의 웹페이지를 유지하는 page  → 이전 페이지는 메모리를 지움.

HttpServletRequest

요청에 대한 request → 요청이 완료될때까지 객체 유지 , 요청이 완료되면 소멸

HttpSession

개별 한사람 한사람에 대한 session →  개별 사용자에 대한 세션을 유지

로그인 등 클라이언트 정보를 서버에 저장하는 데 사용

누가 들어왔다면 쿠키에 세션객체 보관.session_Id

ServletContext

서버 유지에 관련된 , application → 서버 종료가 될때까지 객체 유지

 


Session / HTTP / cookie
Session 

클라이언트(접속자)가 방문했을때 , 클라이언트의 정보를 보관한다.

클라이언트마다 세션이 존재하고 , 오직 서버에서만 생성된다.

세션 스토리지와 다른 의미. 서버에서 말하는 세션 객체를 의미.

 

✔️세션을 통한 로그인 관리

id 와 pw 가 request 객체에 담아 보내면 DB에서 확인한후 , response 로 결과를 내보낸다.

id를 세션 객체에 보관해 두고 , 세션을 지울때까지는 서버내에서 사용가능하다.

request 객체는 요청이 완료됨과 동시에 사라지기 때문에 정보를 저장할 방법이 없기 때문.

로그아웃은 세션을 지워버리는 것으로 관리.

//보관 가능한 객체 Scope
// session 생성 : 클라이언트가 접속하면 server가 자동생성
HttpSession session = request.getSession();
session.setAttribute("sessionID", id); // key-value 형식으로 저장
session.setAttribute("sessionName", name);
session.setAttribute("sessionAge", age);
HTTP

무상태 프로토콜이며 각각의 요청을 독립적으로 처리한다.

상태를 기억하지 않는 대신 요청을 빠르게 처리할 수 있는 장점이 있음.

 

Cookie

 쿠키는 웹브라우저에 저장되는 작은 데이터 조각을 의미한다.

사용자를 식별하거나 특정 정보를 보관할 때 사용된다.

서버가 클라리언트에 데이터 저장 지시 → 클라이언트가 데이터를 쿠키로 브라우저에 저장

→ 동일 사이트를 방문할때 서버에 자동 전송 → 사용자의 상태를 파악

// 쿠키 생성 및 설정
Cookie cookie = new Cookie("userID", "banana123"); // key-value 형식으로 저장
cookie.setMaxAge(60 * 60 * 24); // 1일 동안 유효
response.addCookie(cookie); // 클라이언트에게 쿠키 전달

userID라는이름의 쿠키에 banana123이라는 값을 저장하고 1일 동안 유효하게 설정하는 코드.

이후 사용자가 동일한 부라우저로 사이트에 접속하면 쿠키를 통해 사용자를 식별할 수 있음   

Session 과 Cookie 의 차이점

Session : 서버에 저장됨 → 클라이언트가 사이트에 접속할떄마다 서버가 세션을 생성하고 관리.

세션은 사용자의 정보의 보안성을 강화하는데 유리하다.

Cookie : 클라이언트의 브라우저에 저장됨  → 브라우저가 종료되거나 설정된 만료 시간에 따라 사라짐. 서버의 메모리를 사용하지 않아 많은 사용자를 처리하는데 유리하다.

 


setAttribute / getAttribute

 

RequestScope 의 setAttribute
//보관 가능한 객체 Scope
request.setAttribute("requestID", id);
request.setAttribute("requestName", name);
request.setAttribute("requestAge", age);
SessionScope 의 setAttribute
HttpSession session = request.getSession();
session.setAttribute("sessionID", id); 
session.setAttribute("sessionName", name);
session.setAttribute("sessionAge", age);

RequestScope 의 getAttribute
		//set했던 파일 내용
		//request.setAttribute("requestID", id);
		//request.setAttribute("requestName", name);
		//request.setAttribute("requestAge", age);
		//====
//변수를 활용하여 꺼내기. 
String idR = (String)request.getAttribute("requestID");
String nameR = (String)request.getAttribute("requestName");
String ageR = (String)request.getAttribute("requestAge");
SessionScope 의 getAttribute
		//set했던 파일 내용
		//HttpSession session = request.getSession();
		//session.setAttribute("sessionID", id);
		//session.setAttribute("sessionName", name);
		//session.setAttribute("sessionAge", age);
		//====
HttpSession session = request.getSession();

//변수를 활용하여 꺼내기
String idS = (String)session.getAttribute("sessionID");
String nameS = (String)session.getAttribute("sessionName");
String ageS = (String)session.getAttribute("sessionAge");

 

요청 객체는 요청이 끝난 이후 소멸되었기 때문에 Redirect 방식으로 꺼낼 수 없음.

Parameter 값 은 Redirect 방식으로 한다면 Parameter 값이 존재하지 않기 때문에 가져올 수 없음.

 


Session 관리 메서드

서버는 클라이언트가 접속할때 자동으로 세션객체를 생성하고 ,

세션 객체를 통해 클라이언트의 상태와 접속 정보를 관리한다.

이를 통해 로그인 상태 유지, 사용자 데잍 보관등의 작업을 할 수있다.

 

세션 처음 생성된 시간 반환
session.getCreationTime()

 

세션 마지막으로 접근한 시간 반환
session.getLastAccessedTime()

 

세션 자동 만료 (초단위)
setMaxInactiveInterval(초 단위)
session.setMaxInactiveInterval(10);
세션 무효화
invalidate()

 

 

활용 코드 예제
HttpSession session = request.getSession(); // 세션 인스턴스 생성
Date now = new Date(); // 현재 시간 생성
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 날짜 형식 지정

// 세션 정보 출력
out.printf("<ul><li><h3> => Session_ID = %s </h3></li>", session.getId());
out.printf("<li><h3> => Now_현재시간 = %s  </h3></li>", formatter.format(now));
now.setTime(session.getCreationTime());
out.printf("<li><h3> => Session_CreationTime = %s</h3></li>", formatter.format(now));
now.setTime(session.getLastAccessedTime());
out.printf("<li><h3> => Session_LastAccessedTime = %s  </h3></li></ul>", formatter.format(now));

// 세션 만료 시간 설정
session.setMaxInactiveInterval(10); // 10초 동안 접근 없을 시 세션 만료

현재 시간과 lastAccessedtime 은 같을 수 밖에 없고 ,

세션은 쿠키에 session id 가 확인됨.

 

 

web.xml 을 통한 세션 만료시간 지정

setMaxInactiveInterval() 설정이 아닌 web.xml으로의 설정을 통한 세션만료설정

   <session-config>
   	<session-timeout>0</session-timeout> <!-- 무제한시간 -->
   	<!-- <session-timeout>10</session-timeout> 10분 지정 -->
   </session-config>