세션은 어디에 저장될까?

이지니·2025년 10월 29일

TIL

목록 보기
3/11

맨날 CS 공부라며 달달 외우기만 했지 한 번도 세션, 톰캣, JVM의 관계를 생각해본 적이 없었던 듯..
오늘 드디어 이들 관계를 이해하게 되었으니 까먹기 전에 정리해두도록 하겠습니다ㅜ

✅ Tomcat, Spring Boot, Servlet 기반으로 공부하였습니다.

1. 8080, 8081 서버에서 세션이 공유되지 않는 이유

  • 8080에서 세션 생성
    • 서버가 JSESSION=<랜덤값> 쿠키를 생성합니다.
    • 브라우저는 이 쿠키를 저장하고, 같은 도메인으로 가는 요청마다 쿠키를 같이 전송합니다.
    • ⭐ 포인트 : 쿠키는 포트를 구분하지 않음!!
      localhost:8080에서 받은 쿠키는 같은 도메인이라면 localhost:8081로 보낼 때도 같이 전송됩니다.
  • 8081로 요청
    • 브라우저가 JSESSION=<랜덤값> 쿠키를 8081에도 전송합니다.
    • 8081은 해당 세션을 생성한 적이 없으므로 값을 찾을 수 없습니다.

👉 쿠키는 공유되지만, 세션 저장소는 서버별로 분리되어있기 때문에 세션을 찾지 못하게 됩니다.

그래서 지금까지 로드밸런서로 요청을 나눠서 보내고, 세션 클러스터링을 통해 세션을 공유해주고 있었던 것!

2. 세션은 어디에서 생성될까?

세션은 톰캣 서블릿 컨테이너 내부에서 생성됩니다.

  1. 세션이 필요한 상황 감지
  • 사용자가 보낸 요청에서 톰캣이 HTTP 헤더의 cookie: JSESSIONID를 검사합니다.
  • 없다면 > 새로운 세션 생성합니다.
  • 있다면 > 기존 세션 조회를 시도합니다. (저장소에서 해당 세션 ID가 존재하는지 확인)
  1. StandardSession 객체 생성
  • 톰캣 내부 세션 관리자(Manager)가 동작하여 새로운 세션 객체 생성합니다.
  1. 세션 저장소에 등록
  • Manager는 생성된 세션을 세션 저장소(Session Map)에 등록합니다.
  • 기본적으로 톰캣 프로세스 내의 RAM에 저장됩니다.

👉 따라서 서버를 여러 대 띄우면 각각 별도의 JVM에 이 맵이 따로 존재하게 됩니다.

3. Tomcat이란?

Tomcat은 자바로 만든 웹 애플리케이션 서버(Web Application Server, WAS)로 자바 웹 프로그램(Servlet, JSP 등)을 실행시켜주는 서버입니다.

  • 계층 구조 : Server → Service → Connector/Engine → Host → Context → Wrapper → Servlet
  • 요청 처리 순서 : Connector → Engine → Host → Context → Wrapper → Servlet
  • 톰캣이 주로 하는 일
    • 요청 수신 : 사용자가 브라우저에서 보낸 HTTP 요청을 네트워크 레벨에서 수신합니다.
    • 서블릿 매핑 : URL을 보고 해당 요청을 어떤 서블릿 클래스가 처리할 지 결정합니다.
    • 세션/쿠키 관리 : JSESSIONID쿠키를 읽거나 새로 만들어서 HttpSession 객체를 관리합니다.
    • 서블릿 실행 : 서블릿의 controller() 메서드를 호출해서 실제 비즈니스 로직을 수행합니다.
    • 응답 생성 : 컨트롤러가 만든 응답 결과를 HTTP Response 형태로 반환합니다.
    • 세션/커넥션 정리 : 세션 만료 시간 체크, keep-alive 연결 관리, 로그 기록 등 마무리 작업을 진행합니다.

그렇다면 servlet 내부에 메모리가 있고, 그 메모리에 세션이 저장되는건가?

4. 톰캣과 메모리의 관계

톰캣은 자바로 만들어진 하나의 프로그램(Process)입니다.
운영체제(OS) 입장에서는 "tomcat.exe"라는 프로세스 하나가 실행 중인 상태일 뿐입니다.

👉 톰캣은 OS의 CPU, 메모리 자원을 사용합니다.

5. JVM 프로세스의 메모리 구조 이해하기

구분설명
Heap 영역객체가 저장되는 곳 (세션, 서블릿 인스턴스, Bean 등)
Stack 영역스레드별로 메서드 호출 정보와 지역변수 저장
Metaspace(옛 PermGen)클래스 메타정보 저장
GC(가비지 컬렉션)더 이상 참조되지 않는 객체를 정리하는 시스템

👉 (session.setAttribute("user", userObj)) 로 저장한 값은 전부 Heap 메모리에 올라가는 객체입니다.
👉 세션 = 톰캣 JVM 메모리 내부의 Map 객체!!

JVM 안에 톰캣이 존재하는건가?

6. JVM과 톰캣의 관계

  • JVM(Java Virtual Machine)

    • 자바 코드를 실행시켜주는 가상 컴퓨터입니다.
    • 운영체제(OS)가 직접 자바 코드를 이해하지 못하므로, JVM이 중간 번역기 역할을 합니다.
    • .class 로 컴파일된 파일을 JVM이 해석하여 실행합니다.
  • 정리 비교

구성요소역할비유
OS (운영체제)물리적인 기계 제어
JVM (Java Virtual Machine)자바 코드 실행 환경건물 (자바가 사는 집)
Tomcat그 집 안에서 동작하는 “서버 프로그램”식당 (손님 요청 받고 요리해서 줌)
Servlet / Spring톰캣 안에서 돌아가는 비즈니스 로직요리사

👉 Tomcat = JVM 위에서 실행되는 하나의 JAVA 프로그램!

결국 톰캣도 JVM 위에서 CPU, 메모리를 할당받아 실행되는 프로세스였고,
JVM에서 톰캣에 할당해준 메모리 영역에 세션 객체를 저장한다는 것을 알게되었습니다!!!


추가 사항 : JDK, JAR 파일에 대한 이해

7. JAR 파일이란?

  • 흔히 실행하는 명령어
java -jar myproject.jar

이 명령어는 "myproject.jar 안에 들어있는 자바 클래스들을 JVM이 읽어서 실행해줘" 라는 뜻입니다.

  • JVM의 실행 과정
  1. .java → javac 로 컴파일 → .class 바이트코드 생성
  2. JVM이 이 바이트코드를 읽고 OS가 이해할 수 있는 기계어로 변환
  3. 실행 결과를 출력

👉 JAR 파일은 .zip 파일처럼 여러 개의 .class 파일을 묶어놓은 압축파일을 말합니다.

8. JDK와 JVM의 관계

  • JDK 구성
    • 개발 도구 : javac, java, 기타 도구
    • JRE : 자바 실행 환경
      • JVM : 실행 엔진
      • Java Class Libraries (API)

👉 핵심 관계 :

  • JDK = 개발 도구 + JRE
  • JRE = JVM + 표준 라이브러리
profile
화이팅

1개의 댓글

comment-user-thumbnail
2025년 10월 30일

세션이 톰캣 안에서 만들어지는건지 처음 알았어요 감사합니다

답글 달기