쿠키란 무엇인가요?
쿠키란 무엇일까?
서버가 브라우저에 저장해두고 다시 받아오는 데이터, 또는 이러한 기술
이때 핵심은 데이터를 브라우저에 저장해둔다는 것인데
어차피 다시 받아올 데이터 그냥 서버에 저장해두면 될 것을, 왜 굳이 브라우저에 저장해두는 것일까?
쿠키를 왜 사용할까?
오늘날에는 서버 장비의 가격이 저렴하고 다양한 클라우드 서비스를 사용할 수 있지만 과거에는 그렇지 못했다.
예를 들어 사용자 한 명당 1KB의 데이터를 저장해두어야 한다고 할 때
사용자가 백 만 명만 되어도 1GB의 저장공간이 필요하게 되는데,
서버 장비의 가격이 비싸고 클라우드 서비스가 존재하지 않았던 과거에는 서버가 이를 오롯이 감당하기란 어려웠다.
이를 해결하기 위해 데이터 일부는 클라이언트가 저장하도록 하였는데, 이것이 곧 쿠키인 것이다.
이렇게 시작된 쿠키는 오늘날 세션 관리, 개인화, 추적 등에 사용된다.
- 세션 관리: 쿠키를 통해 사용자를 식별하고 사용자의 정보를 불러온다.
- ex) 로그인 정보, 기호 정보
- 개인화: 쿠키를 통해 사용자에 맞춰 세션을 개인화한다.
- ex) 맞춤 광고, 맞춤 언어
- 추적: 쿠키를 통해 사용자의 행동을 추적하고 분석한다.
- ex) 사용자가 과거에 구경한 제품을 추적, 분석하여 다른 제품을 추천한다.
- ex) 사용자가 페이지를 방문한 횟수, 페이지에 잔류한 시간 등을 분석한다.
쿠키를 어떻게 사용할까?
서버와 브라우저는 HTTP 통신 시 HTTP 헤더에 담아 쿠키를 주고 받게 되는데, 구체적인 과정은 다음과 같다.
1. 클라이언트 → 서버: 요청 전송
GET /index.html HTTP/1.1
Host: www.test.com
예를 들어 브라우저가 서버에게 index.html을 HTTP 요청하였다고 해보자.
이때 서버의 주소는 www.test.com이다.
2. 서버 → 클라이언트: Set-Cookie 응답 헤더에 쿠키 담아 전송
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: a=1
Set-Cookie: b=2
서버가 브라우저에게 index.html과 함께 쿠키를 HTTP 응답한다.
이때 쿠키는 Set-Cookie HTTP 응답 헤더에 이름=값 의 형태로 존재하게 된다.
Set-Cookie 응답 헤더는 하나의 쿠키만 담을 수 있으므로 여러 쿠키를 전송해야할 경우 여러 헤더가 필요하다.
서버가 브라우저에게 쿠키를 전송하는 과정은 한 번 일어난다.
3. 클라이언트: 클라이언트 컴퓨터 하드디스크에 쿠키 저장
서버로부터 전송받은 쿠키는 클라이언트 컴퓨터 하드디스크에 저장된다.
4. 클라이언트 → 서버: Cookie 요청 헤더에 쿠키 담아 전송
GET /index.html HTTP/1.1
Host: www.test.com
Cookie: a=1; b=2
이후 브라우저가 동일한 서버에 접속할 때 쿠키와 함께 HTTP 요청한다.*
이때 쿠키는 Cookie HTTP 요청 헤더에 존재하게 되는데,
Cookie 요청 헤더는 여러 개의 쿠키를 담을 수 있으므로 여러 쿠키를 전송해야할 경우 ;로 구분한다.
브라우저가 서버에게 쿠키를 전송하는 과정은 일정 시간동안 반복해서 일어난다.**
5. 서버: 쿠키 사용
브라우저로부터 전송받은 쿠키는 세션 관리, 개인화, 추적 등에 사용된다.
* 기본적으로는 브라우저가 www.test.com에 머무르는 한 /index.html을 방문하든 /about.html을 방문하든 서버에 동일한 쿠키를 전송하지만, Path 속성을 사용하면 하나의 서버 내에서도 경로에 따라 서로 다른 쿠키를 전송할 수 있다.
** 이때 이 일정 시간은 Set-Cookie 응답 헤더의 Expires 속성 또는 Max-Age 속성을 따른다. Expires 속성은 종료 시점을, Max-Age 속성은 유효 기간을 나타내는데, 종료 시점 또는 유효 기간이 명시되어 있는 영속 쿠키는 종료 시점 또는 유효 기간까지, 명시되어 있지 않은 세션 쿠키는 세션이 종료될 때까지 반복적으로 전송된다.
쿠키는 어떻게 저장될까?
앞서 쿠키는 클라이언트 컴퓨터 하드디스크에 저장된다고 하였으니 직접 확인해보자.
Chrome 브라우저의 경우 C:\Users\minha\AppData\Local\Google\Chrome\User Data\Default\History에 쿠키를 저장하고 있었다.
SQLite로 History 데이터베이스를 조회해보았다.

visits 테이블을 조회해보았다.

쿠키는 어떤 한계를 가질까?
하지만 이러한 쿠키는 유실 가능성, 변조 가능성, 도난 가능성의 한계를 가진다.
유실 가능성
대부분의 브라우저가 쿠키 삭제 기능을 지원하고 일반 사용자도 컴퓨터 내 쿠키 저장 위치에 쉽게 접근할 수 있다는 점에서
쿠키는 사용자에 의해 삭제되고 유실될 가능성이 높다.
따라서 유실되어서는 안 되는 중요한 데이터는 쿠키가 아닌 다른 방법으로 저장해야 한다.
변조 가능성
개발자 도구의 Application 탭에서 웹 사이트별로 저장되어 있는 쿠키를 쉽게 확인하고 변경할 수 있다는 점에서
쿠키는 변조될 가능성이 높고, 따라서 서버는 브라우저가 전송한 쿠키의 유효성을 검증해야 한다.

도난 가능성
쿠키는 일반 사용자의 컴퓨터에 저장되어 온갖 해킹의 위험에 노출되어 있다는 점에서 도난될 가능성이 높다.
따라서 개인 정보와 같이 민감한 데이터는 쿠키가 아닌 다른 방법으로 저장해야 한다.
이러한 쿠키의 한계를 극복하기 위해 쿠키의 보안 속성을 사용하거나 웹 스토리지 기술을 사용할 수 있다.
보안 속성
- Secure 속성: Set-Cookie 응답 헤더에 명시되어 브라우저가 HTTPS 프로토콜 상에서만 서버에게 쿠키를 전송할 수 있도록 한다. 네트워크 상에서 쿠키가 탈취되는 것을 방지할 수 있다.
- HttpOnly 속성: Set-Cookie 응답 헤더에 명시되어 브라우저에서 JavaScript의 Document.cookie 객체를 통해 접근할 수 없도록 한다. 서드 파티 JavaScript 코드가 쿠키에 접근하는 것을 제한할 수 있다
웹 스토리지 기술
- 로컬 스토리지
- 세션 스토리지
다음 자료를 공부하여 정리한 글로, 아직 많이 부족해 틀린 내용이 있을 수도 있습니다.
혹시 있다면 댓글로 알려주세요. 수정하고 더 공부해나가겠습니다-