3 minute read

쿠키란?

  • HTTP 쿠키는 서버가 사용자의 웹 브라우저에 전송하는 데이터 조각이다.
  • 브라우저는 이 데이터 조각들을 저장할 수 있고, 다음 요청 시에 전송할 수 있으며 방문자의 상태를 저장하는 용도로 사용한다.
  • 특징
    • 이름과 값의 쌍으로 구성된 작은 정보. (아스키) 문자만 가능
    • 서버에서 생성 후 전송, 브라우저에 저장. 유효기간 이후 자동 삭제
    • 서버에 요청시 domain, path(하위경로 포함)가 일치하는 경우에만 자동전송한다.

쿠키의 목적

  1. 세션 관리 (로그인)
    • 쿠키는 웹사이트의 장바구니 기능에서 도입됌, (요즘은 서버 DB에 저장한다.)
    • 쿠키에 UID(고유식별자)를 넣어 사용자가 새 페이지를 방문해도 장바구니를 보여줄 수 있다.
    • 이를 통해 로그인시 사용자에게 UID 가 포함된 쿠키를 생성하고 사용자에게 서비스를 제공한다.
  2. 개인화 (검색 결과 설정, 테마 등)
    • 사용자에게 컨텐츠를 보여주기 위한 정보를 기억하기 위해 사용 가능.
    • ex) 구글 검색 결과수, 사이트내 사용자 테마 설정 등
  3. 트래킹 (사용자 행동)
    • 사용자 접속시, 쿠키가 없으면 사용자가 첫 방문한 페이지라 추정하고 고유한 식별자 생성한다.
    • 요청을 보낼 때마다 쿠키가 전송되는 것을 이용하여 요청시간, 머문 시간 등의 정보를 서보 로그에 저장가능하다.

쿠키 생성 방법

  1. 유저가 서버에 페이 요청.
  2. 서버에서 응답과 함께 Set-Cookie 헤더를 전송.
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Set-Cookie: CookieName1=Example1; Expires=Tue, 27-Nov-2018 02:53:13 GMT
    Set-Cookie: CookieName2=Example2; Expires=Tue, 27-Nov-2018 02:53:13 GMT
    Set-Cookie: JSESSIONID=8EB8434C5776358C84017077E11A3300; Path=/
    Content-Type: text/html;charset=ISO-8859-1
    Content-Language: ko
    Content-Length: 316
    
    • Set-Cookie 는 여러개의 쿠키 전송이 가능하다.
    • 헤더에서는 간단한 name:value 형태로 설정이 가능하다
  3. 유저 에이전트가 Set-Cookie 헤더에서 전달된 값을 가지고 쿠키를 생성하여 저장한다.
  4. 이렇게 생성된 쿠키는 클라이언트가 서버에 요청할 때마다 브라우저가 같이 전송해준다.
  5. 코드에제 (java)
    • 생성
       Cookie cookie = new Cookie("id", "asdf"); // 쿠키 생성
       cookie.setMaxAge(60*60*24); //  유효기간 설정 (초)
       response.addCookie(cookie); // 응답에 쿠키 추가
      
    • 삭제
       Cookie cookie = new Cookie("id", ""); // 변경할 쿠키와 같은 이름 쿠키 생성
       cookie.setMaxAge(0); //  유효기간을 0으로 설정(삭제)
       response.addCookie(cookie); // 응답에 쿠키 추가
      
    • 쿠키 읽어오기
       Cookie[] cookie = request.getCookies(); //쿠키 읽기
       for (Cookie cookie: cookies) {
        String name = cookie.getName();
        String value = cookie.getValue();
        ...
       }
      
  6. @CookieValue annotation @CookieValue({id}) 를 통해 쿠키값을 가져오는것이 가능하다. @CookieValue(“JSESSIONID”) 등을 통하여 session 을 불러오는것이 가능하다.

쿠키의 속성

  1. 도메인
    • Domain 은 쿠키의 스코프를 정의하며 쿠키가 어느 웹사이트에서 만든 것인지 알려준다.
    • 또안 보안상의 이유로 리소스의 최상위 도메인과 하위 도메인만 설정 가능하다.
      • EX) naver.com 은 payco.com 도메인을 가진 쿠키를 생성할 수 없다.
    • 서버에서 정해주지 않으면 쿠키카 생성될 떄의 요청 도메인으로 설정된다.
    • 도메인이 있느것과 없는것도 차이가 존재한다.
      • naver.com에서 쿠키를 만들때 domain을 지정한경우 m.naver.com 같은 서브 도메인 에서도 전송이 가능하다.
  2. Path
    • 도메인과 마찬가지로 스코프를 정의하여 쿠키가 웹사이트 어느경로에서 사용하는 것인지 알려준다.
    • Path가 설정된 경우 Path가 일치하는 경우에만 쿠키를 전송한다.
    • Path를 명시하지 않으면 Set-Cookie 헤더를 전송한 서버의 경로를 사용한다.
  3. Expires/Max-Age
    • Expire 와 Max-Age 는 쿠키의 유효 시간을 나타내는 속성이다.
    • Expire는 날짜를 지정하며 만료시간__이 지나면 __브라우저가 삭제한다.
    • Max-Age는 __유지시간__을 지정하며 쿠키가 받은 시간으로 부터 계산하여 만료된 경우 브라우저가 삭제한다.
  4. Secure
    • Secure는 쿠키의 범위를 보안 채널로 제안하는 속성이다.
    • 유저 에이전트가 요청이 암호화된 연결인 경우에만 쿠키를 보낸다.
  5. HttpOnly
    • HttpOnly는 쿠키의 범위를 HTTP 요청으로 제한한다.
    • HttpOnly가 설정된 경우 클라이언트 사이드 API 로는 쿠키에 접근하지 못한다.

쿠키의 종류

  • 세션 쿠키
    • 세션 쿠키는 클라이언트가 종료되면 삭제된다.
    • Expire나 Max-Age를 명시하지 않으면 클라이언트가 종료될 때 삭제되는 세션 쿠키가 생성된다.
  • Permanent 쿠키
    • Permanent 쿠키는 클라이언트가 종료가 되어도 살아있다.
    • Permanent 쿠키로 사용하고 싶다면. 서버에서 클라이언트로 쿠키를 만들어 보낼때 만료 기한 정보를 쿠키에 담아 보내면 된다.
  • Secure 쿠키
    • 시큐어 쿠키는 암호화된 연결 (HTTPS) 로만 전송이 가능하다.
    • 시큐어 플래그를 추가해서 생성하여 Https 로 정송하기 때문에 쿠키를 열어보는걸 방지할 수 있다.
  • HttpOnly 쿠키
    • 자바스크리브 같은 사이드 API를 통해 접속할 수 없는 쿠키이며 XSS 위협을 없앤다.
      • XSS (Cross-site Scripting) : 공격자가 상대방의 브라우저에 스크립트가 실행되도록 하여 사용자의 세션을 가로채거나, 웹사이트를 변조하고, 악의적 콘텐츠를 삽인하는 행위.
    • 하지만 여전히 XST, XSRF 공격에는 취약하다.
    • HttpOnly 플래그를 쿠키에 추가하여 생성한다.
  • Same-site 쿠키
    • 쿠키를 생성한 도메인과 같은 추처일 떄만 쿠키를 전송한다.
  • third-party znzl
    • 현재 방문하고 있는 사이트가 아닌 다른 사이트의 쿠키.
    • 광고와 같은 외부 웹사이트의 컨텐츠가 있을 때 생성되며 이 쿠키를 이용하여 사용자를 추척하여 광고를 제공하는데 사용한다.
  • 좀비쿠키
    • 지워져도 자동으로 생성되는 쿠키.
    • 쿠키 컨텐츠를 플래시 쿠키, HTML5 웹저장소, 클라이엍느 등에 저장하였다가 쿠키가 없으면 다시 쿠키를 생성한다.

Categories:

Updated: