내일배움캠프 본캠프 36일차 - 쿠키와 세션
쿠키(Cookie) 🍪 – 웹에서의 작은 기억 조각
쿠키는 웹사이트가 사용자의 브라우저에 저장하는 작은 데이터 조각으로, 사용자의 활동을 기억하고 다음 방문 시 동일한 상태를 유지할 수 있도록 돕는 역할을 합니다. 주로 장바구니, 로그인 유지, 사용자 맞춤 광고 등의 기능에서 사용됩니다.
1. 쿠키의 주요 특징
- 서버에서 클라이언트(브라우저)로 전달됨
- 사용자가 웹사이트를 방문하면 서버에서 쿠키를 생성하여 브라우저에 전달.
- 이후 같은 사이트를 방문할 때 해당 쿠키가 서버로 다시 전송됨.
- Key-Value 형태로 저장
- 쿠키는 key=value 형태의 단순한 데이터를 저장하며, JSON 형식의 데이터를 저장할 수도 있음.
- 클라이언트 측 저장
- 쿠키는 브라우저(로컬)에 저장되며, 사용자가 삭제하거나 브라우저 설정에 의해 차단될 수 있음.
- 모든 요청 시 자동 전송
- 동일한 서버에 대한 요청 시 자동으로 쿠키가 함께 전달되어 사용자의 상태를 유지할 수 있음.
2. 쿠키의 사용 사례
쿠키는 사용자의 경험을 향상시키기 위한 다양한 목적으로 사용됩니다.
사용 사례 설명
로그인 유지 | 로그인 상태를 유지하여 페이지 이동 시 다시 로그인할 필요 없음 |
장바구니 기능 | 장바구니에 담은 제품 정보를 저장하여 다시 방문 시 유지 |
최근 검색 기록 | 검색했던 키워드를 쿠키에 저장하여 맞춤형 추천 제공 |
사이트 맞춤 설정 | 사용자의 언어, 테마 등의 설정을 기억하여 동일한 환경 제공 |
오늘 다시 보지 않기 | 특정 팝업을 하루 동안 보지 않도록 설정 |
3. 쿠키의 동작 과정
쿠키는 다음과 같은 방식으로 작동합니다.
- 클라이언트가 서버에 최초 요청
- 사용자가 웹사이트에 처음 접속하면, 서버가 쿠키를 생성하여 브라우저로 전송.
- 브라우저가 쿠키 저장
- 쿠키는 브라우저의 로컬 스토리지에 저장됨.
- 클라이언트의 후속 요청
- 이후 동일한 웹사이트 요청 시 쿠키가 HTTP 요청 헤더에 포함되어 서버로 전달됨.
- 서버의 쿠키 확인
- 서버는 전송된 쿠키를 통해 사용자를 식별하고, 맞춤형 콘텐츠 제공.
4. 쿠키 설정 방법 (Django 예제)
Django에서 쿠키를 설정하고 가져오는 방법을 살펴보겠습니다.
4.1. 쿠키 설정하기
from django.http import HttpResponse
def set_cookie(request):
response = HttpResponse("쿠키를 설정했습니다!")
response.set_cookie('username', 'johndoe', max_age=3600) # 1시간 유지
return response
옵션 설명:
- set_cookie(key, value, max_age=3600): 키-값을 설정하고, 유효기간(초 단위) 지정.
- expires: 특정 만료 날짜 설정 가능.
4.2. 쿠키 가져오기
def get_cookie(request):
username = request.COOKIES.get('username', 'Guest')
return HttpResponse(f'안녕하세요, {username}님!')
설명:
- request.COOKIES.get('key', '기본값') → 쿠키 값 가져오기, 없을 경우 기본값 반환.
4.3. 쿠키 삭제하기
def delete_cookie(request):
response = HttpResponse("쿠키를 삭제했습니다!")
response.delete_cookie('username')
return response
5. 쿠키의 장단점
5.1. 쿠키의 장점
- 서버 부담 감소:
- 세션 대신 클라이언트 측에 정보를 저장하여 서버 리소스 절약.
- 손쉬운 구현:
- 간단한 설정으로 로그인 유지, 사용자 맞춤 설정 가능.
- 자동 전송:
- 동일한 사이트 요청 시 브라우저가 자동으로 쿠키를 포함하여 전송.
5.2. 쿠키의 단점
- 보안 문제:
- 사용자가 브라우저에서 쿠키를 조작할 수 있어 조작 및 탈취 위험이 있음.
- HTTPS를 통해 전송해야 하며, HttpOnly, Secure 속성을 적용해야 함.
- 저장 공간 제한:
- 대부분의 브라우저는 도메인당 4KB의 제한을 가짐.
- 사용자의 설정 가능:
- 사용자가 브라우저 설정을 통해 쿠키 저장을 거부할 수 있음.
6. 보안 관련 고려사항
쿠키는 보안에 취약할 수 있으므로 다음과 같은 보안 설정을 적용해야 합니다.
- Secure 옵션:
- HTTPS를 통해서만 쿠키를 전송하도록 제한.
- HttpOnly 옵션:
- JavaScript에서 접근 불가능하도록 설정 (XSS 공격 방지).
- SameSite 옵션:
- 사이트 간 요청에서 쿠키 전송 여부를 제한 (CSRF 공격 방지).
response.set_cookie('sessionid', 'abcd1234', httponly=True, secure=True, samesite='Lax')
7. 쿠키 관련 최신 동향 (프라이버시 문제 및 규제)
- 개인정보 보호 규제 강화:
- GDPR(유럽연합 개인정보보호법), CCPA(캘리포니아 소비자 개인정보 보호법)에 의해 사용자 동의 없이 쿠키를 저장하는 것이 금지됨.
- 브라우저의 변화:
- 구글 크롬은 2024년부터 서드파티 쿠키 차단을 계획 중이며, 이를 통해 광고 산업의 큰 변화가 예상됨.
- 대체 기술:
- LocalStorage, SessionStorage, JWT (JSON Web Token) 등의 대안 사용 증가.
8. 결론 및 요약
- 쿠키는 클라이언트의 브라우저에 저장되며, 장바구니, 로그인 유지, 최근 검색 기능에 사용.
- 보안 및 개인정보 이슈가 있기 때문에, 민감한 데이터 저장은 피해야 함.
- 브라우저의 쿠키 차단 정책이 변화하고 있어 대체 기술(JWT, LocalStorage)이 중요해짐.
세션(Session) – 클라이언트 상태 유지를 위한 서버 측 저장소
쿠키(Cookie)만으로 웹 애플리케이션을 구현할 경우, 보안에 취약할 수 있습니다.
이를 보완하기 위해 **세션(Session)**이 사용됩니다. 세션은 서버가 상태를 기억하도록 하여 보안성을 높이고, 사용자 인증 및 개인화된 서비스 제공을 가능하게 합니다.
1. 세션(Session) 개요
1.1. 세션이란?
세션은 서버에서 사용자의 상태 정보를 유지하기 위한 방법으로, 사용자와의 상호작용이 있는 동안 지속됩니다.
세션의 주요 특징:
- 클라이언트가 요청을 보낼 때마다 **세션 ID(Session ID)**를 통해 사용자 상태를 추적.
- 민감한 정보는 서버에서 관리, 클라이언트에는 세션 ID만 저장.
- 일정 시간이 지나면 만료(유효기간 조정 가능).
1.2. 세션 동작 방식
세션의 작동 흐름을 단계별로 살펴보겠습니다.
- 클라이언트가 서버에 로그인 요청.
- 서버가 고유한 세션 ID를 생성하고 클라이언트에게 응답(Cookie에 sessionid 저장).
- 클라이언트는 이후의 모든 요청에서 쿠키를 통해 세션 ID를 전송.
- 서버는 세션 ID를 사용하여 사용자의 상태를 유지하고 적절한 응답을 반환.
- 사용자가 로그아웃하거나 세션이 만료되면 상태가 삭제됨.
예제 흐름:
[요청] 클라이언트 → 서버 (로그인 정보 전송)
[응답] 서버 → 클라이언트 (Set-Cookie: sessionid=abc123)
[요청] 클라이언트 → 서버 (Cookie: sessionid=abc123)
1.3. 쿠키와 세션의 조합 (보안 강화)
- 쿠키에는 세션 ID만 저장.
- 민감한 정보(예: 비밀번호, 개인 데이터)는 서버에 저장.
- 보안 옵션을 통해 만료 시간, 접근 제어, 보안 속성(HTTPOnly, Secure) 적용 가능.
2. Django의 세션 및 인증(Auth) 시스템
Django는 기본적으로 세션을 통해 사용자의 상태를 관리하고, 쿠키에 세션 ID만 저장하는 방식을 사용합니다.
Django의 django.contrib.sessions 및 django.contrib.auth 앱이 자동으로 이를 처리합니다.
2.1. Django 세션 사용법
Django에서 세션은 request.session 객체를 통해 쉽게 사용이 가능합니다.
2.2. 세션 설정 (settings.py)
Django에서는 다양한 세션 백엔드를 제공합니다. settings.py에서 다음과 같이 설정할 수 있습니다.
# 세션 설정 (기본값은 DB 세션)
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 기본 DB 저장
# 세션 유효 시간 설정 (초 단위)
SESSION_COOKIE_AGE = 3600 # 1시간 유지
# 브라우저가 종료되면 세션 삭제 여부
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 브라우저 닫으면 삭제
# HttpOnly 설정 (JavaScript 접근 차단)
SESSION_COOKIE_HTTPONLY = True
# HTTPS에서만 세션 사용
SESSION_COOKIE_SECURE = True
2.3. 세션 데이터 저장 및 가져오기
1) 세션에 데이터 저장
def set_session(request):
request.session['username'] = 'john_doe'
request.session['is_logged_in'] = True
return HttpResponse("세션이 설정되었습니다.")
2) 세션에서 데이터 가져오기
def get_session(request):
username = request.session.get('username', 'Guest')
if 'is_logged_in' in request.session:
return HttpResponse(f'안녕하세요, {username}님!')
else:
return HttpResponse("로그인이 필요합니다.")
2.4. 세션 데이터 삭제
def delete_session(request):
try:
del request.session['username']
except KeyError:
pass
return HttpResponse("세션이 삭제되었습니다.")
3. Django의 세션 백엔드 종류
Django는 세션 데이터를 저장하기 위해 다양한 백엔드를 제공합니다.
백엔드 | 설명 |
db (기본값) | 데이터베이스에 세션 저장 (자동 마이그레이션 필요) |
cache | 캐시(메모리) 저장 (빠르지만 휘발성 있음) |
file | 파일 시스템을 통해 세션 저장 |
cookie | 클라이언트 쿠키에 모든 세션 데이터 저장 |
cached_db (하이브리드) | 캐시에 저장 후 만료되면 DB에 저장 |
예제: 캐시 기반 세션 사용 설정
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
4. 세션 유형 (세션 쿠키 vs 지속 쿠키)
쿠키의 수명에 따라 두 가지 유형이 있습니다.
- 세션 쿠키(Session Cookie):
- 브라우저가 닫히면 삭제됨.
- SESSION_EXPIRE_AT_BROWSER_CLOSE = True 설정 시 적용.
- 지속 쿠키(Persistent Cookie):
- 브라우저를 닫아도 유지되며, max-age 옵션으로 수명을 지정.
- SESSION_COOKIE_AGE = 86400 (하루 유지) 설정 시 적용.
5. 세션의 장단점
5.1. 세션의 장점
- 보안성:
- 민감한 정보를 서버에 저장하여 클라이언트의 조작 위험 없음.
- 다양한 백엔드 지원:
- DB, 캐시 등 유연한 스토리지 사용 가능.
- 자동 만료 관리:
- 일정 시간 후 세션 자동 만료.
5.2. 세션의 단점
- 서버 부하:
- 많은 사용자 세션이 서버에 저장될 경우 리소스 사용 증가.
- 속도 저하:
- 서버에서 데이터를 조회해야 하므로 쿠키보다 속도가 느릴 수 있음.
6. 세션과 쿠키의 비교
비교 항목 쿠키(Cookie) 세션(Session)
저장 위치 | 클라이언트(브라우저) | 서버 |
보안 수준 | 낮음(조작 가능) | 높음(서버 저장) |
속도 | 빠름 | 상대적으로 느림 |
저장 용량 | 제한적(4KB) | 제한 없음(서버 용량에 따라) |
지속 시간 | 설정 가능 | 브라우저 종료 시 만료 가능 |
데이터 공유 | 브라우저 간 공유 불가 | 서버에서 세션 관리 가능 |
7. 보안 강화 방안 (Django 세션 보안)
- HTTPS 사용:
- SESSION_COOKIE_SECURE = True 설정하여 보안 강화.
- HttpOnly 쿠키 사용:
- SESSION_COOKIE_HTTPONLY = True 설정하여 JavaScript 접근 차단.
- 세션 만료 시간 설정:
- SESSION_COOKIE_AGE를 짧게 설정하여 보안 강화.
8. 결론 및 요약
- 쿠키는 클라이언트 측 저장, 세션은 서버 측 저장.
- Django는 세션 ID만 쿠키에 저장하며, 데이터를 서버에 저장.
- 보안을 위해 HTTPS, HttpOnly, Secure 옵션을 활용.
- Django의 세션 관리 기능을 사용하면 인증 및 사용자 상태를 손쉽게 유지 가능.