Skip to content

Latest commit

ย 

History

History
52 lines (34 loc) ยท 3.1 KB

File metadata and controls

52 lines (34 loc) ยท 3.1 KB

๋กœ๊ทธ์ธ์‹œ JWT ํ† ํฐ๊ณผ Redis ๋„์ž…๊ณผ์ •

๋กœ๊ทธ์ธ์‹œ JWT ํ† ํฐ๊ณผ Refresh ํ† ํฐ ๊ด€๋ฆฌ๋ฅผ Redis์— ์ €์žฅํ•˜๊ธฐ ๊นŒ์ง€์˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.


โœ… ISSUE: ๋กœ๊ทธ์ธ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ ํ•  ๊ฒƒ์ธ๊ฐ€?

'์„ธ์…˜(Session) ๋ฐฉ์‹' vs 'JWT ํ† ํฐ ๋ฐฉ์‹'

session_vs_token


โš ๏ธ ์„ธ์…˜(Session) ๋ฐฉ์‹ ๋กœ๊ทธ์ธ์˜ ํ•œ๊ณ„

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

- ์š”๊ตฌ์‚ฌํ•ญ: Scale-out ํ™˜๊ฒฝ์—์„œ ๋กœ๊ทธ์ธ ์ƒํƒœ๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•จ

ํŠธ๋ž˜ํ”ฝ์ด ์ปค์ง€๋ฉด์„œ ์„œ๋ฒ„์˜ ์ˆ˜ํ‰ ํ™•์žฅ(Scale-out)์„ ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ์ง€๋งŒ ์„ธ์…˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉ์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ

  • ์˜ˆ) ์„ธ์…˜์„ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ '์„œ๋ฒ„1'์—์„œ ๋กœ๊ทธ์ธํ•œ ๋’ค ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์œผ๋กœ '์„œ๋ฒ„2'๋กœ ๋ผ์šฐํŒ…๋  ๊ฒฝ์šฐ ์„ธ์…˜์„ ์ฐพ์ง€ ๋ชปํ•ด ๋กœ๊ทธ์ธ์ด ํ’€๋ฆด ์ˆ˜ ์žˆ์Œ.

- ํ•ด๊ฒฐ๋ฐฉ๋ฒ•: Redis์™€ ๊ฐ™์€ ์ค‘์•™ ์„ธ์…˜ ์ €์žฅ์†Œ ์‚ฌ์šฉ

- But, ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ์€ ์š”์ฒญ๋งˆ๋‹ค ์„ธ์…˜ ์กฐํšŒ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ํŠธ๋ž˜ํ”ฝ์ด ์ปค์งˆ์ˆ˜๋ก Redis ์กฐํšŒ QPS๊ฐ€ ์ฆ๊ฐ€.

- ๊ฒฐ๋ก : ์šด์˜ ๊ด€์ ์—์„œ๋Š” ๋น„์šฉ, ์ง€์—ฐ, ์žฅ์•  ๋Œ€์‘ ๋ถ€๋‹ด์ด ์ปค์ ธ ์„ธ์…˜ ๋ฐฉ์‹์€ ์ฑ„ํƒํ•˜์ง€ ์•Š์Œ

์„œ๋น„์Šค๋Š” ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€์— ๋”ฐ๋ผ ์ˆ˜ํ‰ ํ™•์žฅ(Scale-out) ์ด ํ•„์š”ํ–ˆ๊ณ , ์„œ๋ฒ„๊ฐ€ ์ธ์ฆ ์ƒํƒœ(์„ธ์…˜)๋ฅผ ๋“ค๊ณ  ์žˆ์œผ๋ฉด ํ™•์žฅ ์‹œ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์ฆ์€ ์„œ๋ฒ„ ์ƒํƒœ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” Stateless ๋ฐฉ์‹์ด ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ JWT ๊ธฐ๋ฐ˜ ํ† ํฐ ์ธ์ฆ(Access/Refresh) ์„ ์ฑ„ํƒ.


๐Ÿ“Œ ๋˜๋‹ค๋ฅธ ISSUE: Refresh Token์˜ ์ €์žฅ ๋ฐฉ์‹

Access Token ๋งŒ๋ฃŒ์‹œ ํ† ํฐ์„ ๊ฐฑ์‹ ํ•  ๋ฐฉ๋ฒ•์œผ๋กœ Refresh Token์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๊ณ , Refresh Token์„ ์–ด๋””์— ์ €์žฅ ํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒ. ๋˜ํ•œ ๋ณด์•ˆ์ƒ ์•„๋ž˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๊ณ ๋ ค.

- ์š”๊ตฌ์‚ฌํ•ญ: '๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ' ๊ธฐ๋Šฅ ์ ์šฉ ๋ฐ ํ† ํฐ ํƒˆ์ทจ ํ™•๋ฅ  ์ค„์ด๊ธฐ

- ํ•ด๊ฒฐ๋ฐฉ๋ฒ•: ์ €์žฅ์†Œ์— ํ† ํฐ์„ ์ €์žฅ

- ๊ณ ๋ฏผ: ๊ทธ๋ ‡๋‹ค๋ฉด ์ €์žฅ์†Œ๋Š” RDB vs Redis ์ค‘ ์–ด๋–ค๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€?

- ๊ฒฐ๋ก : ๋งŒ๋ฃŒ๋œ Refresh Token์˜ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด TTL์ด ๊ฐ€๋Šฅํ•œ Redis๋ฅผ ์‚ฌ์šฉ

๋น„์šฉ๊ณผ ์šด์˜์„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด RDB ์˜€์ง€๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ๋œ Refresh Token์„ Refresh Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์— ๋งž์ถฐ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ. RDB ์‚ฌ์šฉ์‹œ ๋ฐฐ์น˜ ๋“ฑ์œผ๋กœ ๋งŒ๋ฃŒ๋œ ํ† ํฐ์˜ ์ œ๊ฑฐ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Refresh Token์€ ์œ ํšจ๊ธฐ๊ฐ„ ์ดํ›„ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ์ž„์‹œ ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ TTL๋กœ ์ž๋™ ๋งŒ๋ฃŒ๋˜๋Š” Redis๊ฐ€ ๋ฐ์ดํ„ฐ ์„ฑ๊ฒฉ๊ณผ ์šด์˜ ๋‹จ์ˆœ์„ฑ ์ธก๋ฉด์—์„œ ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•จ.


๐Ÿ”ฅ ์ตœ์ข… ๊ฒฐ๋ก  ๋ฐ ์š”์•ฝ

์„œ๋ฒ„์˜ ์ˆ˜ํ‰์  ํ™•์žฅ์„ ๊ณ ๋ คํ•ด Serverless ๋ฐฉ์‹์ธ JWT ํ† ํฐ์„ ์ ์šฉํ–ˆ์œผ๋ฉฐ, Refresh Token์˜ ์ €์žฅ ๋ฐฉ์‹ ๋ฌธ์ œ๋Š” ํ† ํฐ ํƒˆ์ทจ ํ™•๋ฅ ๊ณผ ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ ๊ฐ€๋Šฅ ๋“ฑ ๋ณด์•ˆ์ƒ ๋ฌธ์ œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด Redis๋ฅผ ์ €์žฅ์†Œ ์„ ํƒ(Redis๋Š” TTL ์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด ์„ ์ •)