쿠키 설정 메커니즘
set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False) 주요 매개변수:
- key: 쿠키 식별자
- value: 저장할 값
- max_age: 초 단위 유효시간 (기본값 None: 브라우저 종료 시 만료)
- expires: 명시적 만료 시간 (기본값 None: 영구 보관)
- path: 쿠키 접근 경로 ('/' 설정 시 전체 경로)
max_age와 expires 상호작용
1. 둘 다 None: 임시 쿠키 (브라우저 메모리 저장)
2. max_age 설정: 지정 시간 후 만료 (로컬 캐시 저장)
3. expires 설정: 명시적 시간 만료 (로컬 캐시 저장)
4. 동시 설정 시 max_age 우선 적용
5. 현재 시간 초과 시 쿠키 무시
시간 형식 예시
expires = 'Thu, 28-May-2020 08:53:06 GMT' # GMT 기준
expires = datetime.datetime(2023, 12, 31, 23, 59)
expires = 86400 # 24시간(초 단위)
암호화 쿠키 예제
response = HttpResponse()
response.set_signed_cookie("auth_token", "encrypted_value", salt='secret_key')
return response
# 복호화
request.get_signed_cookie("auth_token", salt='secret_key')
세션 작동 원리
세션 데이터는 서버에 저장되며, 클라이언트에는 세션 ID(키)만 전달됩니다.
if request.COOKIES.get("session_key"):
기존 세션 데이터 업데이트
else:
1. 랜덤 세션 키 생성 (예: sdg34fgdfg)
2. 응답에 쿠키 설정: response.set_cookie("session_key", "sdg34fgdfg")
3. 서버 저장소에 세션 데이터 기록
세션 처리 뷰 예제
def login_view(request):
if request.method == "POST":
username = request.POST.get("username")
# 인증 로직
request.session["user"] = username
request.session["authenticated"] = True
return redirect("/dashboard/")
def dashboard_view(request):
if request.session.get("authenticated"):
username = request.session["user"]
return render(request, "dashboard.html", {"user": username})
return redirect("/login/")
세션 설정 옵션
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 캐시+DB 조합
SESSION_COOKIE_AGE = 604800 # 7일 유지(초 단위)
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 브라우저 종료 시 세션 파기
세션 제어 메서드
request.session.pop("key") # 특정 키 삭제
request.session.flush() # 전체 세션 삭제(DB+캐시)
request.session.set_expiry(300) # 5분 후 만료
Redis 캐시 통합
설치: pip install django-redis
설정 예시
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://localhost:6379/0",
"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient"}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
Redis 직접 접근
from django_redis import get_redis_connection
redis_client = get_redis_connection("default")
redis_client.set("cache_key", "data", ex=3600) # 1시간 캐시
redis_client.get("cache_key")