Rate limiting

요청 속도 제한

Limit requests within a time window to reduce abuse.

···
html
<div class="sd"><div class="sd-head"><strong>RATE LIMIT</strong><span id="state">live check</span></div><div class="sd-stage"><div class="counter">window: <b id="used">0</b> / 3</div><div class="slots"><i></i><i></i><i></i><i></i></div><div class="result" id="result">200</div></div><div class="sd-foot"><span id="caption">checking boundary</span><span>tap to step</span></div></div>
css
.sd{box-sizing:border-box;width:min(94vw,700px);height:min(86vh,318px);padding:clamp(9px,2.3vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);display:flex;flex-direction:column;gap:clamp(6px,1.8vmin,12px);font:600 clamp(12px,2.6vmin,16px)/1.25 var(--font-sans, sans-serif)}.sd *{box-sizing:border-box}.sd-head,.sd-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:1.25em}.sd-head strong{color:var(--accent);letter-spacing:.06em}.sd-head span,.sd-foot{color:var(--muted)}.sd-foot{font-size:clamp(12px,2.4vmin,14px)}.sd-stage{position:relative;flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:clamp(6px,2vmin,18px);overflow:hidden}.sd .mono{font-family:ui-monospace,monospace}.sd .tile{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(5px,1.5vmin,10px);text-align:center}.sd .good{color:var(--accent);border-color:var(--accent)}.sd .bad{color:var(--accent-3);border-color:var(--accent-3)}.sd .arrow{color:var(--muted);font-size:clamp(15px,4vmin,28px)}.sd .active{background:color-mix(in srgb,var(--accent) 16%,var(--surface));border-color:var(--accent)}.sd .blocked{background:color-mix(in srgb,var(--accent-3) 13%,var(--surface));border-color:var(--accent-3)}.sd-stage{flex-direction:column}.counter{font-family:ui-monospace,monospace}.slots{display:flex;gap:clamp(5px,2vmin,13px)}.slots i{display:block;width:clamp(26px,9vmin,56px);height:clamp(26px,9vmin,56px);border:2px solid var(--line);border-radius:50%;background:var(--bg);transition:background .2s}.slots i.fill{background:var(--accent);border-color:var(--accent)}.slots i.reject{background:var(--accent-3);border-color:var(--accent-3)}.result{font:800 clamp(14px,4vmin,24px) ui-monospace,monospace;color:var(--accent)}
js
let n=0;function advance(){n=(n+1)%4;document.getElementById('used').textContent=Math.min(n+1,3);document.querySelectorAll('.slots i').forEach((el,i)=>{el.classList.toggle('fill',i<=n&&i<3);el.classList.toggle('reject',i===3&&n===3)});document.getElementById('result').textContent=n===3?'429':'200';document.getElementById('result').style.color=n===3?'var(--accent-3)':'var(--accent)';document.getElementById('state').textContent=n===3?'budget exceeded':'request allowed';document.getElementById('caption').textContent=n===3?'fourth request waits for reset':'request '+(n+1)+' consumes one slot'}advance();setInterval(advance,650);
document.querySelector('.sd').addEventListener('pointerdown',advance);

Rate limiting places a request budget on a user, token, IP, or other key over a time window. It helps reduce credential guessing and bursts against expensive APIs.

Four requests enter a window with three slots in the demo; the fourth receives 429. Choose the identity key and shared state carefully in distributed systems, and tell legitimate callers when to retry.

When to use

Use it on sign-in, search, and costly endpoints exposed to abuse or bursts.

Open as page ↗