티스토리 뷰

Java의 세션 생명주기(Session Life Cycle)는 웹 애플리케이션에서 클라이언트와 서버 간의 상태를 유지하기 위한 핵심 메커니즘입니다. HTTP 프로토콜의 비연결성(Stateless)을 극복하기 위해 도입된 세션의 생성부터 소멸까지의 전 과정을 상세히 정리해 드립니다.
1. 세션(Session)의 개념과 필요성
HTTP 프로토콜은 Stateless합니다. 즉, 클라이언트가 보낸 이전 요청의 정보를 서버가 기억하지 못합니다. 로그인 정보, 장바구니 목록 등을 유지하기 위해 서버 측 메모리에 사용자 정보를 저장하는 저장소가 바로 HttpSession입니다.
세션과 쿠키의 관계
세션은 서버에 정보를 저장하지만, 서버가 클라이언트를 식별하기 위해 JSESSIONID라는 고유 ID를 쿠키에 담아 클라이언트에게 전달합니다. 클라이언트는 이후 요청마다 이 쿠키를 함께 보내며, 서버는 이를 통해 메모리상의 특정 세션 객체를 찾아냅니다.
2. 세션의 생명주기 단계 (Step-by-Step)
세션의 생명주기는 크게 생성(Creation) -> 유지(Maintenance) -> 소멸(Destruction)의 3단계로 나뉩니다.
2.1 세션의 생성 (Creation)
클라이언트가 서버에 처음 접속했을 때 바로 세션이 생기는 것은 아닙니다. 일반적으로 서블릿이나 JSP에서 세션 객체를 요청할 때 생성됩니다.
- 메커니즘: request.getSession() 또는 request.getSession(true) 호출 시 발생.
- 작동 원리:
- 서버는 클라이언트가 보낸 쿠키 중 JSESSIONID가 있는지 확인합니다.
- ID가 없거나, 해당 ID와 일치하는 세션이 서버 메모리에 없다면 새로운 HttpSession 객체를 생성합니다.
- 고유한 세션 ID를 발급하여 응답 헤더의 Set-Cookie를 통해 클라이언트에게 전달합니다.
2.2 세션의 유지 및 식별 (Maintenance)
세션이 생성된 후, 클라이언트가 브라우저를 닫기 전까지(또는 만료 전까지) 서버와 통신하며 상태를 유지합니다.
- 상태 저장: session.setAttribute(String name, Object value)를 통해 데이터를 저장합니다.
- 식별: 클라이언트의 브라우저는 모든 요청 헤더에 Cookie: JSESSIONID=XXXX...를 포함합니다. 서버는 이 ID를 Key로 삼아 힙(Heap) 메모리에 저장된 세션 데이터를 조회합니다.
2.3 세션의 소멸 (Destruction)
세션은 다음 세 가지 경우에 소멸합니다.
- 명시적 소멸 (Invalidation): 개발자가 코드에서 직접 session.invalidate()를 호출할 때 즉시 삭제됩니다. (로그아웃 기능)
- 타임아웃 (Timeout): 클라이언트로부터 마지막 요청이 온 후, 설정된 일정 시간 동안 추가 요청이 없으면 서버가 자동으로 삭제합니다.
- 서버 종료: 웹 애플리케이션(Context)이 언로드되거나 WAS(Tomcat 등)가 종료될 때 세션 데이터가 사라집니다. (설정에 따라 파일로 직렬화하여 유지하는 '세션 퍼시스턴스' 기능도 있음)
3. 세션 타임아웃 설정 방법
세션 유지 시간을 설정하는 방법은 크게 세 가지입니다.
3.1 web.xml (전역 설정)
모든 세션에 대해 기본 만료 시간을 분 단위로 설정합니다.
<session-config>
<session-timeout>30</session-timeout> <!-- 30분 -->
</session-config>
3.2 코드에서 개별 설정
특정 사용자나 상황에 따라 동적으로 설정할 수 있습니다. (초 단위)
HttpSession session = request.getSession();
session.setMaxInactiveInterval(1800); // 1800초 = 30분
4. 세션 리스너 (Session Listeners)
세션의 상태 변화를 감지하고 특정 로직을 수행하고 싶을 때 Listener를 사용합니다.
- HttpSessionListener: 세션의 생성과 소멸 시점을 감지합니다. (접속자 수 집계 등에 활용)
- sessionCreated(HttpSessionEvent se)
- sessionDestroyed(HttpSessionEvent se)
- HttpSessionAttributeListener: 세션 내 데이터(Attribute)의 추가, 제거, 변경을 감지합니다.
- attributeAdded, attributeRemoved, attributeReplaced
- HttpSessionBindingListener: 객체가 세션에 바인딩되거나 해제될 때 객체 스스로 감지합니다. (리스너 등록 없이 객체가 해당 인터페이스를 구현함)
5. 세션 관리의 보안 및 성능 고려사항
5.1 세션 고정 공격 (Session Fixation) 방지
공격자가 미리 발급받은 세션 ID를 사용자에게 심어주는 공격입니다. 로그인 시 기존 세션을 무효화하고 새로운 세션을 발급(session.invalidate() 후 다시 생성)하는 것이 안전합니다.
5.2 세션 하이재킹 (Session Hijacking)
타인의 세션 ID 쿠키를 탈취하여 권한을 도용하는 것입니다. 이를 방지하기 위해 HTTPS(SSL/TLS) 적용이 필수적이며, 쿠키 설정 시 HttpOnly와 Secure 플래그를 활성화해야 합니다.
5.3 메모리 관리
세션은 서버의 RAM을 사용합니다. 동시 접속자가 많을 경우 세션 객체가 너무 크면 OutOfMemoryError가 발생할 수 있습니다.
- 해결책: 꼭 필요한 최소한의 데이터만 저장, 불필요한 객체는 즉시 제거, 세션 클러스터링(Redis 등을 활용한 외부 저장소 이용) 고려.
6. 분산 환경에서의 세션 (Session Clustering)
서버가 여러 대인 L4 로드밸런싱 환경에서는 세션 공유 문제가 발생합니다. 1번 서버에서 로그인했는데 2번 서버로 요청이 가면 로그인 정보가 없는 현상입니다.
- Sticky Session: 특정 사용자의 요청은 항상 같은 서버로 보냄 (서버 부하 불균형 발생 가능).
- Session Replication: 모든 서버가 세션 데이터를 복사하여 공유 (성능 저하 및 메모리 낭비).
- Session Server (Redis/Memcached): 별도의 메모리 DB에 세션을 저장하고 모든 서버가 이를 참조 (가장 권장되는 방식).
7. 결론
Java의 세션 생명주기는 단순한 저장소 역할을 넘어, 웹 보안과 성능 최적화의 핵심 요소입니다. 브라우저의 쿠키 메커니즘과 서버의 메모리 관리 방식을 정확히 이해해야 안정적인 웹 서비스를 설계할 수 있습니다.
#JavaSession #HttpSession #SessionLifeCycle #WebDevelopment #Backend #JSP_Servlet #JSESSIONID #SessionTimeout #SessionListener #SessionClustering #WebSecurity #CookieAndSession #SpringSecurity #SessionManagement #IT지식 #백엔드개발 #서버보안
'Java' 카테고리의 다른 글
| JAVA(Spring Boot) 로그인 기능 구현 방법 (0) | 2026.06.01 |
|---|---|
| java substring 함수(문자열 자르기) 사용법 및 예제 코드 (0) | 2026.05.15 |
| JAVA 함수 실행시간 측정 currentTimeMillis(), nanoTime() 사용법 (0) | 2026.05.10 |
| facebook graph api로 게시글 가져오기 (1) | 2019.09.23 |
| 구글, 파파고 번역 API 성능 비교 (1) | 2019.09.18 |
| google translate api v3 사용법 (1) | 2019.09.16 |
| java spring pwa fcm web push 구현 (2) | 2019.09.10 |
| Object 클래스에 대해 (0) | 2018.11.04 |
- Total
- Today
- Yesterday
- c#
- 문자열
- 알고리즘
- 상속
- 아두이노
- 자바
- MySQL
- Android
- C++ 클래스
- 벡터
- String
- C언어
- 배열
- 파이썬
- 리스트
- OpenCV
- Class
- Java
- DB연동
- 문제풀이
- 정보처리기사
- 클래스
- C++
- 블루투스
- C
- 데이터베이스
- 파일처리
- 자료구조
- 안드로이드
- html
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
