ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
๐Ÿช Cookie-Based JWT Authentication
Dev.toDev.to
Security

localStorage ํƒˆํ”ผ, httpOnly Cookie๋กœ ์™„์„ฑํ•˜๋Š” JWT ๋ณด์•ˆ ์„ค๊ณ„

๐Ÿช Cookie-Based JWT Authentication

pial shek2026๋…„ 4์›” 9์ผ2๋ถ„intermediate

Context

localStorage ๊ธฐ๋ฐ˜ ํ† ํฐ ์ €์žฅ ๋ฐฉ์‹์˜ ๋ณด์•ˆ ์ทจ์•ฝ์  ๋…ธ์ถœ. XSS ๊ณต๊ฒฉ ๋ฐœ์ƒ ์‹œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ํ† ํฐ ํƒˆ์ทจ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ. ํ”„๋ก ํŠธ์—”๋“œ ๋‹จ์˜ ์ˆ˜๋™ ํ† ํฐ ๊ด€๋ฆฌ๋กœ ์ธํ•œ ์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€.

Technical Solution

  • ์‘๋‹ต ๋ฐ”๋”” ๋Œ€์‹  httpOnly Cookie์— Access ๋ฐ Refresh Token์„ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ
  • ๋ธŒ๋ผ์šฐ์ €์˜ ์ž๋™ ์ฟ ํ‚ค ์ „์†ก ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ™œ์šฉํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ตœ์ ํ™”
  • JavaScript ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜์—ฌ XSS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ํ† ํฐ์„ ๋ณดํ˜ธํ•˜๋Š” ๋ณด์•ˆ ๊ณ„์ธต ์„ค๊ณ„
  • ๋ณ„๋„์˜ DB ์กฐํšŒ ์—†์ด ์„œ๋ช…๋œ ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๋Š” Stateless ์•„ํ‚คํ…์ฒ˜ ์œ ์ง€
  • ํ—ค๋” ๋Œ€์‹  ์ฟ ํ‚ค์—์„œ ํ† ํฐ์„ ์ฝ์–ด ์ฒ˜๋ฆฌํ•˜๋Š” ์ปค์Šคํ…€ ์ธ์ฆ ํด๋ž˜์Šค ๊ตฌํ˜„
  • ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํ† ํฐ ์ €์žฅ ๋ฐ ํ—ค๋” ๋ถ€์ฐฉ ๋กœ์ง์„ ์ œ๊ฑฐํ•œ API ํ˜ธ์ถœ ๋‹จ์ˆœํ™” ์ „๋žต

Key Takeaway

๋ณด์•ˆ์„ฑ๊ณผ ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ™œ์šฉํ•˜๋Š” ์„ค๊ณ„ ์›์น™. Statelessํ•œ JWT์˜ ์žฅ์ ๊ณผ Cookie์˜ ๋ณด์•ˆ ์†์„ฑ์„ ๊ฒฐํ•ฉํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ธ์ฆ ์ „๋žต์˜ ์œ ํšจ์„ฑ.


Cookie ๊ธฐ๋ฐ˜ JWT ๋„์ž… ์‹œ CSRF ๊ณต๊ฒฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด SameSite ์„ค์ • ๋ฐ CSRF Token ๊ฒ€์ฆ ๋กœ์ง์„ ๋ฐ˜๋“œ์‹œ ๋ณ‘ํ–‰ ์ ์šฉํ•  ๊ฒƒ

์›๋ฌธ ์ฝ๊ธฐ