쿠키와 document.cookie

이수연·2023년 1월 23일
1

자바스크립트

목록 보기
19/19

쿠키

  • 쿠키는 브라우저에 저장되는 작은 크기의 문자열로 RFC 6265 명세에서 정의한 HTTP 프로토콜의 일부
  • 주로 웹서버에 의해 만들어짐
  • 서버가 HTTP 응답 헤더(header)의 Set-Cookie에 내용을 넣어 전달하면, 브라우저는 이 내용을 자체적으로 브라우저에 저장
  • 브라우저는 사용자가 쿠키를 생성하도록 한 동일 서버(사이트)에 접속할 때마다 쿠키의 내용을 Cookie 요청 헤더에 넣어서 함께 전달
  • document.cookie 프로퍼티를 이용하면 브라우저에서도 쿠키에 접근할 수 있음
  • document.cookie는 name=value 쌍으로 구성되어있고, 각 쌍은 ;로 구분함. 이때, 쌍 하나는 하나의 독립된 쿠키를 나타냄
  • document.cookie에 값을 할당하면, 브라우저는 이 값을 받아 해당 쿠키를 갱신함. 이때, 다른 쿠키의 값은 변경되지 않음
 document.cookie = "user=John"; // 이름이 'user'인 쿠키의 값만 갱신함
alert(document.cookie); // 모든 쿠키 보여주기

코드를 실행하면 여러개의 쿠키가 출력되는데, 모든 쿠키를 덮어 씌우지 않고 명시된 쿠키인 user만 갱신된것을 알수 있음

단점

  • encodeURIComponent로 인코딩한 이후의 name=value 쌍은 4KB를 넘을 수 없음
  • 도메인 하나당 저장할 수 있는 쿠키의 개수는 20여 개 정도로 한정되어 있습니다. 개수는 브라우저에 따라 조금씩 다름

path

path=/mypath
  • URL path(경로)의 접두사로, 이 경로나 이 경로의 하위 경로에 있는 페이지만 쿠키에 접근할 수
    있음
  • 절대 경로이어야 하고, 미 지정시 기본값은 현재 경로
  • path=/admin 옵션을 사용하여 설정한 쿠키는 /admin과 /admin/something에선 볼 수 있지만, /home 이나 /adminpage에선 볼 수 없음
  • 특별한 경우가 아니라면, path 옵션을 path=/같이 루트로 설정해 웹사이트의 모든 페이지에서 쿠키에 접근할 수 있도록 하는것이 좋음

domain

domain=site.com
  • 쿠키에 접근 가능한 domain(도메인)을 지정합니다. 다만, 몇 가지 제약이 있어서 아무 도메인이나 지정할 수 없음
  • domain 옵션에 아무 값도 넣지 않았다면, 쿠키를 설정한 도메인에서만 쿠키에 접근할 수 있음.
  • site.com에서 설정한 쿠키는 other.com에서 얻을수 없음
  • 서브 도메인(subdomain)인 forum.site.com에서도 쿠키 정보를 얻을 수 없음

expires와 max-age

  • expires(유효 일자)나 max-age(만료 기간) 옵션이 지정되어있지 않으면, 브라우저가 닫힐 때 쿠키도 함께 삭제됨. 이를 세션 쿠키라함
  • expires 나 max-age 옵션을 설정하면 브라우저를 닫아도 쿠키가 삭제되지 않음 => jwt의 access토큰과 refresh토큰을 이점을 이용해서 구현하는것 같음
  • expires 옵션값을 과거로 지정하면 쿠키는 삭제됨

setCookie(name, value, options)

  • 현재 경로(path=/)를 기본으로, 주어진 name과 value를 가진 쿠키를 설정
function setCookie(name, value, options = {}) {

  options = {
    path: '/',
    // 필요한 경우, 옵션 기본값을 설정할 수도 있습니다.
    ...options
  };

  if (options.expires instanceof Date) {
    options.expires = options.expires.toUTCString();
  }

  let updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);

  for (let optionKey in options) {
    updatedCookie += "; " + optionKey;
    let optionValue = options[optionKey];
    if (optionValue !== true) {
      updatedCookie += "=" + optionValue;
    }
  }

  document.cookie = updatedCookie;
}

// Example of use:
setCookie('user', 'John', {secure: true, 'max-age': 3600});

deleteCookie(name)

  • 만료 기간을 음수로 설정하면 쿠키를 삭제할 수 있음
function deleteCookie(name) {
  setCookie(name, "", {
    'max-age': -1
  })
}

0개의 댓글