인터넷을 사용하다 보면 다음과 같이 쿠키에 대한 알림창을 자주 접할 수 있다.
쿠키란 무엇이고, 왜 존재하는 것일까?
https://ko.wikipedia.org/wiki/HTTP_%EC%BF%A0%ED%82%A4
HTTP 쿠키(HTTP cookie)란 웹 서버에 의해 사용자의 컴퓨터에 저장되는, '이름을 가진 작은 크기의 데이터'이다. 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 사용자의 웹 브라우저를 통해 인터넷 사용자의 컴퓨터나 다른 기기에 설치되는 작은 기록 정보 파일을 일컫는다. 쿠키, 웹 쿠키, 브라우저 쿠키라고도 한다. 이 기록 파일에 담긴 정보는 인터넷 사용자가 같은 웹사이트를 방문할 때마다 읽히고 수시로 새로운 정보로 바뀐다. 이 수단은 넷스케이프의 프로그램 개발자였던 루 몬툴리가 고안한 뒤로 오늘날 많은 서버 및 웹사이트들이 브라우저의 신속성을 위해 즐겨 쓰고 있다.
위키백과에 따르면, 쿠키는 간단히 말해 웹 서버에 의해 사용자의 컴퓨터에 저장되는 '이름을 가진 작은 크기의 데이터'이다.
정의만 봐선 와닿지 않으니, 이제부터 쿠키에 대해 직접 확인해보겠다.
쿠키는 일반적으로 웹 서버와 웹 브라우저를 거쳐 사용자의 컴퓨터에 데이터베이스 파일 형태로 저장된다.
Google Chrome의 경우
C:\Users\사용자명\AppData\Local\Google\Chrome\User Data\Default\Network\Cookies
경로에서 확인할 수 있다.
import sqlite3
# 쿠키 파일 경로
cookie_db_path = r'C:\Users\사용자명\AppData\Local\Google\Chrome\User Data\Default\Network\Cookies'
# 데이터베이스 연결
conn = sqlite3.connect(cookie_db_path)
cursor = conn.cursor()
# 테이블 정보 조회
cursor.execute("PRAGMA table_info(cookies)")
columns = cursor.fetchall()
# 결과 출력
for column in columns:
print(column)
# 연결 종료
conn.close()
해당 파일을 직접 열어 테이블 구조를 확인하기 위해 간단한 Python 코드를 작성해 봤다.
참고로 SQLite는 서버가 아닌 응용 프로그램에 넣어 사용하는 비교적 가벼운 DBMS이며,
Python은 표준 라이브러리로 SQLite에 대한 인터페이스를 제공한다.
(또한 excute 함수의 인자를 "SELECT * FROM cookies" 쿼리로 바꿔 쿠키를 직접 확인할 수 있다.)
(0, 'creation_utc', 'INTEGER', 1, None, 0)
(1, 'host_key', 'TEXT', 1, None, 0)
(2, 'top_frame_site_key', 'TEXT', 1, None, 0)
(3, 'name', 'TEXT', 1, None, 0) # 중요
(4, 'value', 'TEXT', 1, None, 0) # 중요
(5, 'encrypted_value', 'BLOB', 1, None, 0)
(6, 'path', 'TEXT', 1, None, 0)
(7, 'expires_utc', 'INTEGER', 1, None, 0)
(8, 'is_secure', 'INTEGER', 1, None, 0)
(9, 'is_httponly', 'INTEGER', 1, None, 0)
(10, 'last_access_utc', 'INTEGER', 1, None, 0)
(11, 'has_expires', 'INTEGER', 1, None, 0)
(12, 'is_persistent', 'INTEGER', 1, None, 0)
(13, 'priority', 'INTEGER', 1, None, 0)
(14, 'samesite', 'INTEGER', 1, None, 0)
(15, 'source_scheme', 'INTEGER', 1, None, 0)
(16, 'source_port', 'INTEGER', 1, None, 0)
(17, 'last_update_utc', 'INTEGER', 1, None, 0)
(18, 'source_type', 'INTEGER', 1, None, 0)
(19, 'has_cross_site_ancestor', 'INTEGER', 1, None, 0)
쿠키는 다양한 속성을 가지고 있으며, 그중 가장 중요한 것은 name (이름)과 value (값)이다.
이렇듯 쿠키는 name = value 쌍으로 구성되는 데이터임을 알 수 있다.
또한 creation_utc (쿠키 생성 시간) 속성과 expires_utc (쿠키 만료 시간) 속성을 확인할 수 있다.
이를 통해 쿠키는 수명이 존재하는 데이터임을 알 수 있다.
다음으로는 쿠키가 왜 존재하는지에 대해 알아보자.
https://wingunkh.tistory.com/entry/HTTP%EC%9D%98-%ED%8A%B9%EC%A7%95
앞선 게시글에서, HTTP는 Stateless 프로토콜임을 알 수 있었다.
서버가 HTTP 요청을 보낸 클라이언트의 상태를 기억하지 않는다면, 어떻게 로그인 세션 등이 유지될 수 있는 것일까?
이러한 원리의 중심에 바로 쿠키가 있다.
HTTP/1.1 200 OK
---
생략
---
Set-Cookie: sessionID=abc123
이렇게 서버에서는 Set-Cookie HTTP 헤더를 통해 클라이언트에게 쿠키를 전달하며,
GET /example HTTP/1.1
---
생략
---
Cookie: sessionID=abc123
클라이언트는 응답받은 쿠키를 저장한다.
이후 클라이언트는 HTTP 요청 시 Cookie 헤더를 통해 쿠키를 함께 서버로 전달한다.
이러한 과정 덕분에 로그인 세션이 유지될 수 있는 것이다.
즉, 쿠키는 Stateless 프로토콜인 HTTP의 특성을 보완하기 위해 존재한다고 설명할 수 있다.
마지막으로 쿠키의 한계에 대해 알아보자.
쿠키는 보안에 취약하다는 한계가 있다.
이를 보완하기 위해 서버 측에서는 다양한 헤더를 사용한다.
HTTP/1.1 200 OK
---
생략
---
Set-Cookie: sessionID=abc123; Secure; HttpOnly; SameSite=Strict
1. Secure : 쿠키가 HTTPS 통신에서만 전송되도록 보장
2. HttpOnly : JS 등 스크립트에서 쿠키에 접근할 수 없도록 하여 XSS (Cross-Site Scripting) 공격 방지
3. SameSite : 키가 동일한 사이트의 요청에만 전송되도록 하여 XSRF (Cross-Site Request Forgery) 공격 방지
Reference
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard
'네트워크' 카테고리의 다른 글
웹 캐시란? (0) | 2024.07.17 |
---|---|
HTTP API - 컬렉션과 스토어 (0) | 2024.07.13 |
HTTP 메서드 속성 (0) | 2024.07.11 |
HTTP 메시지 구조 (0) | 2024.07.10 |
HTTP의 특징 (0) | 2024.07.10 |