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

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

[Frontend] Cookies

๋ฐ˜์‘ํ˜•

 

 

 

๐Ÿช Cookies

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

 


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

โœ”๏ธ ์ •์˜

cookie๋Š” ์„œ๋ฒ„ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค-๊ฐ’ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋กœ,

์›น ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜์–ด ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์„œ๋ฒ„์— ์ „์†ก๋œ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์ง• ๋•๋ถ„์— ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ƒํƒœ๋‚˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ์„œ๋ฒ„๊ฐ€ ์ง€์†์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 


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

1๏ธโƒฃ ์ €์žฅ ๊ตฌ์กฐ

์ฟ ํ‚ค๋Š” ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋œ ์ €์žฅ์†Œ์ด๋ฉฐ, ๊ฒฝ๋กœ(path) ๋‹จ์œ„๋กœ๋„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ ๊ฐ™์€ ๋„๋ฉ”์ธ์—์„œ ์ƒ์„ฑ๋œ ์ฟ ํ‚ค๋Š” ๊ทธ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ๋ชจ๋“  ์š”์ฒญ์— ํฌํ•จ๋œ๋‹ค.

๋˜ํ•œ, ์ฟ ํ‚ค๋Š” ์ €์žฅ๋œ ์ดํ›„, ๋™์ผ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์š”์ฒญ ์‹œ ์ž๋™์œผ๋กœ ํฌํ•จ๋œ๋‹ค.

 

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

// ์ฟ ํ‚ค ์กฐํšŒ
console.log(document.cookie);

// ์ฟ ํ‚ค ์ƒ์„ฑ
document.cookie - "theme=dark; max-age=86400";

 

๋‹จ, HttpOnly ์˜ต์…˜์ด ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” JavaScript์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

 

3๏ธโƒฃ ์ˆ˜๋ช…

๋งŒ๋ฃŒ์ผ(Expires) ๋˜๋Š” ์œ ํšจ์‹œ๊ฐ„ (Max-Age)์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ ์‹œ ์‚ญ์ œ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด, ๋กœ๊ทธ์ธ ์œ ์ง€ ๊ธฐ๋Šฅ์ฒ˜๋Ÿผ ์žฅ๊ธฐ ์ €์žฅ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 


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

์ฟ ํ‚ค๋Š” XSS, CSRF ๊ฐ€์€ ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์€ ์†์„ฑ์„ ํ†ตํ•ด ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์†์„ฑ ์„ค๋ช…
HttpOnly JavaScript๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€ (XSS ๋ฐฉ์ง€)
Secure HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ „์†ก๋จ
SameSite CSRF ๋ฐฉ์ง€ (Strict, Lax, None)
Max-Age ์ฟ ํ‚ค์˜ ์œ ํšจ ์‹œ๊ฐ„ (์ดˆ ๋‹จ์œ„) ์„ค์ •

 

// ์„ค์ • ์˜ˆ์‹œ
Set-Cookie: refreshToken=abc.def.ghi; HttpOnly; Secure; SameSite=Strict; Max-Age=604800;

 

๋˜ํ•œ, ์ฟ ํ‚ค๋Š” ๋ชจ๋“  ์š”์ฒญ์— ํฌํ•จ๋˜๋ฏ€๋กœ ์šฉ๋Ÿ‰ ์ œํ•œ (4KB)๊ณผ ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ๋ถ€๋‹ด์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

 


๐Ÿ“‘ ์š”์•ฝ ์ •๋ฆฌ

ํ•ญ๋ชฉ cookies
์ €์žฅ ์œ„์น˜ ํด๋ผ์ด์–ธํŠธ ๋ธŒ๋ผ์šฐ์ € (๋„๋ฉ”์ธ ๋‹จ์œ„)
์ˆ˜๋ช… ์„ค์ •๋œ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ or ์„ธ์…˜ ์ข…๋ฃŒ ์‹œ
ํฌ๊ธฐ ์ œํ•œ ์•ฝ 4KB
์ ‘๊ทผ JavaScript (๋‹จ, HttpOnly ์ œ์™ธ)
์„œ๋ฒ„ ์ž๋™ ์ „์†ก โœ… ํ•ญ์ƒ ์ž๋™ ์ „์†ก
๋ณด์•ˆ HttpOnly, SameSite, Secure ์„ค์ •์œผ๋กœ ๊ฐ•ํ™” ๊ฐ€๋Šฅ
์‚ฌ์šฉ ์šฉ๋„ ์„ธ์…˜ ๊ด€๋ฆฌ, ์ธ์ฆ ์ƒํƒœ ์œ ์ง€, Refresh Token ์ €์žฅ ๋“ฑ

 


๐Ÿ“š ๊ฒฐ๋ก 

  • ์ฟ ํ‚ค๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์— ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ธ์ฆ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ €์žฅ ๋ฐฉ์‹์ด๋‹ค.
  • ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ ๋ฐ ์„ธ์…˜ ์œ ์ง€์— ๋งค์šฐ ์ ํ•ฉํ•˜๋ฉฐ, HttpOnly, Secure, SameSite ์†์„ฑ์„ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด XSS์™€ CSRF์— ๋Œ€ํ•œ ๋ฐฉ์–ด๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ•˜์ง€๋งŒ ์šฉ๋Ÿ‰์ด ์ œํ•œ์ ์ด๊ณ , ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ๋ณด์•ˆ ์ทจ์•ฝ์ ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์—์„œ๋Š” Refresh Token์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๊ฒฐ๋ก ์ ์œผ๋กœ, ์ฟ ํ‚ค๋Š” ๋ณด์•ˆ ์„ค์ •๋งŒ ์ž˜ํ•˜๋ฉด ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฌด์กฐ๊ฑด ์ €์žฅํ•ด๋‘๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฏผ๊ฐ๋„์™€ ์„œ๋ฒ„ ์—ฐ๋™ ํ•„์š” ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์‹ ์ค‘ํžˆ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.
๋ฐ˜์‘ํ˜•