TIL

내일배움캠프 본캠프 36일차 - 쿠키와 세션

수현조 2025. 1. 15. 23:05

쿠키(Cookie) 🍪 – 웹에서의 작은 기억 조각

쿠키는 웹사이트가 사용자의 브라우저에 저장하는 작은 데이터 조각으로, 사용자의 활동을 기억하고 다음 방문 시 동일한 상태를 유지할 수 있도록 돕는 역할을 합니다. 주로 장바구니, 로그인 유지, 사용자 맞춤 광고 등의 기능에서 사용됩니다.


1. 쿠키의 주요 특징

  1. 서버에서 클라이언트(브라우저)로 전달됨
    • 사용자가 웹사이트를 방문하면 서버에서 쿠키를 생성하여 브라우저에 전달.
    • 이후 같은 사이트를 방문할 때 해당 쿠키가 서버로 다시 전송됨.
  2. Key-Value 형태로 저장
    • 쿠키는 key=value 형태의 단순한 데이터를 저장하며, JSON 형식의 데이터를 저장할 수도 있음.
  3. 클라이언트 측 저장
    • 쿠키는 브라우저(로컬)에 저장되며, 사용자가 삭제하거나 브라우저 설정에 의해 차단될 수 있음.
  4. 모든 요청 시 자동 전송
    • 동일한 서버에 대한 요청 시 자동으로 쿠키가 함께 전달되어 사용자의 상태를 유지할 수 있음.

2. 쿠키의 사용 사례

쿠키는 사용자의 경험을 향상시키기 위한 다양한 목적으로 사용됩니다.

사용 사례 설명

로그인 유지 로그인 상태를 유지하여 페이지 이동 시 다시 로그인할 필요 없음
장바구니 기능 장바구니에 담은 제품 정보를 저장하여 다시 방문 시 유지
최근 검색 기록 검색했던 키워드를 쿠키에 저장하여 맞춤형 추천 제공
사이트 맞춤 설정 사용자의 언어, 테마 등의 설정을 기억하여 동일한 환경 제공
오늘 다시 보지 않기 특정 팝업을 하루 동안 보지 않도록 설정

3. 쿠키의 동작 과정

쿠키는 다음과 같은 방식으로 작동합니다.

  1. 클라이언트가 서버에 최초 요청
    • 사용자가 웹사이트에 처음 접속하면, 서버가 쿠키를 생성하여 브라우저로 전송.
  2. 브라우저가 쿠키 저장
    • 쿠키는 브라우저의 로컬 스토리지에 저장됨.
  3. 클라이언트의 후속 요청
    • 이후 동일한 웹사이트 요청 시 쿠키가 HTTP 요청 헤더에 포함되어 서버로 전달됨.
  4. 서버의 쿠키 확인
    • 서버는 전송된 쿠키를 통해 사용자를 식별하고, 맞춤형 콘텐츠 제공.

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. 쿠키의 장점

  1. 서버 부담 감소:
    • 세션 대신 클라이언트 측에 정보를 저장하여 서버 리소스 절약.
  2. 손쉬운 구현:
    • 간단한 설정으로 로그인 유지, 사용자 맞춤 설정 가능.
  3. 자동 전송:
    • 동일한 사이트 요청 시 브라우저가 자동으로 쿠키를 포함하여 전송.

5.2. 쿠키의 단점

  1. 보안 문제:
    • 사용자가 브라우저에서 쿠키를 조작할 수 있어 조작 및 탈취 위험이 있음.
    • HTTPS를 통해 전송해야 하며, HttpOnly, Secure 속성을 적용해야 함.
  2. 저장 공간 제한:
    • 대부분의 브라우저는 도메인당 4KB의 제한을 가짐.
  3. 사용자의 설정 가능:
    • 사용자가 브라우저 설정을 통해 쿠키 저장을 거부할 수 있음.

6. 보안 관련 고려사항

쿠키는 보안에 취약할 수 있으므로 다음과 같은 보안 설정을 적용해야 합니다.

  1. Secure 옵션:
    • HTTPS를 통해서만 쿠키를 전송하도록 제한.
  2. HttpOnly 옵션:
    • JavaScript에서 접근 불가능하도록 설정 (XSS 공격 방지).
  3. SameSite 옵션:
    • 사이트 간 요청에서 쿠키 전송 여부를 제한 (CSRF 공격 방지).
response.set_cookie('sessionid', 'abcd1234', httponly=True, secure=True, samesite='Lax')

7. 쿠키 관련 최신 동향 (프라이버시 문제 및 규제)

  • 개인정보 보호 규제 강화:
    • GDPR(유럽연합 개인정보보호법), CCPA(캘리포니아 소비자 개인정보 보호법)에 의해 사용자 동의 없이 쿠키를 저장하는 것이 금지됨.
  • 브라우저의 변화:
    • 구글 크롬은 2024년부터 서드파티 쿠키 차단을 계획 중이며, 이를 통해 광고 산업의 큰 변화가 예상됨.
  • 대체 기술:
    • LocalStorage, SessionStorage, JWT (JSON Web Token) 등의 대안 사용 증가.

8. 결론 및 요약

  1. 쿠키는 클라이언트의 브라우저에 저장되며, 장바구니, 로그인 유지, 최근 검색 기능에 사용.
  2. 보안 및 개인정보 이슈가 있기 때문에, 민감한 데이터 저장은 피해야 함.
  3. 브라우저의 쿠키 차단 정책이 변화하고 있어 대체 기술(JWT, LocalStorage)이 중요해짐.

 

세션(Session) – 클라이언트 상태 유지를 위한 서버 측 저장소

쿠키(Cookie)만으로 웹 애플리케이션을 구현할 경우, 보안에 취약할 수 있습니다.
이를 보완하기 위해 **세션(Session)**이 사용됩니다. 세션은 서버가 상태를 기억하도록 하여 보안성을 높이고, 사용자 인증 및 개인화된 서비스 제공을 가능하게 합니다.


1. 세션(Session) 개요

1.1. 세션이란?

세션은 서버에서 사용자의 상태 정보를 유지하기 위한 방법으로, 사용자와의 상호작용이 있는 동안 지속됩니다.

세션의 주요 특징:

  • 클라이언트가 요청을 보낼 때마다 **세션 ID(Session ID)**를 통해 사용자 상태를 추적.
  • 민감한 정보는 서버에서 관리, 클라이언트에는 세션 ID만 저장.
  • 일정 시간이 지나면 만료(유효기간 조정 가능).

1.2. 세션 동작 방식

세션의 작동 흐름을 단계별로 살펴보겠습니다.

  1. 클라이언트가 서버에 로그인 요청.
  2. 서버가 고유한 세션 ID를 생성하고 클라이언트에게 응답(Cookie에 sessionid 저장).
  3. 클라이언트는 이후의 모든 요청에서 쿠키를 통해 세션 ID를 전송.
  4. 서버는 세션 ID를 사용하여 사용자의 상태를 유지하고 적절한 응답을 반환.
  5. 사용자가 로그아웃하거나 세션이 만료되면 상태가 삭제됨.

예제 흐름:

[요청] 클라이언트 → 서버 (로그인 정보 전송)
[응답] 서버 → 클라이언트 (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 지속 쿠키)

쿠키의 수명에 따라 두 가지 유형이 있습니다.

  1. 세션 쿠키(Session Cookie):
    • 브라우저가 닫히면 삭제됨.
    • SESSION_EXPIRE_AT_BROWSER_CLOSE = True 설정 시 적용.
  2. 지속 쿠키(Persistent Cookie):
    • 브라우저를 닫아도 유지되며, max-age 옵션으로 수명을 지정.
    • SESSION_COOKIE_AGE = 86400 (하루 유지) 설정 시 적용.

5. 세션의 장단점

5.1. 세션의 장점

  • 보안성:
    • 민감한 정보를 서버에 저장하여 클라이언트의 조작 위험 없음.
  • 다양한 백엔드 지원:
    • DB, 캐시 등 유연한 스토리지 사용 가능.
  • 자동 만료 관리:
    • 일정 시간 후 세션 자동 만료.

5.2. 세션의 단점

  • 서버 부하:
    • 많은 사용자 세션이 서버에 저장될 경우 리소스 사용 증가.
  • 속도 저하:
    • 서버에서 데이터를 조회해야 하므로 쿠키보다 속도가 느릴 수 있음.

6. 세션과 쿠키의 비교

비교 항목 쿠키(Cookie) 세션(Session)

저장 위치 클라이언트(브라우저) 서버
보안 수준 낮음(조작 가능) 높음(서버 저장)
속도 빠름 상대적으로 느림
저장 용량 제한적(4KB) 제한 없음(서버 용량에 따라)
지속 시간 설정 가능 브라우저 종료 시 만료 가능
데이터 공유 브라우저 간 공유 불가 서버에서 세션 관리 가능

7. 보안 강화 방안 (Django 세션 보안)

  1. HTTPS 사용:
    • SESSION_COOKIE_SECURE = True 설정하여 보안 강화.
  2. HttpOnly 쿠키 사용:
    • SESSION_COOKIE_HTTPONLY = True 설정하여 JavaScript 접근 차단.
  3. 세션 만료 시간 설정:
    • SESSION_COOKIE_AGE를 짧게 설정하여 보안 강화.

8. 결론 및 요약

  1. 쿠키는 클라이언트 측 저장, 세션은 서버 측 저장.
  2. Django는 세션 ID만 쿠키에 저장하며, 데이터를 서버에 저장.
  3. 보안을 위해 HTTPS, HttpOnly, Secure 옵션을 활용.
  4. Django의 세션 관리 기능을 사용하면 인증 및 사용자 상태를 손쉽게 유지 가능.