브라우저 쿠키(Cookies)는 어떻게 저장되고 사용되는 걸까?

브라우저 쿠키의 영속성 저장소와 복호화 과정 분석

브라우저 쿠키는 서버가 사용자 브라우저에 할당하여 생성하거나, 사용자가 DOM에서 직접 만들 수도 있습니다. 그렇다면 이 쿠키들은 과연 어디에 저장되어 영속성을 유지하는 걸까요?


이번 과정은 MacOS 기반, Chromium 브라우저을 사용하는 기준으로 진행했습니다.


크로미움 기반 브라우저의 쿠키는 보통 ~/Library/Application Support/Google/Chrome/[Profile Number]/Cookies 경로에 저장됩니다. 저장 방식은 데이터베이스 형식이며, sqlite3를 통해 쿠키의 저장 상태를 쉽게 살펴볼 수 있습니다.


쿠키 속성값


쿠키는 Chromium 문서에 명시된 기본 설정을 바탕으로 초기에 셋업 됩니다. 그럼 실제로 구글 계정으로 쿠키를 직접 만들어보고 검증해 보겠습니다.


쿠키 생성 및 확인

먼저 개발자 도구(DevTools) 콘솔에서 아래 코드를 입력하여 테스트용 쿠키를 생성합니다.

document.cookie="user=John; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT"


확인:

devTools 쿠키스토리지


실제 저장된 파일 확인

이제 실제 쿠키가 저장된 파일을 열어보겠습니다. 아래 명령어를 실행하면 암호화된 쿠키 값을 CSV 형태로 추출할 수 있습니다.

sqlite3 -header -csv ~/Library/Application\ Support/Google/Chrome/Profile/Cookies '
SELECT name, quote(encrypted_value) AS encrypted_value_blob
FROM cookies
ORDER BY name;
' > cookies_dump.csv


수행결과:


데이터 복호화

추출된 cookies_dump.csv 파일의 encrypted_value_blob 데이터는 암호화되어 있어 바로 읽을 수 없습니다. 이를 복호화하기 위해서는 OS의 키체인(Keychain) 비밀번호를 이용해야 합니다.


복호화 스크립트:

# decrypt_cookies.py
import csv
import subprocess
from Crypto.Cipher import AES
from Crypto.Protocol.KDF import PBKDF2


def get_keychain_password():
cmd = ['security', 'find-generic-password', '-s', 'Chrome Safe Storage', '-a', 'Chrome', '-w']
return subprocess.check_output(cmd).strip()


def derive_key(password):
return PBKDF2(password, b'saltysalt', dkLen=16, count=1003)


def decrypt_value(hex_str, key):
# X'...' 래퍼 제거
hex_str = hex_str.strip()
if hex_str.startswith("X'") and hex_str.endswith("'"):
hex_str = hex_str[2:-1]
if not hex_str:
return ""
raw = bytes.fromhex(hex_str)
# v10 헤더 제거
raw = raw[3:]
iv = b' ' * 16
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = cipher.decrypt(raw)
# PKCS7 패딩 제거
decrypted = decrypted[:-decrypted[-1]]
# Chrome 도메인 바인딩 프리픽스(32바이트) 제거
if len(decrypted) > 32:
decrypted = decrypted[32:]
return decrypted.decode('utf-8', errors='replace')


password = get_keychain_password()
key = derive_key(password)


with open('./cookies_dump.csv', 'r') as f:
reader = csv.DictReader(f)
for row in reader:
blob = row.get('encrypted_value_blob', '')
try:
value = decrypt_value(blob, key)
except Exception as e:
value = f'[ERROR: {e}]'
print(f"{row['name']} → {value}")


복호화 과정 요약

  1. Keychain에서 비밀번호를 꺼낸다.
  2. 비밀번호를 PBKDF2 알고리즘에 넣어서 AES 키를 뽑아낸다.
  3. 그 키로 AES 알고리즘을 돌려 쿠키를 복호화한다.
python3 ./decrypt_cookies.py


결과:


이로써 브라우저가 쿠키를 암호화하여 사용자 로컬 드라이브(데이터베이스 파일)에 저장하고 불러오는 과정을 확인했습니다. 다만, 이 작업은 브라우저의 시작 또는 종료 시점에만 주로 동작합니다.


실제 쿠키 관리 메커니즘

그렇다면 실제 브라우저 실행 중에는 쿠키가 어떻게 관리되고 있을까요?


  1. 브라우저가 시작될 때, 데이터베이스의 쿠키들을 메모리로 로드합니다.
  2. 브라우저가 켜져 있는 동안 발생하는 쿠키 생성, 수정, 삭제는 메모리에서 우선적으로 처리되며, 특정 간격마다 데이터베이스와 동기화됩니다
  3. 브라우저가 종료될 때, 아직 기록되지 않은 메모리상의 최신 데이터들을 데이터베이스에 최종적으로 갱신하고 파일을 닫습니다.


결론

쿠키가 브라우저에서 관리된다는 점은 알고 있었지만, 정확히 어느 물리적 공간에 어떤 방식으로 존재하는지에 대해서는 막연한 혼동이 있었습니다. 이번 과정을 통해 쿠키의 영속성이 로컬 드라이브의 특정 디스크 공간에 암호화된 상태로 저장되어 관리된다는 사실을 직접 확인할 수 있었습니다.


결과적으로 쿠키는 전적으로 클라이언트 단에서 관리되는 데이터가 맞으며, 브라우저가 실행 중일 때는 성능을 위해 메모리에 로드되어 실시간으로 활용되고, 종료 시점에 맞춰 디스크로 동기화되는 메커니즘을 명확히 이해하게 되었습니다. 모호했던 쿠키의 실제 존재 위치와 관리 체계를 직접 검증하며 확실하게 정리할 수 있는 계기가 되었습니다.

-
dinn
dinnAdministrator
Last updated: