세션
서버가 클라이언트의 상태를 일정 시간 동안 유지하기 위해 저장하는 정보입니다. 로그인 상태 유지 같은 기능에 사용됩니다.
왜 필요한가?
- HTTP는 무상태(Stateless) → 요청마다 누군지 모름
- 로그인 후에도 "이 사람 누구지?" 상태가 됨
- 세션으로 사용자 상태를 서버에 저장해서 해결
동작 방식
1. 로그인 요청
클라이언트 ──── ID/PW ────▶ 서버
2. 세션 생성
서버: 세션 ID 발급 + 세션 저장소에 사용자 정보 저장
3. 세션 ID 전달
클라이언트 ◀── Set-Cookie: sessionId=abc123 ── 서버
4. 이후 요청
클라이언트 ──── Cookie: sessionId=abc123 ────▶ 서버
서버: 세션 저장소에서 abc123 조회 → "아, 홍길동이구나"
세션 저장 위치
| 위치 | 특징 |
| 서버 메모리 | 빠름, 서버 재시작 시 소멸 |
| 파일 | 간단, 성능 낮음 |
| DB | 영구 저장, 느림 |
| Redis | 빠름 + 영구 저장, 많이 사용 |
세션 vs 쿠키
| 항목 | 세션 | 쿠키 |
| 저장 위치 | 서버 | 클라이언트(브라우저) |
| 보안 | 상대적으로 안전 | 노출 위험 |
| 용량 | 제한 없음 | 약 4KB |
| 만료 | 서버에서 관리 | 브라우저에서 관리 |
세션 vs JWT
| 항목 | 세션 | JWT |
| 상태 | Stateful (서버 저장) | Stateless (토큰에 정보 담김) |
| 확장성 | 서버 늘면 세션 공유 필요 | 서버 확장 쉬움 |
| 무효화 | 서버에서 즉시 삭제 가능 | 만료 전까지 유효 |
세션의 단점
- 서버에 저장 → 사용자 많으면 메모리 부담
- 다중 서버 환경에서 세션 공유 문제 (Sticky Session, Redis로 해결)