Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- CS
- NoSQL
- docker
- SQL
- viewsets
- 오블완
- Python
- JWT
- 연습
- 파이썬
- 장고
- 개발공부
- 자료구조
- redis
- 아티클 스터디
- 티스토리챌린지
- Doker
- git
- 세션(Session)
- nginx
- Wil
- ERD
- flask
- web
- 쿠키(cookie)
- 도커
- django
- 코딩테스트
- Til
- github
Archives
- Today
- Total
SteadyDrills
장고의 세션 저장 원리 본문
241219
장고의 세션
Django에서 세션(Session) 저장 원리는 클라이언트-서버 간 상태를 유지하기 위해 세션 데이터를 관리하는 방식이다.
기본적으로 세션 데이터를 저장하는 여러 백엔드 방식(데이터베이스, 캐시, 파일, 쿠키 등)을 지원하며, 기본값으로는
데이터 베이스 저장 방식으로 저장된다.

장고의 세션 프로세스 상세
1. 클라이언트의 요청
- 클라이언트가 Django 애플리케이션에 요청.
- Django는 요청 객체(HttpRequest)를 생성하여 요청 데이터를 처리.
2. 세션 식별자 확인 (세션 키)
- Django는 클라이언트가 보낸 요청의 쿠키에서 세션 식별자인 sessionid를 확인.
- 쿠키 이름: 기본적으로 sessionid (setting.py에서 변경 가능).
- 쿠키 이름: 기본적으로 sessionid (setting.py에서 변경 가능).
3. 세션 데이터 로드
- Django는 세션 백엔드에서 sessionid에 해당하는 세션 데이터를 검색.
- 세션 데이터는 암호화되어 저장.
- 기본 세션 백엔드는 데이터베이스이며, django_session 테이블에서 데이터를 검색.
세션 백엔드 종류
- Database-backed session: 기본값 Django는 django.contrib.sessions.backends.db를 사용해 세션 데이터를 DB 테이블(django_session)에 저장.
- Cached-backed session: 세션 데이터를 캐시 시스템(예: Redis, Memcached)에 저장.
- File-backed session: 세션 데이터를 파일로 저장.
- Signed cookies: 세션 데이터를 암호화된 쿠키로 클라이언트 측에 저장.
세션 엔진 | 경로 | 저장 위치 | 특징 |
Database-backed | django.contrib.sessions.backends.db | 데이터베이스 | 기본값. 설정이 간단하며 안정적이지만, 성능이 상대적으로 느림. |
Cached Sessions | django.contrib.sessions.backends.cache | 캐시 시스템 | 빠른 성능 제공. 데이터 유실 가능성 있음. |
Cached Database Sessions | django.contrib.sessions.backends.cached_db | 캐시 + 데이터베이스 | 성능과 안정성을 모두 제공. |
File-based Sessions |
django.contrib.sessions.backends.file | 파일 시스템 | 간단한 환경에 적합. 성능 문제 발생 가능. |
Cookie-based Sessions |
django.contrib.sessions.backends.signed_cookies | 클라이언트 쿠키 | 서버 저장소 불필요. 민감 데이터는 저장하지 않는 것이 좋음. |
Custom Backend | 사용자 정의 경로 | 사용자 정의 | 프로젝트 요구 사항에 따라 구현 가능.( BaseSessionStore를 상속받아 필요한 메서드를 오버라이드하여 구현. ) |
예시
# Database-backed (기본값)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# Cached Sessions
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# Cached Database Sessions
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
# File-based Sessions
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# Cookie-based Sessions
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
# Custom Backend
SESSION_ENGINE = 'myproject.sessions.backends.custom_backend'
4. 세션 데이터 접근 및 수정
- Django의 request.session 객체를 통해 세션 데이터를 읽거나 수정가능.
# 세션 데이터 저장 request.session['session_id'] = 'testsessions'
# 세션 데이터 읽기 testsessions = request.session.get('session_id, 'None')
request.session은 dict와 유사하게 작동하지만, 추가적인 기능을 제공.
예: 만료 시간 설정, 변경 추적.
5. 응답 시 세션 저장
- 뷰 함수가 처리된 후, Django는 세션 데이터의 변경 여부를 확 .
- 변경된 경우, 세션 데이터를 세션 백엔드에 저장.
- 변경되지 않은 경우, 저장 동작을 건너뛴다.
저장 과정:
- 새 세션 생성:
- 세션 키(sessionid)가 없는 경우, 새로운 세션 키를 생성.
- 새로 생성된 세션 키는 랜덤하고 고유하며 암호화됨.
- 세션 데이터 암호화:
- Django는 세션 데이터를 서명 및 암호화하여 저장.
- 이를 통해 데이터가 변조되지 않도록 보장.
- 백엔드에 저장:
- 세션 백엔드에 암호화된 데이터를 저장.
- 클라이언트에 쿠키 전송:
- 응답 객체에 세션 키(sessionid)를 포함한 쿠키를 설정하고 클라이언트로 전송.
- 쿠키는 HTTP 응답의 Set-Cookie 헤더에 포함.
6. 세션 만료 및 정리
- Django는 세션의 유효 기간을 설정하여 세션 데이터를 관리.
- 기본값: 2주 (SESSION_COOKIE_AGE = 1209600초).
- 세션 만료 시, 클라이언트의 쿠키와 백엔드의 세션 데이터가 삭제.
- Django는 세션 정리 작업을 수행:
- 오래된 세션 데이터를 정리하는 clearsessions 관리 명령 제공.
- 세션 데이터가 자동으로 정리되지는 않으므로 주기적으로 실행해야 함.
python manage.py clearsessions
추가 참고: 세션 설정 관련 주요 옵션
- SESSION_ENGINE: 세션 백엔드 설정 (예: 'django.contrib.sessions.backends.db').
- SESSION_COOKIE_NAME: 쿠키 이름 (기본값: sessionid).
- SESSION_COOKIE_AGE: 세션 쿠키 유효 기간 (초 단위).
- SESSION_EXPIRE_AT_BROWSER_CLOSE: 브라우저 닫을 때 세션 만료 여부.
- SESSION_SAVE_EVERY_REQUEST: 요청마다 세션 저장 여부.
참조:https://docs.djangoproject.com/en/5.1/topics/http/sessions/#configuring-the-session-engine
How to use sessions | Django documentation
The web framework for perfectionists with deadlines.
docs.djangoproject.com
'웹개발' 카테고리의 다른 글
웹의 세션, 쿠키, 캐시 (0) | 2025.01.04 |
---|---|
레디스 명령어 모음 (0) | 2024.12.23 |
도커 파일 구성 (0) | 2024.12.16 |
Docker 기초 명령어 정리 (0) | 2024.12.13 |
WSL(Windows Subsystem for Linux)란? (0) | 2024.12.10 |