본문 바로가기
Tech Stack/Backend

🛡️자바 서블릿 기반의 HttpSession (세션)

by 박수무당벌레 2026. 6. 29.

1. 세션(Session)이란?

  • 웹 사이트에서 사용자가 로그인하거나 페이지를 이동할 때, 사용자의 상태 정보를 서버에 안전하게 유지하기 위해 사용하는 기술. = 자바 서블릿 스펙에서 제공하는 대표적인 서버 사이드 세션 관리 기술
  • 스프링 프레임워크나 일반 자바 웹 애플리케이션에서 로그인 상태를 유지할 때 가장 기본적으로 사용된다.
  • 특징: 웹을 이루는 HTTP 프로토콜은 상태를 유지하지 않는 Stateless(무상태) 특성을 가짐.
    • 즉, 서버는 페이지를 요청할 때마다 요청한 사람이 누구인지 기억하지 못함
    • 만약 세션이 없다면, 사용자는 새로운 페이지를 클릭할 때마다 매번 다시 로그인을 해야 함
  • 이를 해결하기 위해 세션은 다음과 같은 메커니즘으로 동작한다.

2. 세션의 핵심 동작 원리

세션은 비밀번호나 유저 정보 같은 중요한 데이터를 서버에 저장하고, 클라이언트(브라우저)에는 이를 찾을 수 있는 열쇠인 세션 ID(Session ID)만 발급.

  1. 로그인 요청: 사용자가 아이디와 비밀번호를 입력해 서버로 보낸다.
  2. 세션 생성: 서버는 인증이 성공하면 서버의 메모리(또는 DB)에 세션 객체를 생성하고, 고유한 세션 ID(예: JSESSIONID)를 발급한다.
  3. 쿠키로 응답: 서버는 이 세션 ID를 쿠키에 담아 브라우저로 보냄.
  4. 세션 ID 전달: 이후 브라우저는 모든 요청마다 이 세션 ID 쿠키를 자동으로 헤더에 실어 보낸다.
  5. 사용자 식별: 서버는 들어온 세션 ID를 보고 로그인한 사용자를 식별하고 마이페이지 등을 보여줌.
더보기
더보기

💡 쿠키(Cookie)와의 비교

 

세션을 이해할 때 가장 많이 비교되는 것이 쿠키. 사실 세션도 결국 세션 ID를 전달하기 위해 쿠키를 사용하지만, 가장 큰 차이는 실제 데이터가 저장되는 위치가 크다.

  쿠키 (Cookie) 세션 (Session)
저장 위치 클라이언트 (사용자 브라우저) 웹 서버 (Memory, DB, Redis 등)
보안성 낮음 (로컬에 저장되므로 변조(조작)/탈취(분실) 위험) 높음 (실제 정보는 서버에 있고 ID만 공유)
속도 비교적 빠름 서버에서 조회하는 과정이 필요해 상대적으로 느림
만료 시점 쿠키 생성 시 만료일 지정 가능 (브라우저 꺼져도 유지 가능) 브라우저가 종료되거나, 지정한 세션 타임아웃 시간에 만료

3. HttpSession의 동작 원리 (자바/스프링 기준)

앞서 설명한 세션의 기본 동작 메커니즘을 자바 웹 생태계에서 구체적으로 구현된 것이 바로 HttpSession 인터페이스이다. (진짜 고향은 Jakarta EE 표준의 서블릿 API → Spring Boot Starter에 당연히 포함되어 있음)

  1. 세션 생성 (request.getSession())
    • 사용자가 로그인에 성공하면, 서버(톰캣 등)는 request.getSession()을 호출하여 새로운 HttpSession 객체를 생성한다.
    • 이때 서버는 메모리 공간에 이 세션 객체를 저장하고, 고유한 랜덤 문자열인 JSESSIONID를 생성.
  2. 쿠키 발급
    • 서버는 HTTP 응답 헤더에 Set-Cookie: JSESSIONID=XYZ123...과 같은 형태로 세션 ID를 클라이언트(브라우저)에게 보냄.
  3. 이후 요청 처리
    • 브라우저는 이후 모든 HTTP 요청마다 Cookie: JSESSIONID=XYZ123... 헤더를 자동으로 포함하여 보냄.
    • 톰캣(서블릿 컨테이너)은 이 JSESSIONID를 보고 서버 메모리에서 일치하는 HttpSession 객체를 찾아내어 로그인 상태나 사용자 정보를 유지한다.

4. HttpSession 주요 메서드와 사용법

컨트롤러나 서블릿에서 다음과 같은 방식으로 HttpSession을 다룸.

// 1. 세션 가져오기 (없으면 새로 생성)
HttpSession session = request.getSession();

// 2. 세션에 데이터 저장하기 (로그인 성공 시 유저 정보 보관)
session.setAttribute("loginUser", memberDto);

// 3. 세션에서 데이터 읽기 (로그인 여부 확인 시)
MemberDto user = (MemberDto) session.getAttribute("loginUser");

// 4. 세션 데이터 삭제 (로그아웃 시)
session.removeAttribute("loginUser");

// 5. 세션 완전히 무효화 (주로 로그아웃 시 전체 초기화)
session.invalidate();

5. HttpSession의 특징과 내부 메커니즘

  • 톰캣(서블릿 컨테이너)이 관리: HttpSession 객체의 생성, 소멸, 만료 시간 관리는 모두 웹 애플리케이션 서버(WAS)가 담당.
  • 기본 저장소는 서버 메모리: 별도의 설정을 하지 않으면 세션 데이터는 서버의 RAM(메모리)에 저장됨. 그렇기 때문에 동시 접속자가 많아지면 서버 메모리가 부족해질 수 있음.
  • 타임아웃(Timeout) 설정 가능: 사용자가 아무런 요청을 보내지 않고 일정 시간(예: 30분)이 지나면 서버는 메모리 절약을 위해 해당 세션을 자동으로 소멸시킴. (session.setMaxInactiveInterval(1800);)

6. HttpSession(세션)의 장단점

  • 장점
    • 보안성이 우수: 실제 회원 정보나 권한 상태가 클라이언트에 노출되지 않고 서버 내에서 관리되므로 안심.
    • 데이터 제어가 쉬움: 서버에서 세션을 만료시키면(예: 강제 로그아웃) 즉시 클라이언트의 접근을 차단할 수 있음.
    • 서버가 한 대라면 완벽하다.
  • 단점 및 한계
    • 서버 부하: 접속자가 많아질수록 서버 메모리에 쌓이는 세션 데이터가 커져 서버에 부담.
    • 스케일 아웃(서버 확장)의 어려움: 트래픽가 늘어나 톰캣 서버를 여러 대(A, B, C)로 늘렸다고 상황 가정.
      1. 사용자가 서버 A에서 로그인하여 HttpSession(세션)이 서버 A의 메모리에 생성됨
      2. 다음 페이지를 클릭하면 로드 밸런서가 이 접속 요청을 서버 B로 보냄.
      3. 서버 B의 메모리에는 해당 사용자의 세션 정보가 없기 때문에, 사용자는 로그인 상태인데도 다시 로그인하라는 메시지를 받게 됨. 
        • 이를 해결하기 위해 세션 클러스터링을 하거나 *Redis 같은 별도의 세션 스토리지를 사용해야 한다.
        • 또는 서버에 상태를 저장하지 않고 토큰 자체에 정보를 담아 암호화하는 JWT(JSON Web Token) 기반의 인증 방식도 많이 사용되고 있음.
 Redis 설명 추가
서버 메모리 대신 외부 저장소인 Redis 같은 인메모리 데이터베이스에 세션을 따로 모아서 관리하는 방식.
이를 스프링 세션(Spring Session) 기술이라고 하며, 여러 서버가 하나의 Redis를 바라보기 때문에 서버가 늘어나도 로그인 상태가 유지된다.