쿠키는 웹 브라우저에 저장되는 데이터로 서버와 클라이언트 간의 상호작용이 일어날 때 사용자를 식별하는데 사용됩니다.
HTTP는 비연결성, 무상태의 특징을 갖고 있으므로 사용자를 식별할 정보를 저장할 수 없기 때문에 쿠키를 사용하여 매번 번거로운 인증 절차를 하지 않고도 사용자를 구별할 수 있게 되었습니다.
쿠키를 통해 웹 사이트에서 사용자를 식별함으로써 이전에 사용자의 활동 내역(즐겨찾는 탭, 장바구니, 오늘 클릭한 상품 등)을 보여줄 수 있습니다.
브라우저에서 서버로 요청을 전송할 때 그 요청에 대한 응답 헤더에 Set-Cookie가 포함되어 있으면 브라우저는 그 데이터를 저장하게되고, 이 데이터가 쿠키가 됩니다.
set-cookie: country=korea
응답 헤더에 위와 같이 Set-Cookie 헤더가 포함된 경우, Country라는 키에 korea라는 값이 들어간 데이터가 저장되게 됩니다.
그리고 브라우저에서 쿠키를 담아서 서버에 요청할 때는 헤더에 Cookie를 포함시켜서 전송하게 되고, 서버는 이것을 읽어서 사용자를 식별하고 필요한 곳에 사용할 수 있게 됩니다.
cookie: country=korea
이렇게 쿠키를 주고받게 되는데, 이 쿠키에 세션 ID를 넣어서 사용자를 식별하는 방식이 가장 많이 사용되는 방식입니다.
즉, 쿠키의 생성과 사용과정을 간략하게 설명하면 아래와 같습니다.
쿠키는 key와 value로 이루어져 있으며, 만료기간, 도메인, 경로 등의 정보를 가지고 있습니다.
여기서 중요한건 도메인입니다.
쿠키는 유효한 사이트를 명시하기 위해 도메인을 설정해놓게 되는데,
set-cookie: counrty=korea; Domain=127.0.0.1
위와 같이 도메인을 명시해놓게되면, 이 쿠키는 해당 도메인에서만 유효하게 됩니다.
즉, 127.0.0.1을 대상으로 한 요청에만 counrty 쿠키가 전송되게 되는 겁니다.
(별도의 명시가 없다면 기본값으로 쿠키를 보낸 서버의 도메인으로 설정됩니다)
위에서 말한 도메인을 기준으로 First-party cookies와 Third-party-cookies가 나뉘게 됩니다.
Thrid-pary-cookies: 사용자가 접속한 페이지와 다른 도메인으로 전송하는 쿠키. 즉, Referer 헤더와 쿠키에 설정된 도메인이 다른 쿠키입니다.
서드파티 쿠키는 서로 다른 도메인으로도 계속해서 전송되기 때문에 사용자를 추적하며 알맞는 광고를 제공할 수 있으므로 애드테크 회사들에서 아주 유용하게 사용하고 있다고 합니다.
(출처: 블로터)
쿠키에 별도의 설정을 하지 않으면, 브라우저는 모든 HTTP 요청에 대해서 쿠키를 전송하게 됩니다. 이러한 특성으로 인해 서드파티 쿠키는 CSRF 공격에 취약할 수 밖에 없습니다.
CSRF 공격의 과정을 설명하면 아래와 같습니다.
1. 쿠키로 사용자 인증을 수행하는 사이트를 공격 target으로 선정한다.
2. 피해자는 이미 공격 대상 사이트에 로그인 되어 있어서 브라우저에 쿠키가 있는 상태이다.
3. 해커는 피해자에게 피싱을 통해 특정 링크(공격 target과는 다른 도메인)를 누르게 한다.
4. 링크를 누르면 공격 target 사이트로 해커가 조작한 HTTP 요청을 보내게 된다.
5. 이 요청에는 피해자의 쿠키가 포함되어 있으므로 해커가 의도한 동작이 실행되게 된다. (ex. SNS에 의도하지 않은 광고, 선정적 게시물 게시)
이러한 문제를 해결하기 위해 SameSite라는 기술이 나오게 되었습니다.
First-party-cookies: 서드파티 쿠키와 반대로 사용자가 접속한 페이지와 같은 도메인으로 전송되는 쿠키입니다.