๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฑ… ๋ฆฌ๋ทฐ/๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ธฐ์ดˆ

[๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ธฐ์ดˆ] 4. ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜์˜ ์„ค๊ณ„

์ฝ์€ ๋‚ ์งœ : 2024.08.20
์ง€์€์ด : ์•Œ๋ ‰์Šค ์‰ฌ
์ถœํŒ์‚ฌ : ์ธ์‚ฌ์ดํŠธ

 

โœ”๏ธ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ

์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜๋ฅผ ๋‘๋ฉด ์ข‹์€ ์ 

  • DoS(Denial of Service) ๊ณต๊ฒฉ์— ์˜ํ•œ ์ž์› ๊ณ ๊ฐˆ ๋ฐฉ์ง€
  • ์„œ๋ฒ„ ๊ฐœ์ˆ˜๋‚˜ ์„œ๋“œ ํŒŒํ‹ฐ API ์‚ฌ์šฉ๋ฃŒ์— ๋Œ€ํ•œ ๋น„์šฉ ์ ˆ๊ฐ
  • ๋ด‡(bot)์—์„œ ์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์ด๋‚˜ ์‚ฌ์šฉ์ž์˜ ์ž˜๋ชป๋œ ์ด์šฉ ํŒจํ„ด์œผ๋กœ ์œ ๋ฐœ๋œ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ ์ธํ•œ ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜ ๋ฐฉ์ง€

 

1๋‹จ๊ณ„ : ๋ฌธ์ œ ์ดํ•ด ๋ฐ ์„ค๊ณ„ ๋ฒ”์œ„ ํ™•์ •

  • ํด๋ผ์ด์–ธํŠธ ์ธก ์ œํ•œ ์žฅ์น˜์ธ๊ฐ€, ์„œ๋ฒ„ ์ธก ์ œํ•œ ์žฅ์น˜์ธ๊ฐ€?
  • ์„œ๋ฒ„ ์ธก์ด๋ผ๋ฉด API ํ˜ธ์ถœ์„ ์ œ์–ดํ•˜๋Š” ๊ธฐ์ค€์€? - IP ์ฃผ์†Œ, ์‚ฌ์šฉ์ž ID ๋“ฑ
  • ์‹œ์Šคํ…œ์˜ ๊ทœ๋ชจ๋Š”?
  • ์‹œ์Šคํ…œ์ด ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
  • ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜๋Š” ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค์ธ๊ฐ€, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
  • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜์— ์˜ํ•ด ๊ฑธ๋Ÿฌ์ง„ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ทธ ์‚ฌ์‹ค์„ ์•Œ๋ ค์•ผ ํ•˜๋Š”๊ฐ€?

 

2๋‹จ๊ณ„ : ๊ฐœ๋žต์  ์„ค๊ณ„์•ˆ ์ œ์‹œ ๋ฐ ๋™์˜ ๊ตฌํ•˜๊ธฐ

์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜๋Š” ์–ด๋””์— ๋‘˜ ๊ฒƒ์ธ๊ฐ€?

  • ํด๋ผ์ด์–ธํŠธ ๋ณด๋‹ค๋Š” ์„œ๋ฒ„ ์ธก ๋˜๋Š” ๋ณ„๋„์˜ ๋ฏธ๋“ค์›จ์–ด๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์€ ์‰ฝ๊ฒŒ ์œ„๋ณ€์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋‘ ํ†ต์ œํ•˜๋Š” ๊ฒŒ ์–ด๋ ต๋‹ค.
  • ํด๋ผ์šฐ๋“œ MSA์˜ ๊ฒฝ์šฐ API ๊ฒŒ์ดํŠธ์›จ์ด์— ๊ตฌํ˜„ํ•œ๋‹ค.
    • ํด๋ผ์šฐ๋“œ ์—…์ฒด์—์„œ ์ฒ˜๋ฆฌ์œจ ์ œํ•œ, SSL ์ข…๋‹จ, ์‚ฌ์šฉ์ž ์ธ์ฆ, IP ํ—ˆ์šฉ ๋ชฉ๋ก ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.
  • ์„œ๋ฒ„์— ๋‘์–ด์•ผ ํ• ๊นŒ, API ๊ฒŒ์ดํŠธ์›จ์ด์— ๋‘ฌ์•ผ ํ• ๊นŒ? 
    • ํ˜„์žฌ์˜ ๊ธฐ์ˆ  ์Šคํƒ(ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด, ์บ์‹œ ์„œ๋น„์Šค ๋“ฑ)์„ ์ ๊ฒ€ํ•˜์—ฌ ์„œ๋ฒ„ ์ธก ๊ตฌํ˜„์„ ์ง€์›ํ•˜๊ธฐ ์ถฉ๋ถ„ํ•œ์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์‚ฌ์—…์— ๋งž๋Š” ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฐพ๋Š”๋‹ค. ๋‹ค๋งŒ, ์„œ๋“œํŒŒํ‹ฐ API ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์„ ํƒ์ง€๋Š” ์ œํ•œ๋  ์ˆ˜ ์žˆ๋‹ค. 
    • MSA๋ฅผ ๊ธฐ๋ฐ˜ํ•˜๊ณ  ์žˆ๊ณ  API ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์ด๋ฏธ ์„ค๊ณ„์— ํฌํ•จ์‹œ์ผฐ๋‹ค๋ฉด, API ๊ฒŒ์ดํŠธ์›จ์ด์— ํฌํ•จ์‹œ์ผœ์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜๋ฅผ ๊ตฌํ˜„ํ•  ์ธ๋ ฅ์ด ๋ถ€์กฑํ•˜๋‹ค๋ฉด ์„œ๋“œํŒŒํ‹ฐ API ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ์ด๋‹ค.

์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ํ† ํฐ ๋ฒ„ํ‚ท(token bucket)
    • ๋™์ž‘ ์›๋ฆฌ
      • ์‚ฌ์ „ ์„ค์ •๋œ ์–‘์˜ ํ† ํฐ์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฑ„์›Œ์ง€๊ณ , ๊ฐ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค.
      • ์ถฉ๋ถ„ํ•œ ํ† ํฐ์ด ์žˆ์œผ๋ฉด ๋ฒ„ํ‚ท์—์„œ ํ† ํฐ์„ ํ•˜๋‚˜ ๊บผ๋‚ธ ํ›„ ์‹œ์Šคํ…œ์— ์š”์ฒญ์„ ์ „๋‹ฌํ•œ๋‹ค.
      • ์ถฉ๋ถ„ํ•œ ํ† ํฐ์ด ์—†์œผ๋ฉด ํ•ด๋‹น ์š”์ฒญ์€ ๋ฒ„๋ ค์ง„๋‹ค.
    • ์žฅ์ 
      • ๊ตฌํ˜„์ด ์‰ฝ๋‹ค.
      • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด๋‹ค.
      • ์งง์€ ์‹œ๊ฐ„์— ์ง‘์ค‘๋˜๋Š” ํŠธ๋ž˜ํ”ฝ๋„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค. 
    • ๋‹จ์ 
      • ๋ฒ„ํ‚ท ํฌ๊ธฐ์™€ ํ† ํฐ ๊ณต๊ธ‰๋ฅ  ์ธ์ž๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํŠœ๋‹ํ•˜๋Š” ๊ฒƒ์ด ๊นŒ๋‹ค๋กญ๋‹ค.
  • ๋ˆ„์ถœ ๋ฒ„ํ‚ท(leaky bucket)
    • ๋™์ž‘ ์›๋ฆฌ
      • ์š”์ฒญ์ด ๋„์ฐฉํ•˜๋ฉด ํ๋ฅผ ํ™•์ธํ•˜์—ฌ, ํ์— ๋นˆ์ž๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด ์š”์ฒญ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
      • ํ๊ฐ€ ๊ฐ€๋“ ์ฐจ ์žˆ์œผ๋ฉด ์ƒˆ ์š”์ฒญ์€ ๋ฒ„๋ฆฐ๋‹ค.
      • ์ง€์ •๋œ ์‹œ๊ฐ„๋งˆ๋‹ค ํ์—์„œ ์š”์ฒญ์„ ๊บผ๋‚ด์–ด ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • ์žฅ์ 
      • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด๋‹ค.
      • ๊ณ ์ •๋œ ์ฒ˜๋ฆฌ์œจ์„ ๊ฐ–๊ณ  ์žˆ์–ด, ์•ˆ์ •์  ์ถœ๋ ฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ ํ•ฉํ•˜๋‹ค.
    • ๋‹จ์ 
      • ๋‹จ ์‹œ๊ฐ„์— ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ฆฌ๋ฉด ํ์— ์˜ค๋ž˜๋œ ์š”์ฒญ์ด ์Œ“์ด๊ณ , ๊ทธ ์š”์ฒญ์„ ์ œ๋•Œ ์ฒ˜๋ฆฌ ๋ชปํ•˜๋ฉด ์ตœ์‹  ์š”์ฒญ์€ ๋ฒ„๋ ค์ง„๋‹ค.
      • ๋ฒ„ํ‚ท ํฌ๊ธฐ, ์ฒ˜๋ฆฌ์œจ ์ธ์ž๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํŠœ๋‹ํ•˜๋Š” ๊ฒƒ์ด ๊นŒ๋‹ค๋กญ๋‹ค.
  • ๊ณ ์ • ์œˆ๋„ ์นด์šดํ„ฐ(fixed window counter)
    • ๋™์ž‘ ์›๋ฆฌ 
      • ํƒ€์ž„๋ผ์ธ์„ ๊ณ ์ •๋œ ๊ฐ„๊ฒฉ์˜ ์œˆ๋„๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ์œˆ๋„๋งˆ๋‹ค ์นด์šดํ„ฐ๋ฅผ ๋ถ™์ธ๋‹ค.
      • ์š”์ฒญ์ด ์ ‘์ˆ˜๋  ๋•Œ๋งˆ๋‹ค ์ด ์นด์šดํ„ฐ์˜ ๊ฐ’์€ 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.
      • ์ด ์นด์šดํ„ฐ์˜ ๊ฐ’์ด ์‚ฌ์ „์— ์„ค์ •๋œ ์ž„๊ณ„์น˜์— ๋„๋‹ฌํ•˜๋ฉด ์ƒˆ๋กœ์šด ์š”์ฒญ์€ ์ƒˆ ์œˆ๋„๊ฐ€ ์—ด๋ฆด ๋•Œ๊นŒ์ง€ ๋ฒ„๋ ค์ง„๋‹ค.
    • ์žฅ์ 
      • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด๋‹ค.
      • ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
      • ์œˆ๋„๊ฐ€ ๋‹ซํžˆ๋Š” ์‹œ์ ์— ์นด์šดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹ -> ํŠน์ •ํ•œ ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค.
    • ๋‹จ์ 
      • ์œˆ๋„ ๊ฒฝ๊ณ„ ๋ถ€๊ทผ์—์„œ ํŠธ๋ž˜ํ”ฝ์ด ์ง‘์ค‘๋˜๋Š” ๊ฒฝ์šฐ ์‹œ์Šคํ…œ์— ์„ค์ •๋œ ์ฒ˜๋ฆฌ ํ•œ๋„๋ณด๋‹ค ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์ด๋™ ์œˆ๋„ ๋กœ๊ทธ(sliding window log)
    • ๋™์ž‘ ์›๋ฆฌ
      • ์š”์ฒญ์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ถ”์ ํ•œ๋‹ค. (ํƒ€์ž„์Šคํƒฌํ”„๋Š” ๋ณดํ†ต ๋ ˆ๋””์Šค์˜ sorted set ๊ฐ™์€ ์บ์‹œ์— ๋ณด๊ด€)
      • ์ƒˆ ์š”์ฒญ์ด ์˜ค๋ฉด ๋งŒ๋ฃŒ๋œ ํƒ€์ž„์Šคํƒฌํ”„๋Š” ์ œ๊ฑฐํ•œ๋‹ค.
      • ์ƒˆ ์š”์ฒญ์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋กœ๊ทธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
      • ๋กœ๊ทธ์˜ ํฌ๊ธฐ๊ฐ€ ํ—ˆ์šฉ์น˜๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์œผ๋ฉด ์š”์ฒญ์„ ์‹œ์Šคํ…œ์— ์ „๋‹ฌํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฑฐ๋ถ€ํ•œ๋‹ค.
    • ์žฅ์ 
      • ์–ด๋А ์ˆœ๊ฐ„์˜ ์œˆ๋„๋ฅผ ๋ณด๋”๋ผ๋„ ํ—ˆ์šฉ๋˜๋Š” ์š”์ฒญ์˜ ๊ฐœ์ˆ˜๋Š” ์‹œ์Šคํ…œ์˜ ์ฒ˜๋ฆฌ์œจ ํ•œ๋„๋ฅผ ๋„˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋‹จ์ 
      • ๊ฑฐ๋ถ€๋œ ์š”์ฒญ์˜ ํƒ€์ž„์Šคํƒฌํ”„๋กœ ๋ณด๊ด€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ด๋™ ์œˆ๋„ ์นด์šดํ„ฐ(sliding window counter)
    • ๋™์ž‘ ์›๋ฆฌ
      • ํ˜„์žฌ ์œˆ๋„์— [ ํ˜„์žฌ 1๋ถ„๊ฐ„์˜ ์š”์ฒญ์ˆ˜ + ์ง์ „ 1๋ถ„๊ฐ„์˜ ์š”์ฒญ ์ˆ˜ * ์ด๋™ ์œˆ๋„์™€ ์ง์ „ 1๋ถ„์ด ๊ฒน์น˜๋Š” ๋น„์œจ ] ๊ฐœ์˜ ์š”์ฒญ์ด ์˜จ ๊ฒƒ์œผ๋กœ ๋ณด๊ณ  ๋‹ค์Œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
    • ์žฅ์ 
      • ์ด์ „ ์‹œ๊ฐ„๋Œ€์˜ ํ‰๊ท  ์ฒ˜๋ฆฌ์œจ์— ๋”ฐ๋ผ ํ˜„์žฌ ์œˆ๋„์˜ ์ƒํƒœ๋ฅผ ๊ณ„์‚ฐ -> ์งง์€ ์‹œ๊ฐ„๋Œ€์— ๋ชฐ๋ฆฌ๋Š” ํŠธ๋ž˜ํ”ฝ์— ์ž˜ ๋Œ€์‘ํ•œ๋‹ค.
      • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด๋‹ค.
    • ๋‹จ์ 
      • ์ง์ „ ์‹œ๊ฐ„๋Œ€์— ๋„์ฐฉํ•œ ์š”์ฒญ์ด ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„ํฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ ์ƒํƒœ์—์„œ ์ถ”์ •์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์†Œ ๋А์Šจํ•˜๋‹ค.

๊ฐœ๋žต์ ์ธ ์•„ํ‚คํ…์ฒ˜

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

 

3๋‹จ๊ณ„ : ์ƒ์„ธ ์„ค๊ณ„

์ฒ˜๋ฆฌ์œจ ์ œํ•œ ๊ทœ์น™

  • ์˜ˆ์‹œ 1 : ์‹œ์Šคํ…œ์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์ผ€ํŒ… ๋ฉ”์‹œ์ง€์˜ ์ตœ๋Œ€์น˜๋Š” ํ•˜๋ฃจ 5๊ฐœ
  • ์˜ˆ์‹œ 2 : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ถ„๋‹น 5ํšŒ ์ด์ƒ ๋กœ๊ทธ์ธ ํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œ
  • ์ด๋Ÿฐ ๊ทœ์น™๋“ค์€ ๋ณดํ†ต ์„ค์ • ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋””์Šคํฌ์— ์ €์žฅ๋œ๋‹ค.

 

์ฒ˜๋ฆฌ์œจ ํ•œ๋„ ์ดˆ๊ณผ ํŠธ๋ž˜ํ”ฝ์˜ ์ฒ˜๋ฆฌ

  • ์–ด๋–ค ์š”์ฒญ์ด ํ•œ๋„ ์ œํ•œ์— ๊ฑธ๋ฆฌ๋ฉด API๋Š” 429 ์‘๋‹ต(too many requests)์„ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ธ๋‹ค.
  • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ํ•œ๋„ ์ œํ•œ์— ๊ฑธ๋ฆฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ์— ๋ณด๊ด€ํ•œ๋‹ค. (e.g. ์ฃผ๋ฌธ ์‹œ์Šคํ…œ)
  • ํด๋ผ์ด์–ธํŠธ๋Š” HTTP ์‘๋‹ต ํ—ค๋”๋ฅผ ๋ณด๊ณ  ์ œํ•œ์— ๊ฑธ๋ฆด ๋•Œ๊นŒ์ง€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    • X-Ratelimit-Remaining : ์œˆ๋„ ๋‚ด์— ๋‚จ์€ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ์š”์ฒญ์˜ ์ˆ˜
    • X-Ratelimit-Limit : ๋งค ์œˆ๋„๋งˆ๋‹ค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์˜ ์ˆ˜
    • X-Ratelimit-Retry-After : ํ•œ๋„ ์ œํ•œ์— ๊ฑธ๋ฆฌ์ง€ ์•Š์œผ๋ ค๋ฉด ๋ช‡ ์ดˆ ๋’ค์— ๋‹ค์‹œ ์‹œ๋„ํ•ด์•ผ ํ•˜๋Š”์ง€

 

์ƒ์„ธ ์„ค๊ณ„

  1. ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ๊ทœ์น™์€ ๋””์Šคํฌ์— ๋ณด๊ด€. ์ž‘์—… ํ”„๋กœ์„ธ์Šค๋Š” ์ˆ˜์‹œ๋กœ ๊ทœ์น™์„ ๋””์Šคํฌ์—์„œ ์ฝ์–ด์„œ ์บ์‹œ์— ์ €์žฅ.
  2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋ณด๋‚ด๋ฉด ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ๋ฏธ๋“ค์›จ์–ด์— ๋จผ์ € ๋„๋‹ฌํ•จ
  3. ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ๋ฏธ๋“ค์›จ์–ด๋Š” ์ œํ•œ ๊ทœ์น™์„ ์บ์‹œ์—์„œ ๊ฐ€์ ธ์˜ด. ์นด์šดํ„ฐ ๋ฐ ๋งˆ์ง€๋ง‰ ์š”์ฒญ์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋ ˆ๋””์Šค์—์„œ ๊ฐ€์ ธ์˜ด.
    1. ์ฒ˜๋ฆฌ์œจ ์ œํ•œ์— ๊ฑธ๋ฆฌ์ง€ ์•Š์œผ๋ฉด API ์„œ๋ฒ„๋กœ ๋ณด๋ƒ„
    2. ์ฒ˜๋ฆฌ์œจ ์ œํ•œ์— ๊ฑธ๋ ธ๋‹ค๋ฉด 429๋กœ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ตํ•˜๊ณ , ๋ฉ”์‹œ์ง€๋ฅผ ๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€ ํ์— ๋ณด๊ด€

 

๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜์˜ ๊ตฌํ˜„

  • ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„์™€ ๋ณ‘๋ ฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ™•์žฅํ•  ๋•Œ, ๊ฒฝ์Ÿ ์กฐ๊ฑด๊ณผ ๋™๊ธฐํ™” ์ด์Šˆ๋ฅผ ํ’€์–ด์•ผ ํ•œ๋‹ค.
  • ๊ฒฝ์Ÿ ์กฐ๊ฑด
    • ๋ฌธ์ œ : ์„œ๋กœ ๋‹ค๋ฅธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ‘๋ ฌ๋กœ counter ๊ฐ’์„ ์ฝ์–ด์„œ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
    • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• :
      • ๋ฝ(lock)์€ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค.
      • ๋ ˆ๋””์Šค์—์„œ ๋ฃจ์•„ ์Šคํฌ๋ฆฝํŠธ(Lua Script)๋ฅผ ๋Œ๋ ค์„œ, ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์š”์ฒญ์ด ๊ฐ„์„ญํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค.
      • ๋ ˆ๋””์Šค์˜ ์ •๋ ฌ ์ง‘ํ•ฉ(sorted set) ์ž๋ฃŒ ๊ตฌ์กฐ ์‚ฌ์šฉ
  • ๋™๊ธฐํ™” ์ด์Šˆ
    • ๋ฌธ์ œ : ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ด์ง
    • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• :
      • ๊ณ ์ • ์„ธ์…˜์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์€ ํ•ญ์ƒ ๊ฐ™์€ ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜๋กœ ๋ณด๋‚ด๊ฒŒ ํ•œ๋‹ค. (๊ทœ๋ชจ ํ™•์žฅ์ด ์–ด๋ ต๊ณ  ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง)
      • ๋ ˆ๋””์Šค์™€ ๊ฐ™์€ ์ค‘์•™ ์ง‘์ค‘ํ˜• ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์“ด๋‹ค.

 

โœ”๏ธ ์˜ค๋Š˜ ์ฝ์€ ์†Œ๊ฐ

์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜๋Š” ์„œ๋ฒ„์ธก์ด๋‚˜ ๋ณ„๋„์˜ ๋ฏธ๋“ค์›จ์–ด์— ๋‘๋ฉฐ, ์„œ๋น„์Šค/์‚ฌ์šฉ์ž/IP/API ๋‹จ์œ„๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋˜ํ•œ ๋ ˆ๋””์Šค์™€ ๊ฐ™์€ ์บ์‹œ๋ฅผ ๋‘์–ด ์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ณ , ํ•œ๋„์— ๋‹ค๋‹ค๋ฅด๋ฉด ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋ฉ”์‹œ์ง€ ํ์— ์ €์žฅํ•˜๊ณ  429 ์‘๋‹ต์„ ์ฃผ๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๊ฒฝ์Ÿ ์กฐ๊ฑด ๋ฐœ์ƒ ์‹œ ๋ฃจ์•„์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ๋ ˆ๋””์Šค ์ •๋ ฌ ์ง‘ํ•ฉ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ณ„๋„์˜ ๋ฏธ๋“ค์›จ์–ด๋กœ ์ฒ˜๋ฆฌ์œจ์„ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ „๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

โœ”๏ธ ๊ถ๊ธˆํ•œ ๋‚ด์šฉ & ์ž˜ ์ดํ•ด๋˜์ง€ ์•Š๋Š” ๋‚ด์šฉ

๋ฃจ์•„ ์Šคํฌ๋ฆฝํŠธ(Lua script)

  • Lua๋ผ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ. 
  • ๋ ˆ๋””์Šค 2.6 ๋ฒ„์ „๋ถ€ํ„ฐ ๋ฃจ์•„ ์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ถ”๊ฐ€๋˜์–ด, ๋ ˆ๋””์Šค ์„œ๋ฒ„์—์„œ ๋ฃจ์•„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋ ˆ๋””์Šค ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฌถ์–ด ์‹คํ–‰ํ•˜๊ณ , ์ด๋Š” ์›์ž์ (atomic)์œผ๋กœ ์‹คํ–‰๋˜์–ด ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋™์ผ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ๊ฒฝ์Ÿ ์กฐ๊ฑด ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ ˆ๋””์Šค ์ •๋ ฌ ์ง‘ํ•ฉ(Sorted set)

  • Set ์ž๋ฃŒ๊ตฌ์กฐ์— Score๋ฅผ ์ถ”๊ฐ€๋กœ ๊ธฐ๋กํ•˜์—ฌ score๊ฐ€ ๋‚ฎ์€ ์ˆœ์„œ๋ถ€ํ„ฐ ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ.
  • Sorted Set ์ž์ฒด๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. score๋ฅผ ํƒ€์ž„์Šคํƒฌํ”„๋กœ ์„ค์ •ํ•˜์—ฌ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์˜ ์ˆœ์„œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โœ”๏ธ ์ฐธ๊ณ 

https://dev.gmarket.com/69

https://redis.io/docs/latest/develop/data-types/sorted-sets/

https://velog.io/@hgs-study/redis-sorted-set

https://mahdie-asiyaban.medium.com/implementing-scalable-rate-limiting-in-a-distributed-environment-with-lua-scripts-and-redis-sorted-3d743ab8734a