세션은 무상태인 HTTP 위에서 여러 요청에 걸쳐 특정 사용자의 상태(로그인 여부, 장바구니 등)를 이어 붙이는 개념적 단위입니다.
전통적 구현은 서버가 상태를 저장하고, 그 상태를 가리키는 세션 ID를 쿠키로 클라이언트에 주는 '서버 측 세션' 방식입니다.
서버 측 세션에서는 로그인 성공 시 서버가 세션 레코드를 메모리나 저장소(Redis·DB)에 만들고, 무작위 세션 ID를 `Set-Cookie`로 내려보냅니다. 이후 요청의 쿠키에 담긴 ID로 서버가 해당 세션을 찾아 사용자를 식별합니다. 상태의 실체가 서버에 있으므로 로그아웃·강제 만료·권한 변경 같은 무효화(revocation)가 즉시·확실하게 됩니다. 대신 서버가 상태를 들고 있어 수평 확장 시 세션 저장소를 공유하거나(무상태 서버 + 외부 스토어) sticky session이 필요합니다.
대조되는 방식이 토큰 기반(예: JWT)입니다. 상태(사용자 식별 정보)를 서명된 토큰에 담아 클라이언트가 보관하므로 서버가 세션 저장소 없이도 검증만으로 인증할 수 있어 확장에 유리하지만, 서버가 토큰을 즉시 무효화하기 어렵다는 트레이드오프가 있습니다. 실무에서는 짧은 수명 액세스 토큰 + 서버 측 리프레시 토큰을 섞어 두 방식의 장점을 조합하기도 합니다. 세션 보안의 핵심 위협은 세션 ID 탈취(XSS)와 고정(session fixation)이며, HttpOnly·Secure 쿠키·로그인 후 ID 재발급으로 방어합니다.