한 줄 요약: 세션 관리(Session Management)란, AI 에이전트와 사용자 간의 대화에서 컨텍스트, 상태, 사용자 정보를 생성부터 종료까지 일관되게 추적하고 유지하는 기술이다.


1. 세션 관리란 무엇인가?

카페에서 단골 바리스타가 “오늘도 아이스 아메리카노 한 잔이요?”라고 먼저 물어보는 경험을 상상해 보세요. 이 바리스타는 당신의 주문 패턴을 기억합니다. AI 에이전트에서 이 “기억”을 가능하게 하는 것이 세션 관리입니다.

LLM 자체는 무상태(Stateless)입니다. 각 API 호출은 독립적이며 이전 대화를 모릅니다. 세션 관리는 이 무상태 API 위에 상태(State)를 부여해 멀티턴 대화와 개인화를 가능하게 합니다.

2. 핵심 개념 이해하기

세션 생명주기

사용자 접속
    ↓
세션 생성 (session_id 발급)
    ↓
[메시지 교환 반복]
  사용자 메시지 → 저장 → LLM 처리 → 응답 저장
    ↓
세션 종료 또는 타임아웃
    ↓
세션 데이터 아카이브/삭제

세션 저장 전략

전략 특성 적합한 상황
인메모리 빠름, 서버 재시작 시 소멸 개발 환경, 단일 서버
Redis 빠름, 분산 가능, TTL 지원 프로덕션 멀티서버
DB (PostgreSQL) 영구 저장, 분석 가능 장기 히스토리 필요 시
클라이언트 사이드 서버 부하 없음, 보안 위험 민감하지 않은 UI 상태

세션 상태 구성 요소

{
  "session_id": "sess_abc123",
  "user_id": "user_456",
  "created_at": "2026-06-16T09:00:00Z",
  "last_activity": "2026-06-16T09:15:00Z",
  "messages": [...],
  "context": {
    "language": "ko",
    "user_preferences": {},
    "current_task": "glossary_generation"
  },
  "token_count": 2048
}

3. 실무 적용 예시

Redis 기반 세션 관리 구현입니다.

import json
import uuid
from datetime import datetime
import redis
from anthropic import Anthropic

anthropic_client = Anthropic()
redis_client = redis.Redis(host='localhost', port=6379, decode_responses=True)

SESSION_TTL = 3600  # 1시간

class SessionManager:
    def create_session(self, user_id: str) -> str:
        """새 세션을 생성하고 session_id를 반환합니다."""
        session_id = f"sess_{uuid.uuid4().hex[:8]}"
        session_data = {
            "session_id": session_id,
            "user_id": user_id,
            "created_at": datetime.now().isoformat(),
            "messages": []
        }
        redis_client.setex(
            f"session:{session_id}",
            SESSION_TTL,
            json.dumps(session_data, ensure_ascii=False)
        )
        return session_id

    def get_session(self, session_id: str) -> dict | None:
        """세션 데이터를 조회합니다."""
        data = redis_client.get(f"session:{session_id}")
        if not data:
            return None
        # TTL 갱신 (활성 세션 유지)
        redis_client.expire(f"session:{session_id}", SESSION_TTL)
        return json.loads(data)

    def add_message(self, session_id: str, role: str, content: str):
        """세션에 메시지를 추가합니다."""
        session = self.get_session(session_id)
        if not session:
            raise ValueError(f"세션 없음: {session_id}")
        session["messages"].append({"role": role, "content": content})
        redis_client.setex(
            f"session:{session_id}",
            SESSION_TTL,
            json.dumps(session, ensure_ascii=False)
        )

    def chat(self, session_id: str, user_message: str) -> str:
        """세션 컨텍스트를 유지하며 대화합니다."""
        session = self.get_session(session_id)
        if not session:
            raise ValueError("유효하지 않은 세션")

        self.add_message(session_id, "user", user_message)

        response = anthropic_client.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=1024,
            messages=session["messages"][-20:]  # 최근 20개 메시지
        )

        assistant_reply = response.content[0].text
        self.add_message(session_id, "assistant", assistant_reply)
        return assistant_reply

# 사용 예시
manager = SessionManager()
session_id = manager.create_session("user_001")

reply1 = manager.chat(session_id, "내 이름은 김민준이야")
reply2 = manager.chat(session_id, "내 이름이 뭔지 기억해?")  # "김민준" 기억

4. 세션 관리 vs 유사 개념 비교

구분 세션 관리 계층적 메모리 쿠키/토큰
목적 대화 상태 유지 장기 지식 관리 인증/인가
범위 단일 대화 흐름 여러 세션 통합 사용자 식별
지속성 세션 기간 영구적 만료일까지
저장 위치 서버 (Redis/DB) 외부 저장소 클라이언트 또는 서버
AI 특화 ✅ 대화 히스토리 ✅ 지식 베이스

5. 마치며

세션 관리는 단순한 챗봇을 연속적인 맥락을 가진 AI 어시스턴트로 만드는 핵심 인프라입니다. Redis를 활용한 세션 저장은 빠른 성능과 TTL 기반 자동 만료를 제공해 프로덕션 환경에 적합합니다. 더 나아가 계층적 메모리를 결합하면 세션을 초월한 장기 기억 시스템을 구축할 수 있습니다.

참고 자료

함께 읽으면 좋은 용어

이 개념과 함께 알아두면 이해가 깊어지는 관련 용어들입니다.

댓글 남기기