서버가 로그인 상태를 저장하고, 브라우저는 세션 id(session identifier)만 쿠키로 들고 다니는 방식. 서버에서 세션을 지우면 즉시 로그아웃되고, 세션 쿠키에 HttpOnly를 붙이면 스크립트로 읽을 수 없다.
- 서버가 상태를 가지므로 서버를 여러 대로 늘리면 세션 저장소(예: Redis)를 공유해야 한다
- 쿠키는 요청마다 자동으로 실리므로 CSRF 방어가 필요하다
- 다른 출처의 프런트에서 쓰면 CORS(Cross-Origin Resource Sharing)의 credentials 설정과 쿠키
SameSite를 함께 맞춘다 - JWT와 비교하면 취소·보안은 세션이, 서버 확장·서비스 간 전달은 JWT가 편하다
sequenceDiagram participant B as 브라우저 participant S as 서버 participant R as 세션 저장소 B->>S: 로그인 S->>R: 로그인 상태 저장 S-->>B: 세션 id를 쿠키로 내려줌 B->>S: 이후 요청마다 세션 id 쿠키 S->>R: 세션 id로 조회 R-->>S: 로그인 상태 S-->>B: 응답
Django에서는
Django도 같은 방식이다. SessionMiddleware가 쿠키의 세션 키로 세션을 불러오고, 로그인 뷰의 login()이 인증된 사용자 ID를 세션에 저장한다. 기본 저장소는 DB의 django_session 테이블이고 캐시(Redis)로 바꿀 수 있다. SESSION_COOKIE_AGE로 만료를 정하고, SESSION_SAVE_EVERY_REQUEST를 켜거나 일정 주기로 세션을 갱신하는 미들웨어를 두면 활동 중인 사용자의 만료가 뒤로 밀린다. 흐름은 Django 미들웨어와 로그인 흐름, CSRF 방어는 Django의 CSRF 방어를 본다.
출처: OWASP Session Management Cheat Sheet · Django 문서: Configuring the session engine · When sessions are saved