Post

๐Ÿช์ฟ ํ‚ค(Cookie) โ€” HTTP๋ถ€ํ„ฐ JWT๊นŒ์ง€ (4)

HTTP์˜ ๋ฌด์ƒํƒœ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ์ฟ ํ‚ค(Cookie)์˜ ๊ฐœ๋…, ๊ตฌ์กฐ, ๋™์ž‘ ๋ฐฉ์‹, ๊ทธ๋ฆฌ๊ณ  ๋ณด์•ˆ ์ด์Šˆ๊นŒ์ง€ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜๊ณผ์˜ ์ฐจ์ด์ ๋„ ๋น„๊ตํ•ด ๋ณด๋ฉฐ ์ธ์ฆ ํ๋ฆ„์„ ์ดํ•ดํ•ด ๋ณด์„ธ์š”.

๐Ÿช์ฟ ํ‚ค(Cookie) โ€” HTTP๋ถ€ํ„ฐ JWT๊นŒ์ง€ (4)

๐Ÿช ์ฟ ํ‚ค์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ โ€” HTTP๋Š” ๋ฌด์ƒํƒœ(Stateless)

HTTP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Statelessํ•œ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.
์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ํ›„ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„
์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌด์ƒํƒœ ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํ•˜๊ณ  ํ™•์žฅ์— ์œ ๋ฆฌํ•˜์ง€๋งŒ,
๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค:

  • ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ
  • ์‚ฌ์šฉ์ž ํ…Œ๋งˆ ์„ค์ • ๋“ฑ

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ฟ ํ‚ค(Cookie) ์ž…๋‹ˆ๋‹ค.


์ฟ ํ‚ค๋ž€?

์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ์ €์žฅ๋˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค.

๋™์ž‘ ์›๋ฆฌ

  • ์„œ๋ฒ„๋Š” ์ธ์ฆ ์„ฑ๊ณต ์‹œ, Set-Cookie ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•˜๊ณ , ์ดํ›„์˜ ๋ชจ๋“  ์š”์ฒญ์— ์ž๋™์œผ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๋Š” ์ด ์ฟ ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์ฟ ํ‚ค๋Š” ์–ด๋””์— ์“ฐ์ผ๊นŒ?

  • ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€
  • ์ž๋™ ๋กœ๊ทธ์ธ
  • ์ตœ๊ทผ ๋ณธ ์ƒํ’ˆ ์ •๋ณด ์ €์žฅ
  • ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ค์ • ์œ ์ง€ (์˜ˆ: ๋‹คํฌ๋ชจ๋“œ)

์ฟ ์ฟ ํ‚ค์™€ ์„ธ์…˜ ํ๋ฆ„

1
2
3
4
5
6
1. ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ์ธ ์š”์ฒญ (ID/PW)
2. ์„œ๋ฒ„ ์ธ์ฆ โ†’ ์„ธ์…˜ ์ƒ์„ฑ โ†’ ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ
3. ์„œ๋ฒ„: Set-Cookie: JSESSIONID=abc123
4. ๋ธŒ๋ผ์šฐ์ €: ์ฟ ํ‚ค ์ €์žฅ
5. ์ดํ›„ ์š”์ฒญ ์‹œ: Cookie: JSESSIONID=abc123 ์ž๋™ ํฌํ•จ
6. ์„œ๋ฒ„๋Š” ์„ธ์…˜ ID ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ

์ฆ‰,

  • ์ฟ ํ‚ค๋Š” ์„ธ์…˜ ID๋ฅผ ๋‹ด๋Š” ํ†ต์‹  ๋งค๊ฐœ์ฒด
  • ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ์„ธ์…˜ ์ €์žฅ์†Œ์— ์ €์žฅ

์ด ๊ตฌ์กฐ ๋•๋ถ„์— HTTP๋Š” ์—ฌ์ „ํžˆ Statelessํ•˜๋ฉด์„œ๋„ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ฟ ํ‚ค์˜ ๊ตฌ์„ฑ ์š”์†Œ

์†์„ฑ์„ค๋ช…
Name=Value์ฟ ํ‚ค์˜ ์ด๋ฆ„๊ณผ ๊ฐ’
Path์–ด๋–ค URL ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ์ฟ ํ‚ค๋ฅผ ์ „์†กํ• ์ง€
Domain์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ๋„๋ฉ”์ธ/์„œ๋ธŒ๋„๋ฉ”์ธ
Expires / Max-Age์ฟ ํ‚ค ๋งŒ๋ฃŒ ์‹œ์  (์ง€์† ์—ฌ๋ถ€)
HttpOnlyJS ์ ‘๊ทผ ๋ถˆ๊ฐ€ โ†’ XSS ๋ฐฉ์–ด
SecureHTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ „์†ก
SameSiteCSRF ๋ฐฉ์ง€ ์˜ต์…˜ (Lax, Strict, None)

์ฟ ํ‚ค์˜ ๋ณด์•ˆ ์ด์Šˆ

1. XSS (Cross Site Scripting)

  • ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฟ ํ‚ค๋ฅผ ํƒˆ์ทจ ๊ฐ€๋Šฅ
  • HttpOnly ์˜ต์…˜์œผ๋กœ JS ์ ‘๊ทผ ์ฐจ๋‹จ

2. CSRF (Cross Site Request Forgery)

  • ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ๋œ ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด ์œ„์กฐ ์š”์ฒญ
  • SameSite=Lax ๋˜๋Š” Strict ๊ถŒ์žฅ

3. ๋ฏผ๊ฐ ์ •๋ณด ์ €์žฅ ๊ธˆ์ง€

  • ๋น„๋ฐ€๋ฒˆํ˜ธ, ์นด๋“œ๋ฒˆํ˜ธ ๋“ฑ์˜ ๋ฏผ๊ฐ ์ •๋ณด๋Š” ์ ˆ๋Œ€ ์ฟ ํ‚ค์— ์ €์žฅ โŒ

๐Ÿ†š ์ฟ ํ‚ค vs ์„ธ์…˜ ์š”์•ฝ ๋น„๊ต

ํ•ญ๋ชฉ์ฟ ํ‚ค์„ธ์…˜
์ €์žฅ ์œ„์น˜ํด๋ผ์ด์–ธํŠธ (๋ธŒ๋ผ์šฐ์ €)์„œ๋ฒ„ (๋ฉ”๋ชจ๋ฆฌ, Redis, DB)
๋ฐ์ดํ„ฐ ๋‚ด์šฉ์‹๋ณ„์ž, ์„ค์ • ์ •๋ณด์‚ฌ์šฉ์ž ์ •๋ณด or ์ฐธ์กฐ ID
์„ค์ • ๋ฐฉ์‹Set-Cookie ํ—ค๋”์„œ๋ฒ„ ๋‚ด๋ถ€ ์ฝ”๋“œ๋กœ ์ƒ์„ฑ
๋ณด์•ˆ์„ฑ๋‚ฎ์Œ (์œ ์ถœ ์œ„ํ—˜)๋†’์Œ (์„œ๋ฒ„ ์ œ์–ด ๊ฐ€๋Šฅ)
๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ์ฟ ํ‚ค ์‚ญ์ œ์„ธ์…˜ ๋ฌดํšจํ™” ๋˜๋Š” ์‚ญ์ œ

๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ

  • ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋“ค๊ณ  ๋‹ค๋‹ˆ๋Š” ์ž‘์€ ์—ด์‡ 
  • ์„ธ์…˜์€ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•ด ๋‘๋Š” ์บ๋น„๋‹›

์„œ๋ฒ„๋Š” ์ฟ ํ‚ค์— ๋‹ด๊ธด ์‹๋ณ„์ž๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ์œ ์ถ”ํ•˜์ง€๋งŒ,
์ง์ ‘ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์— Stateless ๊ตฌ์กฐ๋Š” ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์ฟ ํ‚ค์—๋Š” ์‹๋ณ„์ž(ID) ๋งŒ ๋‹ด๊ณ ,
๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์ ˆ๋Œ€ ์ €์žฅํ•˜์ง€ ๋งˆ์„ธ์š”.


๋‹ค์Œ ๊ธ€ ์˜ˆ๊ณ 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์ฟ ํ‚ค/์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ๊ณผ๋Š” ๋‹ฌ๋ฆฌ
์„œ๋ฒ„๊ฐ€ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๊ตฌ์กฐ,
์ฆ‰ JWT(Json Web Token) ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.