Django - Cookie와 Session

해시에 대해서는 이전글을 참고하기

https://mynews0741.tistory.com/56

 

2024.12.20 해시테이블

해시 테이블(Hash Table)1. 해시가 뭘까?2024.12.17 포스팅의 1번 문제의 의문으로 인해 선생님이 해시테이블에 대해 알아보라고 했다.처음에 해쉬라는 것을 들었을 때 맨 처음 떠올렸던 것은 해시브라

mynews0741.tistory.com

 

md5를 암호화할 때 사용하지 마셈(보안이 뚫린적이 있다고함)

 

1. Cookie와 Session 개념 비교

Cookie (쿠키)

  • 클라이언트(브라우저) 측에 저장되는 작은 텍스트 파일
  • 용량 제한: 약 4KB
  • 만료시간을 설정할 수 있음
  • 주로 사용자 설정이나 비로그인 상태의 정보 저장에 사용

Session (세션)

  • 서버 측에 저장되는 사용자별 정보
  • 세션 ID만 쿠키로 클라이언트에 저장
  • 서버 메모리에 저장되므로 용량 제한이 상대적으로 자유로움
  • 보안이 중요한 데이터 저장에 적합

 

2. Django에서 세션이 더 선호되는 이유

보안성

  • 세션은 데이터를 서버에 저장하므로 클라이언트 측에서 데이터를 조작할 수 없음
  • 쿠키는 클라이언트에 저장되어 변조의 위험이 있음

Django 인증 시스템과의 통합

  • Django의 기본 인증 시스템이 세션 기반으로 동작
  • 로그인, 로그아웃 등의 기능이 세션을 기본으로 사용

데이터 처리의 유연성

  • 복잡한 데이터 구조를 쉽게 저장/관리 가능
  • 쿠키는 텍스트 기반이라 복잡한 데이터 처리가 제한적

 

3. Django에서의 Session 사용법

세션 설정 (Set Session)

def set_session_example(request):
    # 기본적인 세션 설정
    request.session['user_id'] = 123          # 단순 값 저장
    
    # 복잡한 데이터 저장
    request.session['cart'] = {               # 딕셔너리 형태로 저장
        'items': [1, 2, 3],
        'total': 1000
    }
    
    # 세션 만료 시간 설정
    request.session.set_expiry(300)           # 5분 후 만료

 

세션 읽기 (Get Session)

def get_session_example(request):
    # 세션에서 값 가져오기
    user_id = request.session.get('user_id', 'anonymous')    # 기본값 설정 가능
    
    # 세션 존재 여부 확인
    if 'cart' in request.session:
        cart = request.session['cart']

 

세션 삭제

def clear_session_example(request):
    # 특정 세션 삭제
    del request.session['user_id']
    
    # 전체 세션 삭제
    request.session.flush()

 

 

4. 실제 활용 예시: 로그인 시스템

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        
        if user is not None:
            # 세션에 사용자 정보 저장
            request.session['is_logged'] = True              # 로그인 상태 저장
            request.session['user_id'] = user.id            # 사용자 ID 저장
            request.session['username'] = user.username     # 사용자명 저장
            
            # 선택적으로 세션 만료 시간 설정
            if request.POST.get('remember_me'):
                request.session.set_expiry(7 * 24 * 3600)   # 7일 동안 유지
            
            return redirect('home')
    return render(request, 'login.html')

def logout_view(request):
    # 로그아웃 시 세션 전체 삭제
    request.session.flush()
    return redirect('login')

 

 

5. Session 사용 시 주의사항

  1. 성능 관련
    • 필요한 데이터만 최소한으로 저장
    • 더 이상 필요 없는 세션은 즉시 삭제
    • 적절한 만료 시간 설정
  2. 보안 관련
    • 민감한 정보는 반드시 암호화하여 저장
    • 세션 ID 노출 방지
    • HTTPS 사용 권장
  3. 데이터 관리
    • 세션 데이터는 주기적으로 정리
    • 큰 데이터는 데이터베이스에 저장하고 세션에는 참조만 저장

 

6. 쿠키 사용이 적합한 경우

  • "오늘 하루 보지 않기" 팝업 설정
  • 사용자 테마/언어 선호도 저장
  • 비로그인 장바구니 (간단한 정보만 저장)
  • 방문 기록 추적

 

 

정리

  • Django 개발에서는 보안과 편의성 때문에 세션 사용을 선호
  • 쿠키는 간단한 사용자 설정이나 비로그인 상태의 정보 저장에 제한적으로 사용
  • 세션은 로그인 정보, 사용자 데이터 등 중요한 정보 저장에 사용