Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป๊ณต๋ถ€ ๊ธฐ๋ก/๐Ÿ“Œ Frontend

[Frontend] localStorage์™€ Cookies

๋ฐ˜์‘ํ˜•

 

 

 

๐Ÿ’พ localStorate

localStorage๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” Web Storage API์˜ ํ•œ ์ข…๋ฅ˜๋กœ,
ํ‚ค-๊ฐ’ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

 


๐Ÿงฉ ๊ฐœ๋… ์ •๋ฆฌ

๐Ÿ“ข ์ •์˜

localStorage๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ €์žฅํ•˜๊ณ , ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ €์žฅ์†Œ์ด๋‹ค.

 

๐Ÿ”“ ๋น„์œ 

๋ธŒ๋ผ์šฐ์ € ์•ˆ์— ์žˆ๋Š” ์—ด์‡  ์—†๋Š” ์‚ฌ๋ฌผํ•จ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์–ธ์ œ๋“  ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ณด์•ˆ์ด ํ—ˆ์ˆ ํ•˜๊ณ  ๋ˆ„๊ตฌ๋‚˜ ์—ด ์ˆ˜ ์žˆ๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

 


๐Ÿƒ๐Ÿป‍โ™‚๏ธ ๋™์ž‘ ๋ฐฉ์‹

1๏ธโƒฃ ์ €์žฅ ๊ฐ€๋Šฅํ•œ ์œ„์น˜์™€ ์กฐ๊ฑด

  • localStorage๋Š” ๋„๋ฉ”์ธ ๋ณ„๋กœ ๋ถ„๋ฆฌ๋œ ๊ณต๊ฐ„์„ ์ œ๊ณตํ•œ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด https://example.com์˜ localStorage๋Š” https://another.com ์—์„œ๋Š” ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค, ์‚ฌ์šฉ์ž ๊ณ„์ •๋งˆ๋‹ค ๋ณ„๋„๋กœ ์กด์žฌํ•œ๋‹ค.

2๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ €์žฅ๊ณผ ์ฝ๊ธฐ

// ์ €์žฅ
localStoarge.setItem("accessToken", "adfsdfoKDFJ...");

// ์กฐํšŒ
const token = localStorage.getItem("accessToken");

// ์‚ญ์ œ
localStorage.removeItem("accessToken");

// ์ „์ฒด ์ดˆ๊ธฐํ™”
localStorage.clear();

 

์ด๋•Œ, ๋ฌธ์ž์—ด (String) ํ˜•ํƒœ๋กœ๋งŒ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด JSON ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค.

localStorage.setItem("user", JSON.stringify({ name: "soyeon" }));
const user = JSON.parse(localStorage.getItem("user"));

 

3๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ง€์†์„ฑ (Persistence)

ํ•œ ๋ฒˆ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜๊ฑฐ๋‚˜, ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ป๋‹ค ํ‚ค๊ฑฐ๋‚˜, ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•ด๋„ ์œ ์ง€๋œ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— localStorage๋Š” ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€, ์‚ฌ์šฉ์ž ํ…Œ๋งˆ (ex. ๋‹คํฌ ๋ชจ๋“œ), ๋งˆ์ง€๋ง‰ ์œ„์น˜ ๊ธฐ์–ต ๋“ฑ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ (UX)์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.

 

4๏ธโƒฃ ์‚ญ์ œ ์กฐ๊ฑด๊ณผ ์˜ˆ์™ธ ์ƒํ™ฉ

localStorage๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ์•ˆ์ „ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์กฐ๊ฑด์—์„œ ๋ฐ์ดํ„ฐ๋Š” ์–ธ์ œ๋“ ์ง€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ (F12)์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ ๊ฒฝ์šฐ
  • ๋ธŒ๋ผ์šฐ์ €์˜ ์„ค์ •์—์„œ "์บ์‹œ ๋ฐ ์‚ฌ์ดํŠธ ๋ฐ์ดํ„ฐ ์‚ญ์ œ"๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ
  • ์‹œํฌ๋ฆฟ ๋ชจ๋“œ(Incognito)์—์„œ ์ ‘์†ํ•œ ๊ฒฝ์šฐ
    →  ์‹œํฌ๋ฆฟ ๋ชจ๋“œ ์ข…๋ฃŒ์™€ ํ•จ๊ป˜ ์ €์žฅ๋œ ๋ชจ๋“  localStorage ๋ฐ์ดํ„ฐ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค.
  • ์›น ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ์ดˆ๊ณผ
    → ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋„๋ฉ”์ธ๋‹น ๋Œ€๋žต 5MB ์ œํ•œ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ณผ ์‹œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 


๐Ÿ” ๋ณด์•ˆ์  ์ธก๋ฉด

localStorage์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์œ„์—์„œ ๋ดค๋“ฏ์ด JavaScript๋กœ ์‰ฝ๊ฒŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—

๋งŒ์•ฝ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฝ์ž…๋˜๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ ํ† ํฐ์„ ํƒˆ์ทจํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ๊ณต๊ฒฉ์ž๊ฐ€ ๋Œ“๊ธ€์ด๋‚˜ ๊ฒ€์ƒ‰์ฐฝ ๋“ฑ์— <script> ํƒœ๊ทธ๋ฅผ ์‚ฝ์ž…ํ•ด๋‘๋ฉด,

ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์—ด์ž๋งˆ์ž JavaScript๊ฐ€ ์‹คํ–‰๋˜๊ณ  localStorage์— ์ ‘๊ทผํ•ด์„œ

๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•œ ํ›„ ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

๋”ฐ๋ผ์„œ ๋ฏผ๊ฐํ•œ ์ •๋ณด (Access Token, Refresh Token, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ)๋Š” localStorage์— ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์›์น™์ด๋‹ค.

๋งŒ์•ฝ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๊ผญ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„,

Access Token ์ •๋„๋งŒ ์ตœ์†Œํ•œ์œผ๋กœ ์ €์žฅํ•˜๊ณ , Refresh Token์€ ์ ˆ๋Œ€ ์ €์žฅํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

 


๐Ÿ“ฆ localStorage VS ์ฟ ํ‚ค

ํ•ญ๋ชฉ localStorage Cookies
์ €์žฅ ์šฉ๋Ÿ‰ ์•ฝ 5MB ์•ฝ 4KB
์ž๋™ ์ „์†ก โŒ (์ง์ ‘ ํ—ค๋”์— ๋„ฃ์–ด์•ผ ํ•จ) โœ… (๋งค ์š”์ฒญ๋งˆ๋‹ค ์„œ๋ฒ„์— ์ž๋™ ์ „์†ก๋จ)
์ ‘๊ทผ ๋ฐฉ์‹ JavaScript์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ JavaScript ๋˜๋Š” ์„œ๋ฒ„(HttpOnly)
๋ณด์•ˆ์„ฑ โ—๏ธ XSS์— ๋งค์šฐ ์ทจ์•ฝ HttpOnly, Secure ์„ค์ • ์‹œ ์ƒ๋Œ€์ ์œผ๋กœ ์•ˆ์ „
์‚ฌ์šฉ ์šฉ๋„ ์‚ฌ์šฉ์ž ์„ค์ •, Access Token ์„ธ์…˜, ์ธ์ฆ ์ฟ ํ‚ค, Refresh Token

 


๐Ÿ“š ๊ฒฐ๋ก 

  • localStorage๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ํŽธ๋ฆฌํ•œ ์ €์žฅ์†Œ์ด๋‹ค.
  • ํ•˜์ง€๋งŒ, ์–ธ์ œ๋“  ์‚ฌ์šฉ์ž ์กฐ์ž‘์ด๋‚˜ ๋ธŒ๋ผ์šฐ์ € ์„ค์ •์œผ๋กœ ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
  • ํŠนํžˆ, ๋ณด์•ˆ์— ์ทจ์•ฝํ•œ ์ €์žฅ์†Œ์ด๋ฏ€๋กœ, ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์›์น™์ด๋‹ค.
  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„  (๋‹คํฌ๋ชจ๋“œ, ์ตœ๊ทผ ๋ณธ ํ•ญ๋ชฉ ๋“ฑ)์—๋Š” ๋งค์šฐ ํšจ๊ณผ์ ์ด์ง€๋งŒ, ์ธ์ฆ ๊ด€๋ จ ์ •๋ณด ์ €์žฅ์—๋Š” ์‹ ์ค‘ํ•จ์ด ์š”๊ตฌ๋œ๋‹ค.
๋ฐ˜์‘ํ˜•