쿠키(Cookie)와 세션(Session)은 사용자의 웹사이트 방문 정보를 저장하는 데 사용되는 기술이다. 사용자가 웹사이트를 탐색할 때 지속성을 유지하고 사용자 경험을 개선하기 위해 사용된다.
탄생 배경
쿠키와 세션이 생겨난 배경은 웹의 상태 비저장(Stateless) 특성과 관련이 있다. 초기의 웹 프로토콜인 HTTP는 상태 비저장 프로토콜로 설계되었는데, 이는 서버가 이전 클라이언트의 요청을 기억하지 않는다는 의미이다.
- 문제점
- 개인화된 사용자 경험 부재: 사용자가 이전에 로그인했더라도 페이지를 이동할 때마다 로그인 상태를 유지할 수 없다.
- 트랜잭션 관리의 어려움: 쇼핑 카트 기능과 같이 여러 단계의 사용자 상호작용을 추적할 수 없다.
- 서버 요청 처리의 비효율성: 매 요청마다 사용자를 인증하는 등의 반복적인 작업이 필요했다.
쿠키의 도입: 쿠키는 1994년 넷스케이프(Netscape) 커뮤니케이션즈에 의해 처음 도입되었다. 웹사이트가 사용자 정보를 클라이언트 측에 저장할 수 있도록 허용함으로써, 웹사이트는 사용자가 사이트를 재방문할 때 그 사용자를 식별할 수 있게 되었다.
세션의 도입: 쿠키를 통해 많은 문제가 해결되었지만, 쿠키만으로는 모든 상태 관리 문제를 해결할 수 없었다. 특히 보안 문제와 클라이언트 측에 저장할 수 있는 데이터의 한계 때문에 서버 측에서 상태를 관리할 필요성이 증가했다. 세션은 이러한 요구에 대응하여 등장했으며, 각 사용자에게 고유한 세션 ID를 할당하여 서버에서 사용자의 상태를 관리할 수 있게 되었다.
쿠키
쿠키(Cookies)는 웹사이트가 사용자의 웹 브라우저에 저장하는 작은 데이터 조각이다. 이 데이터는 사용자가 웹사이트를 방문할 때마다 브라우저를 통해 서버에 다시 전송된다. 쿠키의 주된 목적은 웹 사용자의 경험을 개인화하고, 웹사이트 방문 시 사용자의 세션을 기억하는 것이다. 쿠키를 통해 웹사이트는 사용자가 사이트에 로그인한 상태를 유지하거나, 사이트 설정을 기억하고, 쇼핑 카트에 담긴 아이템을 추적하는 등의 기능을 수행할 수 있다.
작동 방식
- 사용자가 웹사이트를 방문한다.
- 웹사이트 서버는 HTTP 응답과 함께 쿠키를 생성하여 사용자의 웹 브라우저로 전송한다.
- 브라우저는 이 쿠키를 저장하고, 이후 동일한 서버에 요청을 보낼 때마다 쿠키를 HTTP 요청과 함께 서버로 다시 전송한다.
- 서버는 쿠키 정보를 읽어 사용자를 식별하고, 사용자별로 맞춤화된 정보를 제공한다.
한계와 문제점
- 보안 문제: 쿠키는 평문으로 저장되므로, 악의적인 사용자가 쿠키를 가로채 개인 정보를 훔치거나 세션 하이재킹(session hijacking)을 시도할 수 있다.
- 개인 정보 보호: 사용자의 웹 브라우징 활동을 추적할 수 있어, 개인 정보 보호와 관련된 우려가 있다.
- 크기 제한: 쿠키는 한 도메인당 4KB의 데이터만 저장할 수 있어, 많은 양의 정보를 저장하기에는 부적합하다.
- 브라우저 호환성: 모든 브라우저가 쿠키를 동일하게 처리하지 않으며, 사용자가 쿠키를 비활성화할 수도 있다.
세션
세션(Session)은 웹사이트와 사용자 간의 상호작용을 유지하는 기술이다. 쿠키와 마찬가지로 세션도 사용자의 웹사이트 방문을 개인화하고 추적하지만, 주된 차이점은 세션 데이터가 서버 측에 저장된다는 점이다. 이로 인해 세션은 쿠키보다 더 안전하고, 더 많은 양의 데이터를 저장할 수 있다.
작동 방식
- 사용자가 웹사이트에 로그인하면, 서버는 고유한 세션 ID를 생성한다.
- 이 세션 ID는 쿠키를 통해 사용자의 브라우저에 저장될 수 있으며, 이후 사용자의 모든 요청과 함께 서버로 전송된다.
- 서버는 세션 ID를 통해 사용자의 세션 데이터를 찾아 현재 상태를 유지하고, 사용자별로 맞춤화된 서비스를 제공한다.
- 세션은 사용자가 로그아웃하거나 정해진 시간 동안 활동이 없을 경우 서버에서 자동으로 종료될 수 있다.
한계와 문제점
- 서버 리소스: 세션 데이터는 서버에 저장되므로, 많은 수의 동시 사용자가 있는 경우 상당한 양의 서버 메모리를 소비한다.
- 확장성 문제: 서버 기반의 세션 관리는 웹 애플리케이션을 수평적으로 확장하기 어렵게 만든다. 여러 서버가 세션 정보를 공유해야 할 때, 세션 상태를 동기화하기 위한 추가적인 인프라가 필요하다.
- 쿠키 의존성: 세션은 일반적으로 사용자의 브라우저에 세션 ID를 저장하기 위해 쿠키를 사용한다. 쿠키가 비활성화되어 있거나 제대로 작동하지 않는 경우, 세션 추적이 어려워질 수 있다.
세션과 쿠키의 협력 ❗️
웹 개발에서 세션과 쿠키는 종종 함께 사용된다. 쿠키는 세션 ID를 저장하여 사용자가 서버와의 연결을 유지할 수 있도록 하고, 서버는 세션 ID를 통해 사용자별 세션 데이터에 접근한다. 이렇게 함으로써, 개발자는 사용자의 로그인 상태를 유지하고, 사용자 맞춤형 경험을 제공할 수 있다.
상태 정보 유지: HTTP 프로토콜은 기본적으로 상태를 유지하지 않는다. 쿠키를 사용하여 클라이언트(주로 웹 브라우저)에 일시적인 상태 정보를 저장함으로써, 서버는 클라이언트의 요청이 이전 요청과 동일한 ‘상태’ 또는 ‘세션’에서 왔는지를 판단할 수 있다.
인증 메커니즘: 사용자가 로그인할 때, 서버는 인증 후 생성된 세션 ID를 쿠키에 저장하여 클라이언트에 전송한다. 클라이언트는 이후의 모든 요청에 이 쿠키를 포함시켜, 서버가 사용자를 인식하고 인증 상태를 유지할 수 있도록 한다.
보안 강화: 단독으로 사용될 때보다 세션과 쿠키를 함께 사용함으로써 보안을 강화할 수 있다. 예를 들어, 세션 ID는 쿠키에 저장되지만, 실제 세션 데이터는 서버에 저장되므로, 공격자가 세션 ID를 탈취하더라도 서버에 저장된 중요한 정보에 쉽게 접근할 수 없다.
효율적인 리소스 관리: 쿠키에는 제한된 양의 데이터만 저장할 수 있으며, 모든 요청에 쿠키 데이터가 포함되어 전송되므로 너무 많은 데이터를 쿠키에 저장하는 것은 비효율적이다. 세션을 사용하면 서버 측에서 훨씬 더 많은 데이터를 관리할 수 있으며, 클라이언트 측에는 세션 ID만 저장하여 효율적인 데이터 관리가 가능하다.