Django 쿠키 및 세션 관리와 Redis 캐싱

쿠키 설정 메커니즘

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")

태그: Django 쿠키 세션 Redis 캐싱

7월 22일 21:32에 게시됨