๐ ์น ์คํ ๋ฆฌ์ง(Web Storage)๋?
์น ์คํ ๋ฆฌ์ง(Web Storage)๋ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ๋ก ์ ์ฅํ ์ ์๋๋ก ์ ๊ณต๋๋ ํด๋ผ์ด์ธํธ ์ธก ์ ์ฅ์์ ๋๋ค. ์ด์ ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ **์ฟ ํค(Cookies)**์ ๋์์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ๋ ๋ง์ ๋ฐ์ดํฐ ์ ์ฅ ์ฉ๋๊ณผ ๋จ์ํ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ์น ์คํ ๋ฆฌ์ง์ ๊ฐ๋ , ํน์ง, ์ข ๋ฅ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ๋ฒ์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค!
์น ์คํ ๋ฆฌ์ง๋? ๐ ๏ธ
์น ์คํ ๋ฆฌ์ง๋ HTML5์์ ๋์ ๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ์ ์ฅ์๋ก, LocalStorage์ SessionStorage ๋ ๊ฐ์ง ํํ๋ก ์ ๊ณต๋ฉ๋๋ค.
• ์ ์: ํค-๊ฐ(key-value) ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ํด๋ผ์ด์ธํธ(์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ) ์ธก์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ.
• ์ฉ๋: ์ฌ์ฉ์ ์ธ์ ์ ๋ณด, ์ ํ๋ฆฌ์ผ์ด์ ์ค์ , UI ์ํ ๋ฑ์ ์ ์ฅ.
์น ์คํ ๋ฆฌ์ง์ ์ฃผ์ ํน์ง
1๏ธโฃ ์๋ฒ์ ๋ ๋ฆฝ์ :
์น ์คํ ๋ฆฌ์ง๋ ํด๋ผ์ด์ธํธ ์ธก์์๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก ์๋ฒ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
2๏ธโฃ ํฌ๊ธฐ ์ ํ ์ฆ๊ฐ:
• ์ฟ ํค: 4KB ์ ํ
• ์น ์คํ ๋ฆฌ์ง: ์ต๋ 5~10MB(๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ ๋ค๋ฆ)
3๏ธโฃ ๊ฐ๋จํ ์ฌ์ฉ๋ฒ:
• ํค-๊ฐ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉฐ, ์ฟ ํค๋ณด๋ค ํจ์ฌ ์ง๊ด์ ์ธ API ์ ๊ณต.
4๏ธโฃ ๋ณด์ ๊ฐํ:
• HTTPS์ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ํ์ทจ ์ํ ๊ฐ์.
์น ์คํ ๋ฆฌ์ง์ ์ข ๋ฅ
์น ์คํ ๋ฆฌ์ง๋ ๋ ๊ฐ์ง ์ ํ์ผ๋ก ๋๋ฉ๋๋ค:
1. LocalStorage
• ํน์ง:
• ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ.
• ๋ธ๋ผ์ฐ์ ๋๋ ํญ์ ์ข ๋ฃํด๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋ฉ๋๋ค.
• ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก:
• ์ฌ์ฉ์ ์ค์ ์ ์ฅ(์: ํ ๋ง, ์ธ์ด)
• ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ ์ ์ง
์ฌ์ฉ ์์
// ๋ฐ์ดํฐ ์ ์ฅ
localStorage.setItem('theme', 'dark');
// ๋ฐ์ดํฐ ์ฝ๊ธฐ
const theme = localStorage.getItem('theme');
console.log(theme); // "dark"
// ๋ฐ์ดํฐ ์ญ์
localStorage.removeItem('theme');
// ๋ชจ๋ ๋ฐ์ดํฐ ์ด๊ธฐํ
localStorage.clear();
2. SessionStorage
• ํน์ง:
• ๋ธ๋ผ์ฐ์ ์ธ์ ๋์๋ง ๋ฐ์ดํฐ ์ ์ฅ.
• ๋ธ๋ผ์ฐ์ ๋๋ ํญ์ ๋ซ์ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ฉ๋๋ค.
• ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก:
• ํ์ฌ ์ฌ์ฉ์์ ์ธ์ ์ํ ๊ด๋ฆฌ
• ๋จ๊ธฐ์ ์ธ UI ์ํ ์ ์ฅ
์ฌ์ฉ ์์
// ๋ฐ์ดํฐ ์ ์ฅ
sessionStorage.setItem('isLoggedIn', 'true');
// ๋ฐ์ดํฐ ์ฝ๊ธฐ
const isLoggedIn = sessionStorage.getItem('isLoggedIn');
console.log(isLoggedIn); // "true"
// ๋ฐ์ดํฐ ์ญ์
sessionStorage.removeItem('isLoggedIn');
// ๋ชจ๋ ๋ฐ์ดํฐ ์ด๊ธฐํ
sessionStorage.clear();
์น ์คํ ๋ฆฌ์ง vs ์ฟ ํค
ํน์ง์น ์คํ ๋ฆฌ์ง์ฟ ํค
๋ฐ์ดํฐ ํฌ๊ธฐ ์ ํ | 5~10MB | 4KB |
์๋ฒ ์์ฒญ ํฌํจ ์ฌ๋ถ | ํฌํจ๋์ง ์์ | ํฌํจ๋จ (์๋ ์ ์ก) |
๋ฐ์ดํฐ ์๋ ์ ์ก | ์๋ ์ ์ก | ์๋ฒ ์์ฒญ ์ ์๋ ์ ์ก |
๋ง๋ฃ ์๊ฐ | LocalStorage๋ ์๊ตฌ ์ ์ฅ | ๋ง๋ฃ ์๊ฐ ์ค์ ๊ฐ๋ฅ |
์ฌ์ฉ ํธ์์ฑ | ์ง๊ด์ API ์ ๊ณต | ๋ณต์กํ ์ค์ ํ์ |
์น ์คํ ๋ฆฌ์ง์ ์ฌ์ฉ ์ฌ๋ก
1๏ธโฃ ์ฌ์ฉ์ ํ๊ฒฝ ์ค์ ์ ์ฅ
localStorage.setItem('preferredLanguage', 'en');
2๏ธโฃ ์ฅ๋ฐ๊ตฌ๋ ์ํ ์ ์ง
const cartItems = ['item1', 'item2', 'item3'];
localStorage.setItem('cart', JSON.stringify(cartItems));
3๏ธโฃ ์ธ์ ์ํ ๊ด๋ฆฌ
sessionStorage.setItem('currentUser', JSON.stringify({ id: 1, name: 'Alice' }));
์น ์คํ ๋ฆฌ์ง์ ํ๊ณ์ ์ฃผ์์
1. ๋ณด์ ์ด์
์น ์คํ ๋ฆฌ์ง๋ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅ๋๋ฏ๋ก XSS(Cross-Site Scripting) ๊ณต๊ฒฉ์ ์ทจ์ฝํฉ๋๋ค.
• ํด๊ฒฐ ๋ฐฉ๋ฒ:
• HTTPS ์ฌ์ฉ
• ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ์๋ฒ์ ์ ์ฅ
• HTML ์ธ์ฝ๋ฉ ๋ฐ ์ ์ ํ์ผ ๊ฒ์ฌ
2. ๋ฐ์ดํฐ ํฌ๊ธฐ ์ ํ
๋ธ๋ผ์ฐ์ ๋ง๋ค ์ง์ํ๋ ์ต๋ ์ฉ๋์ด ๋ค๋ฅด๋ฏ๋ก, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ํ์ธํด์ผ ํฉ๋๋ค.
3. ๋ธ๋ผ์ฐ์ ์์กด์ฑ
์น ์คํ ๋ฆฌ์ง๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ด๋ฏ๋ก ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ์ค๋ ์ ์์ต๋๋ค.
์น ์คํ ๋ฆฌ์ง ํ์ฉ ํ
1๏ธโฃ JSON์ผ๋ก ๋ฐ์ดํฐ ๊ด๋ฆฌ
์น ์คํ ๋ฆฌ์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ์์ด ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก, ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋๋ JSON ํ์์ด ์ ์ฉํฉ๋๋ค.
const user = { id: 1, name: 'John' };
localStorage.setItem('user', JSON.stringify(user));
const retrievedUser = JSON.parse(localStorage.getItem('user'));
console.log(retrievedUser.name); // "John"
2๏ธโฃ ํจ์จ์ ์ธ ํค ๊ด๋ฆฌ
• ๋ฐ์ดํฐ ์ ์ฅ ์ ๊ณ ์ ํ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
localStorage.setItem('myApp:settings', JSON.stringify({ theme: 'dark' }));
3๏ธโฃ ๋ฐ์ดํฐ ์ ๋ฆฌ ์ต๊ดํ
• ํ์ํ์ง ์์ ๋ฐ์ดํฐ๋ clear()๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฆฌํฉ๋๋ค.
๊ฒฐ๋ก : ์น ์คํ ๋ฆฌ์ง, ์ธ์ ์ฌ์ฉํ ๊น?
์น ์คํ ๋ฆฌ์ง๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๊ณ ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๋ ๋ฐ ํจ๊ณผ์ ์ ๋๋ค.
• LocalStorage: ์๊ตฌ ๋ฐ์ดํฐ ์ ์ฅ์ด ํ์ํ ๋.
• SessionStorage: ์ธ์ ์ํ๋ฅผ ์ ์งํด์ผ ํ ๋.
๋จ, ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ํญ์ ์๋ฒ์ ์ ์ฅํ๊ณ , ๋ณด์์ ์ต์ฐ์ ์ผ๋ก ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๐ท ์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น! ๐ท