김우석 개발자

Cookie

개요 : HTTP 완벽 가이드 책을 읽으며 내용을 정리한 글

쿠키란 무엇인가?

쿠키는 사용 자를 식별하고 세션을 유지하는 방식 중에서 현재까지 가장 널리 사용하는 방식이다. 쿠키는 앞서 설명한 기술들이 가지고 있던 문제점들을 겪지는 않지만, 쿠키만으로 하기 힘든 일에는 앞서 설명한 기술들을 함께 사용하기도 한다.

  • HTTP 헤더
    • FROM 헤더에 사용자의 이메일 주소를 포함시켜서 확인한다.
    • 악의적인 서버가 이메일 주소를 모아서 스팸 메일을 발송하는 문제가 있어서 사용되지 않는다
    • User-Agent 헤더에 사용자가 쓰고 있는 브라우저의 이름과 버전 정보, 어떤 경우에는 운영체제에 대한 정보까지 포함하여 서버에게 알려준다.
    • 이는 특정 사용자를 식별하는 데는 정확성이 높지 않다.
    • Referer 헤더는 사용자가 현재 페이지로 유입하게 한 페이지의 URL을 가리킨다
    • Referer 헤더만으로는 사용자를 식별할 수 없지만, 사용자가 이전에 어떤 페이지를 방문했었는지 알려준다.
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
referer: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
  • 클라이언트 IP 주소
    • 사용자가 확실한 IP 주소를 가지고 있고 그 주소가 바뀌지 않으며, 웹 서버가 요청마다 클라이언트의 IP를 알 수 있다면 문제없이 동작한다.
    • 하지만 IP 주소는 사용자가 아닌, 사용자의 컴퓨터의 주소를 가리킨다. 여러 사람이 같은 컴퓨터를 사용한다면 식별할 수 없다.
    • 많은 인터넷 서비스 제공자(ISP)는 사용자가 로그인하면 동적으로 IP 주소를 할당한다. 로그인한 시간에 따라, 사용자는 매번 다른 주소를 받으므로, 식별할 수 없다.
    • 특정 사용자는 네트워크 주소 변환 방화벽(NAT)을 통해 인터넷을 사용한다. 이 NAT 장비들은 클라이언트의 실제 IP 주소를 방화벽 뒤로 숨기고 내부에서 사용하는 하나의 방화벽 IP 주소로 변환한다.
  • 사용자 로그인
    • 웹 사이트 로그인이 더 쉽도록 HTTP는 WWW-Authenticate와 Authorization 헤더를 사용해 웹 사이트에 사용자 이름을 전달하는 자체적인 체계를 가지고 있다.
    • 한 번 로그인 하면, 다음 요청부터 Authorization 헤더에 그 정보를 기술하여 보낸다.
    • 웹 사이트 로그인은 번거로운 일이다. 예를 들어 김우석이라는 사용자는 사이트를 옮겨다닐 때마다 각 사이트에 로그인을 해야 한다.
    • 더 큰 문제는 김우석이 사이트마다 서로 다른 사용자 id와 비밀번호를 기억해야 한다는 것이다.
    • 곧 김우석은 인터넷 사용을 포기하고 유튜브를 보게 될 것이다.

    https://mdn.mozillademos.org/files/14689/HTTPAuth.png

    Basic 인증의 경우 정보가 노출되기 때문에 정보를 교환할 경우 HTTP 보다 HTTPS를 권장한다.

    • 뚱뚱한 URL
      • 어떤 웹 사이트는 사용자의 URL마다 버전을 기술하여 사용자를 식별하고 추적하였다. 보통 URL은 URL 경로의 처음이나 끝에 어떤 상태 정보를 추가해 확장한다.
      • 사용자가 사이트를 돌아다니면, 웹 서버는 URL에 있는 상태 정보를 유지하는 하이퍼링크를 동적으로 생성한다.
      • 사용자에게 할당된 식별번호(밑에 예의 002-1145265-8016838)를 가 URL 뒤에 붙여서 사용자를 추적한다.
      • 이는 URL이 길고 못생겨지며, 고유의 식별번호로 인하여 공유할 수 없고, 사람마다 다른 URL 때문에 캐시를 사용할 수 없게 되어서 서버에 부하를 가중시킨다.
    
      <a href="/exec/obidos/tg/browse/-/229220/ref=gr_gifts/002-1145265-8016838">All
        Gifts</a><br>
      <a href="/exec/obidos/wishlist/ref=gr_pl1_/002-1145265-8016838">Wish List</a><br>
    
      <a href="http://s1.amazon.com/exec/varzea/tg/armed-forces/-//ref=gr_af_/002-1145265-  8016838">Salute Our Troops</a><br>
      <a href="/exec/obidos/tg/browse/-/749188/ref=gr_p4_/002-1145265-8016838">Free
        Shipping</a><br>
      <a href="/exec/obidos/tg/browse/-/468532/ref=gr_returns/002-1145265-8016838">Easy
        Returns</a>
    

쿠키


쿠키는 사용자를 식별하는 위의 여러가지 종류들과 비교하여 현재까지 가장 널리 사용하는 방식이다. 쿠키는 앞서 설명한 기술들이 가지고 잇던 문제점들을 겪지는 않지만 쿠키만으로는 하기 힘든 일에는 위의 기술들을 함께 사용하기도 한다. 쿠키는 넷스케이프가 최초로 개발했지만, 지금은 모든 브라우저에서 지원한다.

  • 쿠키는 서버가 사용자에게 붙이는 이름표와 같다
    • 처음에 사용자가 웹 사이트에 방문하면 웹 서버는 사용자에 대해서 아무것도 모른다.
    • 웹 서버는 사용자가 다시 돌아왔을 때, 해당 사용자를 식별하기 위한 유일한 값을 쿠키에 할당한다.
    • 쿠키는 어떤 정보도 포함할 수 있지만, 서버가 사용자 추적 용도로 생성한 유일한 단순 식별 번호만 포함하기도 한다. 예를 들어 밑의 그림 같이 서버는 id=”34294”라는 쿠키를 사용자에게 할당한다. 서버는 이 쿠키 값으로 데이터베이스에서 사용자의 정보를 찾는데 사용할 수 있다.
    • 사용자가 나중에 같은 사이트를 방문하면, 브라우저는 서버가 이 사용자에게 할당했던 쿠키를 Cookie 요청 헤더에 기술해 전송한다.

    ../../../../../public/assets/2021-05-18-Web-Cookie/cookie1.png

    웹 서버의 쿠키 할당

    • 브라우저는 쿠키 정보를 저장할 책임이 있는데, 이 시스템을 ‘HTTP 상태 관리 체계’라고 한다.

    ../../../../../public/assets/2021-05-18-Web-Cookie/cookie.png

    Expire / Max-Age 즉 파기되는 시점이 정해진 쿠키는 지속쿠키, 정해지지 않은 쿠키는 세션쿠키라고 한다.

    쿠키의 Domain 속성은 어떤 사이트가 그 쿠키를 읽을 수 있는지 제어할 수 있다

    .ssafy 도메인을 가지고 있는 모든 사이트에 전달한다는 의미이다. lab.ssafy나 ssafy.com과 같이 .ssafy로 끝나는 사이트를 방문하면 다음 Cookie 헤더가 항상 적용된다

    많은 웹 사이트는 광고를 관리하는 업체와 계약한다. 이 광고들은 웹 사이트의 일부인 것처럼 제작되고, 지속 쿠키를 만들어낸다. 같은 광고사에서 제공하는 서로 다른 웹 사이트에 사용자가 방문하면, 브라우저는 앞서 만든 지속 쿠키를 다시 광고사 서버로 전송한다. 이는 지속 쿠키의 도메인이 같기 때문이다. 광고사는 이 기술에 Referer 헤더를 접목하여 사용자의 프로필과 웹 사이트를 사용하는 경로에 대한 방대한 데이터를 구축할 수 있다.

쿠키의 속성값


Set-Cookie:NAME=VALUE; expires=DATE;
path=PATH; domain=DOMAIN_NAME; secure
  • NAME=VALUE
    • 필수 값이다.
    • 특수 문자를 포함하지 않는 문자열이다
    • ex) customer=wooseok
  • expires
    • 형식 ⇒ 요일, DD-MM-YY HH:MM:SS GMT
    • expires를 명시하지 않을 경우 세션이 끝날 때 파기됨
  • domain
    • 브라우저는 이 속성에 기술된 도메인을 사용하는 서버 호스트 명으로만 쿠키를 전송한다.
    • ‘.com’, ‘.edu’와 같은 형식의 도메인을 기술하는 것을 방지하고자, 두 개에서 세 개 영역을 가지는 도메인을 기술해야 한다.
    • 명시되어 있찌 않은 경우 Set-Cookie 응답을 생성한 서버의 호스트 명을 기본값으로 사용
  • path
    • 서버에 있는 특정 문서에만 쿠키를 할당할 수 있다.
    • ex) path=/image
  • secure
    • 이 속성이 포함되어 있으면 쿠키는 HTTP가 SSL 보안 연결을 사용할 때만 쿠키를 전송한다
같은 카테고리의 글