Cookie를 관리하는 객체 만들기 위해 Cookie API를 학습하게 되었다.
Cookie를 파싱하기 위해선, Cookie의 특성을 알아야한다.
cookie는 Client에 저장되는 key=value; 형태의 string이다.
Cookie는 아래와 같이 생겼다.
name=value; expires=date; path=path; domain=domain; secure
name=value;
expires=date;
path=path;
domain=domain;
secure
SameSite
즉, Cookie는 아래와 같이 생겼다.
username=pengoose; expires=Fri, 31 Dec 2023 23:59:59 GMT; path=/; domain=pengoose.dev; secure
어떻게 생겼는지 알았으니 parsing은 간단하다!
쿠키를 파싱하고 저장하려면 일단 가져오고(getter) 저장(setter)하는 방법을 알아야한다. WebAPI에서 제공하는 getter와 setter는 다음과 같다.
let myCookies: string = document.cookie;
document.cookie = "username=pengoose; expires=Fri, 31 Dec 2023 23:59:59 GMT; path=/; domain=pengoose.dev; secure"; // 파싱이 끝난 쿠키!
그 이외 필요한 부분은 전부 이 부분에 있다!
> Docs
이제 알아야 하는 것은 다 깨우쳤다. Cookie를 관리하는 객체를 만들어보자! 🥳
export class Cookie {
// getter
get(name: getterNameProps): getterReturn {
const cookies = document.cookie.split('; ');
for (let cookie of cookies) {
const [cookieName, cookieValue] = cookie.split('=');
if (decodeURIComponent(cookieName) === name)
return decodeURIComponent(cookieValue);
}
return null;
}
// setter
set(
name: setterNameProps,
value: setterValueProps,
options: setterOptionProps = {}
): setterReturn {
let newCookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
if (options.path) newCookie += `path=${options.path};`;
if (options.domain) newCookie += `domain=${options.domain};`;
if (options.secure) newCookie += `secure;`;
if (options.sameSite) newCookie += `SameSite=${options.sameSite};`;
if (options.expires)
if (Object.prototype.toString.call(options.expires) === '[object Date]')
newCookie += `expires=${options.expires.toUTCString()};`;
document.cookie = newCookie;
}
}
cookie를 관리할 수 있도록 getter와 setter를 작성하도록 하였다! :)
react-cookie와 같이 의존성 모듈을 쓰기보단, 공식문서를 보고 직접 구현해보며 간단히 만들어보기 좋은 부분인 것 같다.
일단 공식문서 들어가서 읽어보자.
SameSite는 쿠키가 크로스 사이트 요청과 함께 전송되는 방식에 제한을 거는데 사용되는 속성이다. CSRF와 같이 피싱사이트의 피해를 방지하는데 사용할 수 있다.
쿠키는 오직 동일한 사이트에서 발생한 요청에 대해서만 전송된다. 사용자가 현재의 사이트에서 링크를 클릭하여 다른 사이트로 이동할 때, 이 쿠키는 전송을 방지한다!
사용자가 "다른 사이트에서 링크를 클릭하여 현재 사이트로 이동하는 경우", 쿠키가 전송된다. Strict보다 덜 제한적인 선택으로, 보편적으로 사용되는 설정이다.
모든 크로스 사이트에 쿠키가 전송된다. 이 설정을 사용할 때는 보통 Secure 속성도 함께 설정하여 쿠키가 HTTPS를 통해서만 전송되도록 한다.
document.cookie = "key=value; SameSite=Strict"; // Strict 설정!
document.cookie = "key=value; SameSite=Lax"; // Lax 설정!
document.cookie = "key=value; SameSite=None; Secure"; // None 설정!(HTTPS 전송 필요)