Session, Cookie #
HTTP Session #
HTTP는 클라이언트와 서버 사이의 통신을 할 때마다 TCP 연결이 이루어져야 하는 비연결지향성(connectionless)과 연결이 끊어진 뒤에는 상태 정보가 유지되지 않는 무상태성(stateless)이라는 특징을 가집니다.
이러한 성질을 보완하기 위해서 세션(session)이란 개념이 등장했는데, 클라이언트와 서버 사이의 논리적인 연결이자 서버 쪽 휘발성 메모리에 저장되는 클라이언트 관련 데이터를 가리킵니다.
세션을 사용하면 세션의 만료시간이 지나거나 인위적으로 제거될 때까지는 기존 통신을 유지할 수 있고 과거에 연결되었던 클라이언트의 정보를 DB에 저장하여 사용자별 맞춤형 서비스를 제공할 수 있게됩니다.
서버는 여러 개의 세션들을 관리하기 위해서 세션별로 고유한 ID를 부여합니다.
Cookie #
세션ID로 클라이언트를 구분하려면 각 클라이언트가 리소스를 요청할 때마다 자신의 ID를 서버에게 알려주어야 하는데 이 부분을 구현하는 방법은 대표적으로 쿠키(cookie)가 있습니다.
정의 #
서버에서 특정 클라이언트를 구분하기 위한 세션정보(세션ID, 이름, 값, 쿠키유지기간, 경로정보 등)가 담겨있는 key-value pair 형식의 텍스트 파일로 클라이언트별 디스크에 저장됩니다.
INFO
하나의 서버는 다수 도메인들을 운영할 수 있기 때문에 물리적인 서버가 아닌 개별 도메인이 쿠키를 제공하는 cookie jar입니다.
그래서 쿠키는 "도메인 단위로 클라이언트에게 할당되는 세션ID" 라고도 정리할 수 있습니다.
쿠키 한 개의 최대/최소 크기(Bytes)와 디스크에 저장할 수 있는 쿠키들의 최대/최소 개수은 브라우저마다 다르지만 일반적인 환경에서 적용되는 규칙들은 다음과 같습니다.
- 쿠키 한개 크기 ≤ 4096B, 만일 초과하면 쿠키가 저장되지 않는다.
- 도메인에서 생성할 수 있는 쿠키 개수 ≤ 20개
- 클라이언트에 저장할 수 있는 개수 ≤ 300개
TIP
가끔 로컬에서 개발을 하다가 페이지가 작동하지 않을 때가 있는데 브라우저별 저장되는 쿠키용량을 초과했을 때 나타나는 현상일 수도 있습니다.
쿠키들을 모두 제거하고 새로고침하면 원래대로 돌아오기도 합니다.
세션 정보는 서버 단 middleware에서 쿠키 단위로 관리할 수 있고 동일한 브라우저 탭/창 사이에서 쿠키를 공유할 수 있습니다.
통신절차 #
쿠키를 사용한 통신절차는 다음과 같습니다.
- 클라이언트가 서버에 처음으로 요청하면 서버에서 쿠키를 생성하여 DB에 저장하고 서버가 리소스와 함께 쿠키를 전송한다.
- 클라이언트(브라우저, 웹 크롤러 등 User Agent)는 쿠키를 로컬에 저장한다.
- 그 뒤로 동일한 도메인으로 요청을 전송할 때마다 동일한 쿠키도 같이 보낸다.
- 서버에서 쿠키에 저장된 세션ID를 이용하여 클라이언트가 누구인지 파악한다.
- 클라이언트의 상태에 알맞는 정보로 응답한다.
활용예시 #
쿠키는 보통 아래와 같은 상황에서 자주 활용됩니다.
1. Session Management #
웹 사이트로의 로그인 여부를 확인할 수 있습니다.
2. Personalization #
클라이언트별 선호도 정보를 기반으로 맞춤형 광고를 보여줄 수 있습니다.
3. Tracking #
쇼핑 사이트의 경우, 쿠키를 사용하여 사용자의 찜목록이나 장바구니 정보(과거 상태정보)를 불러와서 쇼핑을 계속할 수 있도록 서비스를 제공합니다.
4. Authentication #
두 HTTP 요청이 동일한 브라우저에서 왔는지 판단하여 중복 로그인을 방지할 수 있습니다.
종류 #
쿠키의 종류를 정리하면 다음과 같습니다.
1. Session Cookie #
브라우저 가상 메모리에 저장되기 때문에 마지막 세션이 종료될 때 같이 삭제되는 쿠키입니다.
동일한 브라우저의 다수 탭이나 창에서 동일한 도메인에 접속하면 쿠키를 공유할 수 있어서 중복 로그인도 가능해집니다.
2. Persistent Cookie #
쿠키를 생성할 때 지정한 만료날짜/시간이 될 때까지 반영구적으로 디스크에 저장되는 쿠키입니다.
3. Httponly Cookie #
쿠키를 생성한 서버만 쿠키를 읽을 수 있는 특별한 케이스입니다.
해당 쿠키는 클라이언트 script(document.cookie
)에서 접근하지 못하도록 차단하여 XSS 공격에 의해서 탈취되지 않도록 도와주기 때문에 JWT을 저장할 때 활용할 수 있습니다.
4. Secure Cookie #
오직 HTTPS scheme을 사용하는 도메인으로만 전송할 수 있는 쿠키로, 쿠키를 암호화하여 전송하기 때문에 보안을 강화할 수 있습니다.
5. Zombie Cookie #
영화에서 나오는 좀비처럼 사용자가 브라우저에서 삭제해도 다시 살아나는 쿠키입니다.
과거에는 사이트 방문자들의 행동패턴에 관한 지속적인 데이터를 확보하기 위해 사용되었지만 사생활 침해 논란이 많았습니다.
INFO
2013년에 유출된 미국 NSA 문서에 따르면 Tor Network 사용자들을 추적하기 위한 목적으로 zombie cookie를 사용했다고도 합니다.
6. First-party Cookie #
클라이언트가 방문한 사이트의 JS 코드 또는 사이트를 운영하는 도메인에 의해서 생성되는 쿠키로, 사이트 방문자들의 id/pw, 기호, 행동패턴 등의 정보를 추적하고 수집하여 더 나은 UX를 제공하기 위한 목적으로 활용됩니다.
자동 로그인, 장바구니, 찜목록 등과 같은 서비스에서 사용됩니다.
7. Third-party Cookie #
first-party cookie처럼 사용자들의 온라인 활동에 관한 정보를 추적하고 수집하기 위한 쿠키지만 현재 이용하고 있는 사이트가 아닌 전혀 다른 도메인에 의해서 생성된다는 차이점이 있습니다.
주로 온라인 광고에서 많이 활용되는데 사용자가 특정 사이트를 방문하여 제3의 도메인에서 운영하는 광고가 화면에 노출되면 쿠키가 저장됩니다.
그 때부터 동일한 광고가 있는 어떤 사이트를 방문하던지 항상 따라다니면서 스토커처럼 정보를 수집합니다.
사용자 기호에 적합한 컨텐츠를 제공할 수 있다는 기능적 장점이 있지만 사생활 침해라는 윤리적 문제를 내포하고 있습니다.
first/third-party cookie 허용여부는 브라우저 설정으로 제어할 수 있으므로 향상된 UX와 사생활 보호 사이의 trade-off를 잘 따져야 합니다.
INFO
현대 브라우저들 중에는 third-party cookie를 default로 허용하는 곳도 있고 허용하지 않는 곳이 섞여있는데, Chrome은 2022년 즈음부터 default로 차단한다고 합니다.
만일 third-party cookie를 사용하고 싶지 않으면 VPN을 사용하여 내 기기 대신 다른 원격서버에 쿠키를 저장할 수도 있습니다.