웹 통신(HTTP)의 가장 큰 특징은 '무상태(Stateless)'입니다. 서버는 요청을 보낸 사용자가 이전에 어떤 요청을 했는지 기억하지 못합니다.

이런 '무상태' 환경에서는 다음과 같은 문제가 발생할 수 있습니다.

  • 로그인: 페이지를 이동할 때마다 다시 로그인해야 합니다.
  • 장바구니: 상품을 담고 다른 페이지로 가면 장바구니에 담은 물품이 사라집니다.

이러한 문제를 해결하기 위해 세션(Session)을 사용합니다.

 

세션(Session)은 웹 사이트와 사용자(브라우저) 간의 지속적인 대화 상태를 유지하는 창구와 같은 역할을 합니다.

 

서버는 각 사용자를 위한 '전용 창구'를 만들어두고, 사이트를 이용하는 동안 특정 사용자를 기억할 수 있게 됩니다. 따라서 서버는 사용자의 로그인 상태, 장바구니 내용 등을 유지할 수 있습니다.

세션의 동작 방식 : 개인 사물함과 열쇠

세션은 보통 세션 ID쿠키를 이용해 동작합니다. 이 과정을 '개인 사물함과 열쇠'에 비유하면 쉽게 이해할 수 있습니다.

  1. 최초 접속 (손님의 첫 방문)
    사용자가 웹사이트에 처음 접속합니다.
  2. 세션 생성 및 세션 ID 발급 (개인 사물함과 열쇠 제공)
    서버는 이 사용자를 위한 고유한 저장 공간(세션)을 서버 메모리나 데이터베이스에 만듭니다. 이것이 바로 '개인 사물함'입니다.
    그리고 서버는 이 '개인 사물함'을 열 수 있는 유일한 '열쇠'인 세션 ID를 생성합니다.
  3. 세션 ID 전달 (열쇠를 사용자에게 전달)
    서버는 생성된 세션 ID를 HTTP 응답 헤더에 담아 사용자 브라우저에게 전달합니다.
  4. 쿠키에 저장 (열쇠를 주머니에 보관)
    사용자 브라우저는 서버로부터 받은 세션 ID를 쿠키에 저장합니다. 이제 사용자는 사이트를 이용하는 동안 이 '열쇠'를 자신의 주머니에 가지고 다니는 셈입니다.
  5. 재접속 및 인증 (열쇠 확인)
    사용자가 같은 웹사이트 내에서 다른 페이지로 이동하거나 다시 요청을 보낼 때, 브라우저는 요청 헤더의 쿠키에 저장된 세션 ID(열쇠)를 자동으로 꺼내어 서버에 보여줍니다.
  6. 상태 유지 (개인 사물함 정보 확인)
    서버는 사용자에게 받은 '열쇠'를 보고, 서버에 있는 수많은 개인 사물함 중에서 그 열쇠에 맞는 사물함을 찾아냅니다.
    사물함과 열쇠가 일치한다면, 그 안에 저장된 정보(로그인 상태, 장바구니 내용 등)를 바탕으로 응답합니다.
  7. 세션 종료 (개인 사물함 비우기)
    사용자가 로그아웃하거나, 브라우저를 닫거나, 서버에서 설정한 일정 시간 동안 아무런 활동이 없으면(세션 만료), 서버는 해당 세션 정보('개인 사물함')를 삭제합니다.

세션과 쿠키의 차이점

구분 쿠키 (Cookie) 세션 (Session)
저장 위치 사용자 브라우저 (클라이언트 측) 웹 서버
저장 내용 간단한 텍스트 데이터 (Key-Value)
세션 ID 같은 열쇠를 저장
객체를 포함한 모든 유형의 데이터<br>로그인 정보, 장바구니 등
중요한 내용물
보안 상대적으로 낮음 (클라이언트에서 수정 가능) 상대적으로 높음 (서버에 저장되어 안전)
생명 주기 설정한 만료 시간까지 유지 (브라우저를 닫아도 유지 가능) 브라우저 종료 시 또는 서버 만료 시 삭제됨
속도/부하 서버에 부담을 주지 않음 사용자가 많아지면 서버에 부하를 줄 수 있음

정리

쿠키는 사용자의 컴퓨터에 남겨진 '열쇠'와 같고, 세션은 그 열쇠를 보고 서버가 관리하는 '개인 사물함'과 같습니다.
중요한 정보는 안전한 사물함(세션)에 보관하고, 그 사물함을 열 수 있는 열쇠(세션 ID)만 사용자(쿠키)에게 맡기는 방식입니다.

이러한 세션 메커니즘을 이용하여 '상태 없는' 웹 환경에서도 편리하게 로그인 상태를 유지합니다.

728x90

'CS' 카테고리의 다른 글

Prisma ORM에 대하여  (0) 2025.08.02
클린 아키텍쳐(Clean Architecture)란?  (0) 2025.07.12
객체 지향이란?  (0) 2025.06.29
데이터 정규화(Normalization)란?  (0) 2025.06.26
동기화와 비동기화  (0) 2025.06.20