| [Glossary] 세션 관리 완벽 정리 | Session Management를 쉽게 이해하는 법 |
한 줄 요약: 세션 관리(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 기반 자동 만료를 제공해 프로덕션 환경에 적합합니다. 더 나아가 계층적 메모리를 결합하면 세션을 초월한 장기 기억 시스템을 구축할 수 있습니다.
참고 자료
- Anthropic Claude API 다중 턴 대화 — 멀티턴 대화 구현 공식 가이드
- Redis 세션 스토어 가이드 — Python Redis 클라이언트 활용법
함께 읽으면 좋은 용어
이 개념과 함께 알아두면 이해가 깊어지는 관련 용어들입니다.
댓글 남기기