쿠키(Cookie)의 종류 구분 [Session vs Persistent]

2025. 1. 7. 10:48·BE/Django

서론

근래 사내 시스템을 서비스하던 중, 놀라우면서도 생각해 보면 당연한 오류 사항을 제보받았다.

자동 로그인이 컴퓨터 재부팅을 하게 되면 풀린다.

 

기이한 일이었다. 분명 이전에 글로 정리하였듯이 백엔드 단에서 쿠키를 자동으로 재발급하고 자동 로그인 기능을 구현하였으니 말이다.

 

Django JWT 인증 자동화하기 [DRF Simple JWT]

서론근래 사내 서비스를 개발하던 중 프론트엔드 팀의 업무 부담이 증가하면서 JWT 관련 인증 기능을 백엔드에서 전적으로 처리해야 하는 상황이 발생하였다. 본 글에서는 JWT 인증의 일련 과정

no-intellectual.tistory.com

 

그간 나는 쿠키가 세션 방식과 비교되는 만큼 무의식적으로 당연히 쿠키는 영구적으로(만료 전까지) 보관될 것이라 생각하였다.

때문에 컴퓨터를 재부팅한다고 하더라도 자동 로그인이 풀린다는 것은 기이한 일이었다.

 

찾아보니 쿠키도 두 종류로 구분되는 것 같아 이 글을 빌어 정리하고자 한다.

 


 

본론

최근 월 200달러짜리 구독형 플랜을 출시하여 약간 선을 넘으신 Chat GPT님께 고견을 구하였다.

일반적으로 “쿠키(cookie)”라고 불리는 웹 브라우저의 쿠키는 크게 두 가지 종류가 있습니다.

    1. 세션 쿠키(Session Cookies)
    2. 영구 쿠키(Persistent Cookies)

이 중 세션 쿠키는 브라우저가 실행되어 있는 동안(또는 세션이 유지되는 동안)에만 유효하며,
브라우저를 닫거나 시스템을 재부팅(또는 로그아웃 등)하면 자동으로 사라집니다.

반면, 영구 쿠키는 브라우저가 저장 공간(하드디스크나 SSD 등)에 파일 형태로 저장해 두고, 쿠키의 만료 시점까지 유지합니다.

출처 | OpenAI. (2025). ChatGPT (o1 Version) [Large language model]. https://chat.openai.com

 

 

세션(Session) VS 쿠키(Cookie)

‘세션’이란 보통 서버 측에서 사용자의 상태를 유지하기 위한 개념이고,
‘쿠키’는 클라이언트(브라우저) 측에서 상태를 저장하기 위한 수단으로 활용된다.

  • 세션
    • 서버가 사용자의 상태를 추적하기 위해 세션 ID 등을 관리
    • 서버 메모리나 데이터베이스 등 중앙 저장 공간에 상태 정보를 두어 보안적으로 상대적으로 안전
    • 클라이언트가 접속 종료(브라우저 닫음, 타임아웃 등) 시 세션 정보를 파기할 수 있으므로,
      사용자가 재접속할 때마다 새로 로그인해야 하는 경우가 많음

  • 쿠키
    • 클라이언트(사용자의 브라우저)에 상태를 담아두는 방식
    • 세션과 달리 쿠키 자체가 유효기간을 갖고 있고, 필요한 정보를 브라우저가 저장
    • 만료 기간을 직접 지정하지 않으면 세션 쿠키가 되어 브라우저나 컴퓨터를 종료할 때 삭제될 수 있음
    • 만료 기간을 명시하면 영구 쿠키가 되어, 해당 기한 동안은 브라우저를 껐다 켜도 유지

 

 

쿠키(Cookie)의 종류

앞서 언급했듯이, 대표적으로 두 가지 형태의 쿠키가 존재한다.

  1. 세션 쿠키(Session Cookies)
    • 브라우저가 실행되어 있는 동안만 유지
    • 별도의 만료 기한을 설정하지 않으면 기본적으로 이 방식
    • 브라우저가 닫히거나, 컴퓨터가 재부팅되어 브라우저가 다시 시작될 때 사라짐
    • 보안 측면에서 장점이 있지만, 자동 로그인을 원하는 사용자는 매번 로그인해야 할 수 있음

  2. 영구 쿠키(Persistent Cookies)
    • 브라우저가 파일 형태로 쿠키를 저장해 두고, 만료 기한이 도래할 때까지 유지
    • 브라우저나 컴퓨터를 종료해도 만료 기한이 남아 있으면 로그인 상태를 그대로 유지할 수 있음
    • 장기적으로 쿠키가 남아 있어 편리하지만, 너무 긴 만료 기한을 부여하면 보안상 취약점이 될 수도 있음

 

장고(Django)에서는?

Django에서 사용자 브라우저에 쿠키를 저장하기 위해서는 set_cookie() 메서드를 활용한다.

이 메서드에는 여러 가지 옵션이 존재하는데, max_age나 expires 같은 항목을 설정함으로써 쿠키의 만료 기간을 조정할 수 있다.

 

해당 메서드의 공식 문서는 아래와 같다.

Django set_cookie 메서드에 대한 설명 ❘ 출처 : https://docs.djangoproject.com/en/5.1/ref/request-response/

 

공식 문서에서 set_cookie() 메서드를 살펴보면 아래와 같은 설명이 있음을 확인할 수 있다.

max_age가 None(기본값)으로 되어 있을 경우 해당 쿠키는 세션이 유지되는 동안만 지속된다.

즉, max_age를 명시적으로 설정하지 않으면 자동으로 ‘세션 쿠키’로 취급된다는 의미다.

 

이를 영구 쿠키로 활용하고 싶다면 max_age 또는 expires 옵션을 적절히 설정해야 한다.
예를 들어, 아래와 같이 max_age를 1주(초 단위로 604800)로 지정하면, 2주동안 브라우저나 시스템을 재부팅해도 쿠키가 유지된다.

 

response = HttpResponse("쿠키 응답")
response.set_cookie(
    'access',
    access_token,
    httponly=True,
    samesite='Lax',
    max_age=604800  # 1주일
)

return response

 


 

참고자료

 

Request and response objects | Django documentation

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

'BE > Django' 카테고리의 다른 글

DRF Serializer Validation 로직  (0) 2025.04.12
Django의 Request Lifecycle  (0) 2025.02.15
Django JWT 인증 자동화하기 [DRF Simple JWT]  (3) 2024.10.28
'BE/Django' 카테고리의 다른 글
  • DRF Serializer Validation 로직
  • Django의 Request Lifecycle
  • Django JWT 인증 자동화하기 [DRF Simple JWT]
suin.rohh
suin.rohh
  • suin.rohh
    개발세발네발
    suin.rohh
  • 전체
    오늘
    어제
    • 분류 전체보기 (12)
      • Python (1)
      • BE (6)
        • Django (4)
        • ETC (2)
      • DevOps (4)
        • Docker (2)
        • Infra (1)
        • ETC (1)
      • CS (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    serializer
    트러블슈팅
    docker network
    graphql
    Kubernetes
    DevOps
    nginx
    naver cloud platform
    orchestration
    Magic Method
    매직 메서드
    django
    docker-swarm
    docker-compose
    Docker
    인스턴스
    Prometheus
    JWT
    REST API
    Telegraf
    drf
    macos
    k8s
    Middleware
    Python
    grpc
    mssql
    grafana
    NCP
    EXT
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
suin.rohh
쿠키(Cookie)의 종류 구분 [Session vs Persistent]
상단으로

티스토리툴바