웹 개발을 하다 보면 사용자 정보를 일정 시간 동안 유지해야 할 일이 생깁니다.
예를 들어, 로그인 상태 유지, 장바구니 기능, 최근 본 상품 등을 들 수 있죠.
이때 사용하는 개념이 바로 세션(Session)입니다.
이번 글에서는 세션이란 무엇인지, 그리고 Django에서 세션을 어떻게 다루는지에 대해 정리해보겠습니다.
📌 세션(Session)이란?
세션은 서버가 클라이언트의 상태를 일정 시간 동안 기억하는 기술입니다.
기본적으로 HTTP는 Stateless(무상태) 프로토콜이라, 서버는 매 요청마다 클라이언트를 기억하지 못합니다. 이 문제를 해결하기 위해 도입된 것이 쿠키(Cookie)와 세션(Session)입니다.
🍪 쿠키와 세션의 차이
항목 쿠키(Cookie) 세션(Session)
| 항목 | 쿠키 | 세션 |
| 저장 위치 | 클라이언트 (브라우저) | 서버 (DB, 메모리, 캐시 등) |
| 보안 | 취약할 수 있음 (클라이언트에 저장) | 비교적 안전 (서버에 저장됨) |
| 용량 제한 | 약 4KB | 제한 없음 (서버에 따라 다름) |
| 사용 용도 | 사용자 설정 기억, 세션 ID 저장 | 로그인 상태 유지, 장바구니 등 |
💡 세션의 기본 원리
- 사용자가 로그인 등의 동작을 하면,
- 서버는 세션 ID를 생성하고, 클라이언트에게 쿠키 형태로 전달합니다.
- 이후 클라이언트는 요청마다 이 세션 ID를 함께 보냅니다.
- 서버는 세션 ID에 연결된 데이터를 찾아 사용자 정보를 확인합니다.
⚙️ Django에서 세션 설정하기
Django는 세션을 매우 간단하게 사용할 수 있도록 지원합니다.
1. settings.py 확인
# 세션 엔진 (기본값은 DB 세션)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# 세션 데이터 저장 위치 설정
# DB 외에도 캐시, 파일 기반 저장 가능
지원되는 엔진:
- 'django.contrib.sessions.backends.db' (기본값, DB에 저장)
- 'django.contrib.sessions.backends.cache'
- 'django.contrib.sessions.backends.file'
- 'django.contrib.sessions.backends.signed_cookies'
2. 세션 테이블 마이그레이션 (DB 세션인 경우)
python manage.py migrate
✏️ Django에서 세션 사용하기
▶ 세션에 값 저장
def set_session(request):
request.session['username'] = 'minjoo'
return HttpResponse("세션에 저장 완료!")
▶ 세션에서 값 불러오기
def get_session(request):
username = request.session.get('username', 'Guest')
return HttpResponse(f"Hello, {username}")
▶ 세션 삭제하기
def delete_session(request):
try:
del request.session['username']
except KeyError:
pass
return HttpResponse("세션 삭제 완료!")
🧯 세션 유지 시간 설정하기
기본 세션 유효 시간은 2주입니다.
settings.py에서 아래와 같이 변경할 수 있습니다.
# 초 단위 (예: 1시간 = 3600초)
SESSION_COOKIE_AGE = 3600
🧠 추가 옵션
# 브라우저 종료 시 세션 삭제
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
# 사용자가 활동할 때마다 세션 갱신 여부
SESSION_SAVE_EVERY_REQUEST = True
✅ 정리
- 세션은 클라이언트 상태를 서버에서 관리하는 방식
- Django는 세션 기능을 기본 제공하며 매우 쉽게 다룰 수 있음
- 세션은 보안에 강하고, 인증/로그인 유지 등에 매우 유용
🔚 마무리
세션은 웹 개발에서 가장 많이 쓰이는 개념 중 하나입니다. Django처럼 프레임워크가 지원하는 경우, 어렵지 않게 적용할 수 있으니 꼭 직접 실습해보세요!
궁금한 내용이 있다면 댓글로 남겨주세요 :)
'Programming > Django' 카테고리의 다른 글
| Django 이미지가 보이지 않는 이유? static 태그와 |add 필터의 함정 (2) | 2025.07.29 |
|---|---|
| Django에서 직렬화란? 세션 저장 시 발생하는 TypeError 해결하기 (2) | 2025.07.28 |
| [Django] Form 처리, 함수형 뷰에서 클래스 기반 뷰(CBV)로 리팩토링하기 (4) | 2025.07.24 |
| [Django] ModelForm으로 폼을 간단히! 그런데 레이블을 잃었다... (1) | 2025.07.24 |
| [Django] Form을 통해 사용자 리뷰 저장하기 (feat. Model 연결) (2) | 2025.07.24 |