세션(Session)은 서버 측에서 사용자 상태를 관리하는 방식입니다. 쿠키와 달리 실제 데이터는 서버에 저장하고, 클라이언트에는 식별자만 전달합니다.
1. 클라이언트 → 서버: 로그인 요청 (아이디/비밀번호)
2. 서버: 인증 성공 시 세션 생성, 세션 저장소에 저장
3. 서버 → 클라이언트: 세션 ID를 쿠키로 전달
4. 클라이언트 → 서버: 이후 요청마다 세션 ID 쿠키 첨부
5. 서버: 세션 ID로 저장소 조회하여 사용자 정보 확인
| 항목 | 쿠키 | 세션 |
|---|---|---|
| 저장 위치 | 클라이언트(브라우저) | 서버 |
| 보안 | 상대적으로 낮음 | 높음 |
| 용량 제한 | 4KB | 서버 용량에 따름 |
| 속도 | 빠름 | 조회 비용 발생 |
| 만료 | 설정 가능 | 비활성 시 자동 만료 |
서버 프로세스 메모리에 저장합니다. 빠르지만 서버 재시작 시 세션이 모두 소멸합니다.
Redis는 빠른 인메모리 저장소로, 분산 환경에서도 세션을 공유할 수 있습니다. 서버 재시작에도 세션이 유지됩니다. 실무에서 가장 많이 사용하는 방식입니다.
영구 저장이 가능하지만 조회 속도가 느립니다.
로그인 성공 시 기존 세션 ID를 폐기하고 새 세션 ID를 발급해야 합니다. 로그인 전 세션 ID를 공격자가 알고 있어도, 로그인 후 ID가 바뀌므로 공격이 무효화됩니다.
사용자가 일정 시간 동안 활동하지 않으면 세션을 자동으로 만료시킵니다.
생성 시점으로부터 고정된 시간 후 만료합니다. 보안이 중요한 경우 사용합니다.
마지막 요청으로부터 일정 시간 동안 활동이 없으면 만료합니다. 활동 중인 사용자는 계속 유지됩니다.
세션은 서버가 상태를 보관하는 반면, JWT(JSON Web Token)는 클라이언트가 토큰을 보관합니다. JWT는 서버에 저장소가 없어 수평 확장이 용이하지만, 강제 로그아웃 구현이 어렵습니다.