[JS] ๐ช ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฟ ํค(Cookie) ๋ค๋ฃจ๊ธฐ
Cookie๋?
Cookie๋ ๋ฐ์ดํฐ์ด๋ฉด์, ์ฐ๋ฆฌ๊ฐ ํ์ฌ ์ฌ์ฉํ๋ ์ปดํจํฐ์ ์์ ํ ์คํธํ์ผ๋ก ์ ์ฅ๋์ด์๋ ๊ฒ์ด๋ค.
โ์ด๋ค ์ฌ์ดํธ์ ์ ๊ทผ์ ํ๊ณ 'ํ๋ฃจ ๋์ ์ด ์ฐฝ์ ๋ณด์ง ์๊ธฐ'๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ๋ณธ์ ์ด ์๋๊ฐ? ์๋๋ฉด, ๋ก๊ทธ์ธ์ ์ํด ๋ก๊ทธ์ธ ์ ๋ณด ์ ์ฅ, ์๋ ๋ก๊ทธ์ธ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋ณธ์ ์๋๊ฐ?
์ฌ์ค์ ๋ธ๋ผ์ฐ์ ๋ ๋ด์ฉ์ ๊ธฐ์ตํ ๊ณต๊ฐ์ด ์๋ค. ๋ฐ๋ผ์ ๊ทธ๋ฌํ ๊ฒ์ ๊ธฐ์ตํ๋๋ก ๋์์ฃผ๋ ๊ฒ์ด ์ฟ ํค์ด๋ค. ์ฟ ํค๋ฅผ ์์๋ณด๊ธฐ ์ , ์ฟ ํค๊ฐ ์ ์ฅ๋๋ ๋ฐฉ์์ key : value ๋ฐฉ์์์ ๊ธฐ์ตํด๋์.
- ex) username = ํ๊ธธ๋
๋ธ๋ผ์ฐ์ ๊ฐ ์น ํ์ด์ง๋ฅผ ์๋ฒ๋ก๋ถํฐ ์์ฒญํ๊ฒ๋๋ฉด, ์ด ํ์ด์ง์ ์ํ ์ฟ ํค๋ค์ด ์ถ๊ฐ๋ก ์์ฒญ๋๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ํตํด ์ ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๋ ํ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๊ฐ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒ์ด๋ค.
๐ก ์ฟ ํค์ ์ธ์ ์ ์ฐจ์ด๋?
์ฟ ํค๋ ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๋ฐ์ดํฐ๋ฅผ ๋น์ฐ๊ฑฐ๋ ๊ธ์งํ์ง ์๋๋ค๋ฉด ๊ณ์ํด์ ์ ์ง๊ฐ ๋๋ค.
์ด์ ๋ฌ๋ฆฌ ์ธ์ ์ ์ฅ์์ ๊ฒฝ์ฐ ๋ฐฉ๋ฌธ์๊ฐ ์ ์ํด ์ธ์ ์ด ๋ฐ์ํ๊ณ ์ง์ ๋ ์๊ฐ์ด ์ง๋ ์ธ์ ์ด ์ข ๋ฃ๋๋ฉด ์ ์ฅ์์ ๋ด์ฉ๋ ์ฌ๋ผ์ง๊ฒ ๋๋ค๋ ์ ์ด ์ฐจ์ด์ ์ด๋ค.
๐ก ๋ธ๋ผ์ฐ์ ์์ ์ฟ ํค ํ์ธํ๋ ๋ฒ
โํฌ๋กฌ์์ ์ฟ ํค ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ฐ์๋๊ตฌ(F12) ์์ Application ํญ Cookies ์์ ํ์ธํ๋ฉด ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ก Cookie ๋ค๋ฃจ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ๋ document.cookie ์์ฑ์ ์ด์ฉํ์ฌ ์ฟ ํค๋ฅผ create, delete, read ํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฟ ํค ๋ฌธ๋ฒ
read
document.cookie๋ name=value ์์ผ๋ก ๊ตฌ์ฑ๋์ด์๊ณ , ๊ฐ ์์ ;๋ก ๊ตฌ๋ถํ๋ค.
์ด๋, ์ ํ๋๋ ํ๋์ ๋
๋ฆฝ๋ ์ฟ ํค๋ฅผ ๋ํ๋ธ๋ค. ;์ ๊ธฐ์ค์ผ๋ก document.cookie์ ๊ฐ์ ๋ถ๋ฆฌํ๋ฉด ์ํ๋ ์ฟ ํค๋ฅผ ์ฐพ์ ์ ์๋ค.
var x = document.cookie; // cookie1=value1; cookie2=value2;...
โ
write
// Name์ด user๊ณ , Value๊ฐ John์ธ ์ฟ ํค ์ถ๊ฐ
// ๊ทธ๋ฆฌ๊ณ ์์ฑ๊ฐ์ผ๋ก path์ expires๋ฅผ ์ค์ ํด์ ์ถ๊ฐ
// ์ด ์์ฑ๊ฐ์ ์ฟ ํค ์คํธ๋ง์ ์ ์ฅ๋์ง๋ ์๊ณ ์์ฑ์ ๋ณด์ ์ ์ฅ๋๋ค.
document.cookie = "user=John; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT"
create
// document.cookie = "์ฟ ํค์ด๋ฆ=์ฟ ํค๊ฐ"
document.cookie = "username = ํ๊ธธ๋";
// ๋ง๋ฃ๊ธฐ๊ฐ์ ๋ฃ์ด์ ์ฟ ํค๊ฐ ์๋ ๋ง๋ฃ ๋๋๋ก ์ ์ํ ์ ์๋ค.(UTC time์ ์ด์ฉ)
document.cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC";
// ํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํค๊ฐ ์ด๋ ๋ธ๋ผ์ฐ์ ์ ์ํ ์ ์์์ง ์๋ ค์ค ์ ์๋ค.
document.cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; path=/";
change
document.cookie= ๋ getter์ setter๊ฐ์ด ๋์ํ๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค.
setter๋ฅผ ์ํํ ๋ ๋ชจ๋ ์ฟ ํค๋ฅผ ๋ฎ์ด์ฐ์ง ์๊ณ , ๋ช ์๋ ์ฟ ํค์ธ user์ ๊ฐ๋ง ๊ฐฑ์ ํ๋ค.
โ
์ฟ ํค์ ์ด๋ฆ๊ณผ ๊ฐ์ ํน๋ณํ ์ ์ฝ์ด ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ธ์๊ฐ ํ์ฉ๋๋ค. ํ์ง๋ง ํ์์ ์ ํจ์ฑ์ ์ผ๊ด์ฑ ์๊ฒ ์ ์งํ๊ธฐ ์ํด ๋ฐ๋์ ๋ด์ฅ ํจ์ encodeURIComponent๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฆ๊ณผ ๊ฐ์ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌํด ์ค์ผ ํ๋๊ฒ ์ข๋ค.
// Name์ด user๊ณ , Value๊ฐ John์ธ ์ฟ ํค ์ถ๊ฐ
// document.cookie = ํ๋ค๊ณ ์ด๊ธฐํ๋๋๊ฒ ์๋๋ผ, setter์ฒ๋ผ ์๋ํ๊ฒ ๋๋ค.
// ๊ทธ๋์ = "user=John"ํ๋ฉด ์ ์ฒด๊ฐ 'user=john'์ด ๋๋๊ฒ ์๋๋ผ '+= user=john'์ด ์ถ๊ฐ๋๊ฒ ๋๋ค.
document.cookie = "user=John";
โ
delete
๋ง๋ฃ ๊ธฐ๊ฐ์ ๊ณผ๊ฑฐ๋ก ๋ฐ๊พธ์ด ๋ฒ๋ฆฌ๋ฉด ๋๋ค. ๋จ, ์ฟ ํค ์์๋ฅผ ์ญ์ ํ ๋ ๋ฐ๋์ path๋ฅผ ๋ง์ถฐ์ผ ํ๋ค.
์ญ์ ๊ฐ ์๋๋ค๋ฉด, ๊ฐ๋ฐ์๋๊ตฌ์์ ์ฟ ํค path๋ฅผ ํํ ํ์ธ ํด ๋ณผ๊ฒ
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
// max-age ์ฌ์ฉ
// 1์๊ฐ ๋ค์ ์ฟ ํค๊ฐ ์ญ์ ๋ฉ๋๋ค.
document.cookie = "max-age=3600";
// ๋ง๋ฃ ๊ธฐ๊ฐ์ 0์ผ๋ก ์ง์ ํ์ฌ ์ฟ ํค๋ฅผ ๋ฐ๋ก ์ญ์ ํจ
document.cookie = "max-age=0";
โ[ ์ฟ ํค์ ํ๊ณ ]
์ฟ ํค์ ๋ช ๊ฐ์ง ์ ์ฝ ์ฌํญ์ด ์๋ค.
encodeURIComponent๋ก ์ธ์ฝ๋ฉํ ์ดํ์ name=value ์์ 4KB๋ฅผ ๋์ ์ ์๋ค. ์ด ์ฉ๋์ ๋๋ ์ ๋ณด๋ ์ฟ ํค์ ์ ์ฅํ ์ ์๋ค. ๋๋ฉ์ธ ํ๋๋น ์ ์ฅํ ์ ์๋ ์ฟ ํค์ ๊ฐ์๋ 20์ฌ ๊ฐ ์ ๋๋ก ํ์ ๋์ด ์๋ค. ๊ฐ์๋ ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ ์กฐ๊ธ์ฉ ๋ค๋ฅด๋ค.
์ฟ ํค ํ๋ผ๋ฏธํฐ
โ Name ์์ฑ๊ณผ Value ์์ฑ
- Name๊ณผ Value ์์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฝ๋ ๋ฐ ์ฌ์ฉํ๋ ์์ฑ์ด๋ค.
- ๋ฐ๋ผ์ ์ฟ ํค๋ฅผ ์ฌ์ฉํ ๋๋ Name๊ณผ Value ์์ฑ์ ๋ฐ๋์ ์ง์ ํด์ผ ํ๋ค.
// Name์ด user๊ณ , Value๊ฐ John์ธ ์ฟ ํค ์ถ๊ฐ
document.cookie = "user=John"
โก Expires ์์ฑ
- Expires ์์ฑ์ ์ฟ ํค์ ํ๊ธฐ ๋ ์ง๋ฅผ ์ง์ ํ๋ ์์ฑ์ด๋ค.
- Expires ์์ฑ์๋ GMT ํ์์ด๋ UTC ํ์์ผ๋ก ๋ ์ง๋ฅผ ์ ๋ ฅํด์ผ ํ๋ค.
- ํ๊ธฐ ๋ ์ง๋ฅผ ์ ๋ ฅํ์ง ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ข ๋ฃ๋ ๋ ์ฟ ํค๊ฐ ์ญ์ ๋๋ค.
document.cookie = "user=John; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT"
โข max-age ์์ฑ
- expires ์ต์ ์ ๋์์ผ๋ก, ์ฟ ํค ๋ง๋ฃ ๊ธฐ๊ฐ์ ์ค์ ํ ์ ์๊ฒ ํด์ค๋ค.
- ํ์ฌ๋ถํฐ ์ค์ ํ๊ณ ์ ํ๋ ๋ง๋ฃ์ผ์๊น์ง์ ์๊ฐ์ ์ด๋ก ํ์ฐํ ๊ฐ์ ์ค์ ํ๋ค.
// 1์๊ฐ ๋ค์ ์ฟ ํค๊ฐ ์ญ์ ๋ฉ๋๋ค.
document.cookie = "user=John; max-age=3600";
// ๋ง๋ฃ ๊ธฐ๊ฐ์ 0์ผ๋ก ์ง์ ํ์ฌ ์ฟ ํค๋ฅผ ๋ฐ๋ก ์ญ์ ํจ
document.cookie = "user=John; max-age=0";
โ
โฃ Secure ์์ฑ
- Secure ์์ฑ์ ์ง์ ํ๋ฉด ํด๋น ์ฟ ํค๋ SSL์ ์ฌ์ฉํด์๋ง ์์ฒญํ ์ ์๋ค.
document.cookie = "user=John; Secure"
โค Domain ์์ฑ
- Domain ์์ฑ์ ์ ๋ ฅํ์ง ์์ผ๋ฉด ํ์ฌ ๋๋ฉ์ธ์ ๊ฒฝ๋ก๋ก ์๋ ์ ๋ ฅ๋๋ค.
- ํ์ด์ง ์์ฒญ๊ณผ ๋น๊ตํด์ ๋๋ฉ์ธ์ ๊ฒฝ๋ก์ Domain ์์ฑ์ด ์ผ์นํ์ง ์์ผ๋ฉด, ์ฟ ํค์ ์ ๊ทผํ๋ ๊ฒ์ ๋ง์ผ๋ฏ๋ก Domain ์์ฑ์ ๊ฑด๋๋ฆฌ์ง ์๋๋ค.
// naver.com, www.naver.com, blog.naver.com, cafe.naver.com ์๋ธ ๋๋ฉ์ธ๋ ๋ชจ๋ ํฌํจ
document.cookie = "user=John; Domain=.naver.com"
โฅ Path ์์ฑ
- Path ์์ฑ์ ์ ๋ ฅํ์ง ์์ผ๋ฉด ํ์ฌ ๋๋ฉ์ธ์ ๊ฒฝ๋ก๋ก ์๋ ์ ๋ ฅ๋๋ค.
- Path ์์ฑ์ ์ผ๋ถ๋ฌ ์ง์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ ํน์ ๊ฒฝ๋ก(ํด๋๋ช )๋ฅผ ์ค์ ํ๋ค.
- Path ์์ฑ์ /ํด๋/ ๋ก ์ค์ ๋๋๋ฐ, ์ด๋ ๊ฒ ์ค์ ํ Path ์์ฑ์ด ์ค์ ๋๋ฉด ํ์ฌ ํด๋ ๋๋ ํ์ฌ ํด๋์ ํ์์์ ์ ๊ทผํ ์ ์๋ค.
- Path ์์ฑ์ ' / '๋ก ์ค์ ํ๋ฉด ๋๋ฉ์ธ ๋ด์ ๋ชจ๋ ๊ณณ์์ ์ ๊ทผํ ์ ์๋ค. (์ฟ ํค์ ๋ฒ์๋ฅผ ์ข๊ฒ ์ก์ ์๋ก ๋ณด์์๋ ์ข๋ค.)
document.cookie = "user=John; path=/"
โฅ HttpOnly ์์ฑ
- ์ค์ ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฟ ํค์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ฟ ํค ์กฐ์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
document.cookie = "user=John; httpOnly"
์ฟ ํค ํจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ค์์ ์ฟ ํค๋์์ ํจ์๋ก ๋ชจ๋ํํ์ฌ ๊ฐํธํ๊ฒ ์ฟ ํค๋ฅผ ๋ค๋ฃฐ์ ์๋๋ก ํ๋ ํฌํผ ํจ์๋ค์ด๋ค.
@get
// ์ฃผ์ด์ง ์ด๋ฆ์ ์ฟ ํค๋ฅผ ๋ฐํํ๋๋ฐ,
// ์กฐ๊ฑด์ ๋ง๋ ์ฟ ํค๊ฐ ์๋ค๋ฉด undefined๋ฅผ ๋ฐํํฉ๋๋ค.
function getCookie(name) {
let matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}
โ
@set
function setCookie(name, value, options = {}) {
options = {
path: '/', // ๊ฒฝ๋ก ์ง์
...options // ์๊ท๋จผํธ๋ก ์ต์
์ ๋๊ฒจ์คฌ์๊ฒฝ์ฐ ์ ๊ฐ์ฐ์ฐ์๋ก ์ถ๊ฐ ๊ฐฑ์
};
if (options.expires instanceof Date) {
options.expires = options.expires.toUTCString(); // ์ Date ๊ฐ์ฒด๋ผ๋ฉด ํ์์ ๋ง๊ฒ ์ธ์ฝ๋ฉ
}
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; // ์๋ก ๊ฐฑ์
}
//์ฟ ํค ์์ฑ
if (!document.cookie) {
setCookie('expires', date.toUTCString());
console.log('new Cookie created !');
}
// ์ฟ ํค ์ถ๊ฐ
setCookie('user', 'John', {secure: true, 'max-age': 3600});
โ
@delete
function deleteCookie(name) { // ํด๋น ์ฟ ํค ์์๋ง ์ญ์
setCookie(name, "", {
'max-age': -1
})
}
โ
@deleteAll
function deleteAllCookies() {
var cookies = document.cookie.split(";");
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i];
var eqPos = cookie.indexOf("=");
var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
deleteCookie(name.trim());
}
console.log('all cookies deleted !')
}
# ์ฐธ๊ณ ์๋ฃ
https://ko.javascript.info/cookie
https://wickedmagica.tistory.com/m/72?category=727614