HTTP 쿠키(HTTP cookie)란 웹 서버에 의해 사용자의 컴퓨터에 저장되는 key=value 형식의 작은 크기의 데이터 이다.
인터넷 웹 상에서 상태정보를 클라이언트측(인터넷 웹브라우저)에 저장하여, 서버측에서 필요할 때마다 지속성있게 활용하고자 할 때 사용한다.
HTTP 프로토콜은 기본적으로 Stateless 한 속성을 가지고 있기 때문에, 서버와 클라이언트 간의 연결 유지를 구현하기 위해서 서로를 인식할수 있는 식별 데이터가 필요해졌고 그것이 쿠키 데이터 조각이라고 보면 된다.
세션 관리(Session Management) : 서버 간 일시적인 연결 유지에 이용 (로그인) 예) 로그인 유지, 장바구니
개인화(Personalization) : 웹사이트에 대한 사용자 선호, 테마 등의 세팅 예) 다크모드, 언어 설정
트래킹(Tracking) : 사용자 행동을 기록하고 분석하는 용도 (광고)
최근, 쿠키가 과도하게 트래킹에 사용되어 지나친 광고 수단으로 남용됨에 따라 이를 규제하기 위한 방법 중 하나로 GDPR 개인정보보호 법령이 도입되었다. 이 법령은 웹사이트가 쿠키 수집에 대해 사용자로부터 명시적인 동의를 요구하도록 규정하고 있다.
클라이언트의 쿠키는 전적으로 웹브라우저가 관리하며 브라우저에 종속되어있다.
쿠키 저장: 웹 서버는, HTTP 헤더 내 Set-Cookie:란에 셋팅할 쿠키 관련 정보를 실려 보냄, 웹 브라우저는, 쿠키를 도메인 서버 이름으로 정렬된 쿠키 디렉토리에 저장
브라우저를 통해 서버에 요청을 보내고 서버에서 응답을 할 때 응답에는 데이터와 쿠키데이터를 같이 보내어 브라우저에 저장된다, 그 후 해당 웹사이트에 다시 접속하기 위해 서버에 요청을 할때 쿠키데이터도 같이 보내게 된다
이 데이터로 인해 해당 웹사이트를 닫고 재접속 하여도 로그인이 유지되는 등 편리 기능을 누릴 수 있다
(참고:쿠키는 도메인에 따라 제한됨, 예) 네이버 에서 받은 쿠키데이터는 네이버를 접속할 때만 쿠키를 다시 보냄, 쿠키는 서버에서 정한 기간에 따른 유효기간이 있음)
Cookie (요청 헤더)
HTTP 요청 시 클라이언트에서 서버로 전달하는 쿠키 헤더이다.
서버의 세션 상태를 담은 SessionID 혹은 각종 클라이언트 정보들을 담고 있다.
Set-Cookie (응답 헤더)
서버에서 클라이언트(브라우저)로 전달하는 쿠키 헤더 이다.
클라이언트는 이 정보를 바탕으로 쿠키를 만들어 브라우저에 저장한다.
이 헤더가 포함된 응답을 받으면, 브라우저는 이를 해석하고 해당 쿠키를 저장한다.
여러 개의 쿠키를 보내려면 동일한 응답에 여러 개의 Set-Cookie 헤더를 포함해야 한다.
쿠키는 key=value 형태로 저장되는 문자열로서 여러개의 데이터를 콤마(,)로 열거하여 저장해 구분한다.
쿠키는 유효 기간이나 도메인 등을 설정한 파라미터들을 세미콜론(;)을 통해 열거한다.
아래와 같은 쿠키 데이터인 경우 총 3가지 형태의 쿠키값이 있는 것이다.
예) sessionId=abcde1234; expires=Sat, 26-Dec-2020 00:00:00 GMT; path=/; domain=.google.com; Secure
name=인파; domain=inpa.tistory.com
test=value
쿠키는 key=value 형태로 이루어진 단순한 문자열이지만, 각 쿠키값에 적용되는 쿠키의 유효 기간이나 도메인 설정 등을 파라미터를 통해 추가할 수 있다.
Expires 와 Max-Age 를 통해 만료일을 설정할 수 있다.
MaxAge는 브라우저에서 유지되는 시간을 초 단위로 설정하고, Expires는 쿠키의 유효 일자를 날짜/시간 값으로 설정한다.
expires=Sat, 26-Dec-2020 04:39:21 GMT
구체적인 날짜를 명시, 만료일이 지나면 쿠키는 삭제된다.
반드시 GMT (Greenwich Mean Time) 포맷으로 설정되어야 한다.
max-age=3600
쿠키 유효 시간을 명시 (초 단위)
만일 0이나 음수로 지정할 경우 그 쿠키는 즉시 만료되어 브라우저는 해당 쿠키를 삭제한다.
만료 날짜를 생략하면 브라우저 종료시 까지만 유지되고 이를 세션 쿠키라 부른다.
만료 날짜를 입력하면 해당 날짜까지 유지되고 이를 영속 쿠키라 부른다.
쿠키에 경로를 설정하면, 해당 페이지 경로에서만 쿠키 사용 접근이 가능하다.
해당 경로의 하위 경로까지 모두 포함한다. 그래서 루트 경로(/) 로 설정하면 모든 경로에 쿠키가 유효하다는 뜻이 된다.
path=/home 지정 시
/home/level1 → 접근 가능
/home/level1/level2 → 접근 가능
/hello → 접근불가능 (다른 경로)
path를 입력하지 않으면 루트 경로로 자동 입력 된다. 단, 쿠키의 범위를 좁게 잡을 수록 보안에는 좋다.
쿠키에 도메인을 설정하면, 해당 도메인 페이지에서만 쿠키 사용 접근이 가능하다.
해당 도메인의 서브 도메인까지 모두 포함한다.
domain=example.org 지정 시
.example.org 형태로 저장 (도메인 앞에 점은 서브 도메인도 허용하겠다는 뜻이다)
example.org → 쿠키 접근 가능
www.example.org → 쿠키 접근 가능
도메인을 생략하면 현재 문서 기준 도메인으로만 적용된다.
점이 생략된 도메인으로 저장되어 서브 도메인을 허용하지 않는다.
쿠키 도메인 파라미터를 전혀 다른 도메인으로 설정된 쿠키를 서드 파티 쿠키(Third-party Cookie)라고 불리운다.
서드 파티 쿠키는 구글 애드센스와 같은 스크립트만 등록되어 있다면 여러 개의 사이트에 쿠키를 생성할 수 있다.
예를 들어 사용자가 Example 사이트에 로그인하여 Cookie A가 부여됐다.
Example 웹페이지는 우측에 배너 광고가 표시되는데 이 배너 광고는 Adserver 사이트에서 전달되고 있다고 한다. 이 배너를 통해 사용자의 웹브라우저에 다른 도메인 파라미터를 갖는 Cookie B 가 부여되게 된다.
즉, 사용자가 방문하고 있는 도메인에서 발행되는 Cookie A를 퍼스트 파티 쿠키(First-party Cookie) 이며, 타 도메인에서 발행되는 Cookie B를 서드 파티 쿠키(Third-party Cookie)라고 하는 것이다.
이 서드 파티 쿠키는 주로 타깃 마케팅 광고 목적으로 사용된다.
예를들어 신발 쇼핑몰 사이트를 자주 방문하게 되면 쿠키가 저장되게 되고 구글 애드센스가 이를 가져가 다른 사이트에서의 배너 광고에서 신발 광고가 화면에 나타나는 것이 서드 파티 쿠키를 이용한 원리라고 보면 된다.
활성화하면, HTTPS 사용 시에만 쿠키 정보 전달하며 미적용 시에는 HTTP, HTTPS 구분하지 않는다.
자바스크립트에서 쿠키 사용 접근을 제한한다.
그래서 해커가 자바스크립트로 쿠키를 탈취할수 없어, XSS 공격을 방지할 수 있다.
자바스크립트는 document.cookie 속성을 이용하여 쿠키를 create, delete, read 할 수 있는데 HttpOnly 설정 시 접근이 불가능하다.
서드 파티 쿠키의 보안적 문제를 해결하기 위해 만들어진 기술이다.
XSRF, CSRF 공격을 방지할 수 있다.
요청 도메인과 쿠키 정보 내의 도메인이 다른 크로스 사이트(Cross-site)로 전송하는 요청에 대해서 제한을 둘 수 있다.
SameSite 3가지 속성
None : 쿠키는 크로스 사이트 요청의 경우에도 항상 전송한다. 따라서 보안적으로 SameSite 적용을 하지 않은 쿠키와 다름이 없다.
Strict : 쿠키는 크로스 사이트 요청에는 항상 전송되지 않는다. 가장 보수적인 정책.
Lax : Strict에 비해 상대적으로 느슨한 속성. 몇 가지 예외적인 요청에는 전송하도록 한다.
SameSite=Lax 일때 쿠키가 예외적으로 전송되는 경우는 다음과 같다.
사용자가 <a>
태크를 클릭해서 302 리다이텍트를 하거나, 자바스크립트로 window.location.replace 등으로 인해 자동으로 이루어지는 이동에선 서드 파티 쿠키가 전송된다.
하지만 <iframe>
태그나 <img>
태그를 문서에 삽입함으로서 발생하는 http 요청은 전송을 제한한다. 또한 GET 요청에 대해선 쿠키가 전송되지만, POST 나 DELELTE 요청은 제한된다.
참고로 SameSite 파라미터의 보안 속성을 서드 파티 쿠키에 한하는 것이며, 퍼스트 파티 쿠키는 Lax나 Strict여도 전송된다.
크롬 브라우저는 SameSite 값으로 None을 사용하려면 해당 쿠키는 반드시 Secure 가 설정된 쿠키여야 한다는 정책이 있다. 만일 크롬에서 위 정책을 지키지않고 서버에서 Set-Cookie를 하게 되면 쿠키 자체가 제대로 설정되지 않게 된다.