세션(Session)과 쿠키(Cookie)의 차이
웹사이트에 로그인하면 페이지를 이동해도 로그인 상태가 유지됩니다. 장바구니에 상품을 담아두면 다른 페이지로 이동해도 그대로 남아 있습니다. 그런데 HTTP는 기본적으로 무상태(Stateless) 프로토콜입니다. 즉, 요청과 응답이 끝나면 이전 상태를 기억하지 않습니다. 그렇다면 웹은 어떻게 사용자 상태를 유지할까요? 그 핵심이 바로 쿠키와 세션입니다.
먼저 쿠키(Cookie)부터 살펴보겠습니다. 쿠키는 서버가 브라우저에 저장하도록 보내는 작은 데이터 조각입니다. 브라우저는 이를 로컬에 저장해두고, 이후 같은 서버에 요청을 보낼 때 자동으로 함께 전송합니다. 쿠키는 키-값(key-value) 형태로 저장되며, 만료 시간(Expiration), 도메인, 경로(Path) 등의 정보를 포함할 수 있습니다.
예를 들어 사용자가 로그인하면 서버는 “login=true” 같은 쿠키를 브라우저에 저장할 수 있습니다. 이후 사용자가 다른 페이지를 요청할 때 이 쿠키가 함께 전송되어 로그인 여부를 확인합니다.
쿠키는 클라이언트(브라우저)에 저장된다는 점이 가장 큰 특징입니다. 따라서 사용자가 브라우저 개발자 도구를 통해 직접 확인하거나 수정할 수 있습니다. 이 때문에 민감한 정보(비밀번호, 주민번호 등)를 쿠키에 직접 저장하는 것은 매우 위험합니다.
반면 세션(Session)은 서버에 저장되는 사용자 상태 정보입니다. 사용자가 로그인하면 서버는 고유한 세션 ID를 생성하고, 해당 세션 ID와 사용자 정보를 서버 메모리나 데이터베이스에 저장합니다. 그리고 이 세션 ID를 쿠키에 담아 브라우저로 전달합니다.
이후 사용자가 요청을 보낼 때 브라우저는 세션 ID가 담긴 쿠키를 함께 전송합니다. 서버는 이를 통해 해당 사용자의 세션 정보를 조회합니다. 즉, 실제 데이터는 서버에 있고, 브라우저에는 세션을 식별하기 위한 ID만 존재합니다.
정리하면 다음과 같습니다.
쿠키는 클라이언트에 저장되는 데이터이고,
세션은 서버에 저장되는 데이터입니다.
그렇다면 왜 굳이 두 개념이 함께 등장할까요? 실제로 세션을 구현할 때 쿠키가 사용됩니다. 세션 ID를 클라이언트가 기억하고 있어야 서버가 사용자를 식별할 수 있기 때문입니다. 따라서 세션은 쿠키를 활용해 동작하는 구조라고 이해하면 됩니다.
보안 측면에서 보면 세션이 상대적으로 안전합니다. 중요한 데이터는 서버에만 저장되기 때문입니다. 하지만 세션 ID가 탈취되면 세션 하이재킹(Session Hijacking) 공격이 발생할 수 있습니다. 이를 방지하기 위해 HTTPS를 사용하고, HttpOnly, Secure 옵션을 설정합니다.
쿠키에도 다양한 옵션이 존재합니다.
HttpOnly: 자바스크립트에서 접근 불가하게 설정
Secure: HTTPS 연결에서만 전송
SameSite: 다른 사이트에서 쿠키를 보내지 못하도록 제한
이러한 설정은 XSS, CSRF 같은 웹 공격을 방지하는 데 중요합니다.
성능 측면에서도 차이가 있습니다. 쿠키는 요청마다 함께 전송되기 때문에 데이터 크기가 커지면 네트워크 부담이 증가합니다. 반면 세션은 서버 자원을 사용합니다. 사용자 수가 많아지면 서버 메모리 사용량이 증가할 수 있습니다. 그래서 대규모 서비스에서는 세션을 Redis 같은 외부 저장소에 저장하기도 합니다.
최근에는 JWT(JSON Web Token) 방식도 많이 사용됩니다. 이는 세션 대신 토큰 기반 인증을 사용하는 방식입니다. 서버가 상태를 저장하지 않고, 토큰 자체에 사용자 정보를 담아 무상태 인증을 구현합니다.
비유를 들어보면 쿠키는 사용자가 직접 들고 다니는 메모지와 같습니다. 메모지에 적힌 정보를 서버에 보여주는 구조입니다. 반면 세션은 서버에 보관된 출입 기록과 같습니다. 사용자는 출입증 번호(세션 ID)만 가지고 있고, 실제 정보는 서버가 관리합니다.
정리하자면 쿠키는 클라이언트에 저장되는 작은 데이터이고, 세션은 서버에 저장되는 사용자 상태 정보입니다. HTTP의 무상태 특성을 보완하기 위해 두 개념이 함께 사용됩니다. 로그인 유지, 장바구니, 사용자 인증 등 웹 서비스의 기본 기능은 대부분 세션과 쿠키를 기반으로 동작합니다. 서버와 웹 보안을 이해하려면 반드시 구분해서 알아야 할 핵심 개념입니다.
Leave a Reply