Web

๐ŸŒ ์›น ์Šคํ† ๋ฆฌ์ง€(Web Storage)๋ž€?

xeunnie 2025. 2. 19. 01:00
728x90
๋ฐ˜์‘ํ˜•

๐ŸŒ ์›น ์Šคํ† ๋ฆฌ์ง€(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: ์„ธ์…˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•  ๋•Œ.

๋‹จ, ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ , ๋ณด์•ˆ์„ ์ตœ์šฐ์„ ์œผ๋กœ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŒท ์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•