<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Peakhour.IO - Rate Limiting</title><link href="https://www.peakhour.io/" rel="alternate"></link><link href="https://www.peakhour.io/feeds/rate-limiting.atom.xml" rel="self"></link><id>https://www.peakhour.io/</id><updated>2026-08-01T11:20:00+10:00</updated><entry><title>The IP Changed. Did the Actor?</title><link href="https://www.peakhour.io/blog/correlate-actors-across-rotating-ips/" rel="alternate"></link><published>2026-08-01T11:20:00+10:00</published><updated>2026-08-01T11:20:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-08-01:/blog/correlate-actors-across-rotating-ips/</id><summary type="html">&lt;p&gt;Residential proxy rotation defeats IP-only counters. The answer is not a new identity claim, but a carefully chosen set of cohort, account, route, and outcome keys.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An attacker can change an IP address faster than most teams can change a rule.&lt;/p&gt;
&lt;p&gt;Residential proxy services make that rotation routine. A client can send one request through a household connection in Sydney, the next through a mobile network in Melbourne, and another through an address that has never appeared in a reputation feed. An IP-only counter sees three quiet sources. The application may still be dealing with one operator and one campaign.&lt;/p&gt;
&lt;p&gt;The tempting response is to find a replacement identifier. There is no universal one.&lt;/p&gt;
&lt;p&gt;Network fingerprints, browser attributes, cookies, accounts, API keys, timing, and route sequences can all help correlate requests. Each can also be shared, copied, cleared, or changed. The practical goal is not to prove a person. It is to keep enough continuity to control a specific behaviour.&lt;/p&gt;
&lt;h2&gt;Ask What Stayed the Same&lt;/h2&gt;
&lt;p&gt;When addresses rotate, look for continuity in the work being attempted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the same account or set of accounts;&lt;/li&gt;
&lt;li&gt;a repeated username or credential corpus;&lt;/li&gt;
&lt;li&gt;one API token, tenant, or application identifier;&lt;/li&gt;
&lt;li&gt;a stable TLS or HTTP fingerprint cohort;&lt;/li&gt;
&lt;li&gt;the same route sequence and parameter shape;&lt;/li&gt;
&lt;li&gt;similar timing, retries, and failure outcomes;&lt;/li&gt;
&lt;li&gt;a narrow set of ASNs, countries, or network categories;&lt;/li&gt;
&lt;li&gt;consistent application cost or object enumeration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One field may be weak. Several observations agreeing can support a bounded action.&lt;/p&gt;
&lt;p&gt;Google's &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/disrupting-largest-residential-proxy-network"&gt;IPIDEA investigation&lt;/a&gt; described shared residential proxy infrastructure supplied through multiple SDK brands and reseller arrangements. That is useful context for defenders: provider names and exit addresses can change while the commercial path behind them remains connected.&lt;/p&gt;
&lt;h2&gt;Fingerprints Group Clients; They Do Not Name Them&lt;/h2&gt;
&lt;p&gt;A TLS fingerprint can reveal that connections share a normalised handshake shape. It cannot establish that they came from the same person, device, or process.&lt;/p&gt;
&lt;p&gt;This distinction matters because popular browsers create large cohorts. Attack tools can also imitate common handshakes. Our article &lt;a href="/blog/fingerprint-is-a-cohort-not-a-client/"&gt;A Network Fingerprint Is a Cohort, Not a Client&lt;/a&gt; covers the boundary in detail.&lt;/p&gt;
&lt;p&gt;Use a versioned fingerprint as one grouping key:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;method + version + value + capture point
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then join it to the route and outcome. A common fingerprint that submits one successful login is uninteresting. The same cohort trying passwords against thousands of accounts through rotating residential networks is operationally useful.&lt;/p&gt;
&lt;p&gt;Fingerprint provenance matters as much here as it does in API protection. At an origin behind a CDN, the visible connection may be the CDN hop. Only compare values captured at equivalent, trusted points.&lt;/p&gt;
&lt;h2&gt;Build Counters Around the Abuse&lt;/h2&gt;
&lt;p&gt;&lt;a href="/products/advanced-rate-limiting/"&gt;Peakhour Advanced Rate Limiting&lt;/a&gt; can use route, headers, ASN, country, IP, TLS fingerprint, response code, and bot state as concrete inputs. The right key depends on what needs protection.&lt;/p&gt;
&lt;p&gt;For credential stuffing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;account + failed outcome
fingerprint cohort + login route + failed outcome
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For scraping:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;fingerprint cohort + resource family
API credential + operation + cost class
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For account creation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;device cohort + signup route + verification outcome
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Use more than one counter when the abuse can move between dimensions. A per-account limit protects one user. A cohort-wide limit sees distribution across accounts. A per-IP limit still catches crude bursts. No single key has to solve the campaign.&lt;/p&gt;
&lt;p&gt;Avoid the opposite error: a key so broad that it turns a shared mobile SDK or current browser release into one actor. Before enforcement, inspect bucket sizes and successful outcomes. If one cohort contains a material part of normal traffic, it is an observation key, not a direct blocking key.&lt;/p&gt;
&lt;h2&gt;Route Sequence Can Carry Continuity&lt;/h2&gt;
&lt;p&gt;Automation often performs the same steps even when its network changes.&lt;/p&gt;
&lt;p&gt;A normal account session might load a page, obtain a token, submit one credential, establish a session, and continue to an expected destination. A distributed credential campaign may call the login endpoint directly, repeat a narrow header set, receive the same failure, change the account, and start again.&lt;/p&gt;
&lt;p&gt;The individual requests are small. The sequence exposes the job.&lt;/p&gt;
&lt;p&gt;Keep this evidence purpose-bound. A security control does not need to build a permanent profile of a person. It needs enough recent history to decide whether a sensitive route is being used as intended. Our &lt;a href="/blog/privacy-respecting-account-security-risk-signals/"&gt;Account Security Without Tracking People&lt;/a&gt; explains that privacy boundary.&lt;/p&gt;
&lt;h2&gt;Expect the Actor to Adapt&lt;/h2&gt;
&lt;p&gt;Once a counter begins to work, the traffic will change. The operator may randomise headers, switch browser versions, slow the cadence, distribute accounts across more cohorts, or move to another route.&lt;/p&gt;
&lt;p&gt;That does not make the original control a failure. It means the campaign has paid an adaptation cost. Keep the decision record so the next change is visible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;policy revision and activation time;&lt;/li&gt;
&lt;li&gt;key dimensions and thresholds;&lt;/li&gt;
&lt;li&gt;allowed, limited, challenged, and blocked counts;&lt;/li&gt;
&lt;li&gt;successful business outcomes;&lt;/li&gt;
&lt;li&gt;origin and application cost;&lt;/li&gt;
&lt;li&gt;new cohorts and routes after enforcement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Set an expiry or review date. Fingerprint populations and browser versions drift. Emergency rules should not survive their evidence by default.&lt;/p&gt;
&lt;h2&gt;Continuity Is a Working Hypothesis&lt;/h2&gt;
&lt;p&gt;The honest question is not “did we identify the actor?” It is “do these requests share enough evidence that one control should count them together?”&lt;/p&gt;
&lt;p&gt;That wording leaves room for uncertainty. It also produces a policy an operator can test.&lt;/p&gt;
&lt;p&gt;Start with one abused route. Compare IP-only counters with a small number of composite candidates. Observe bucket size, legitimate completion, failed outcomes, and origin cost. Apply a reversible action to the key that separates the behaviour without turning a common client cohort into collateral damage.&lt;/p&gt;
&lt;p&gt;The IP will change. A well-built control follows the work, not the address.&lt;/p&gt;</content><category term="Rate Limiting"></category><category term="Rate Limiting"></category><category term="Residential Proxies"></category><category term="Network Fingerprinting"></category><category term="Bot Management"></category><category term="API Security"></category></entry><entry><title>Beyond the IP Address</title><link href="https://www.peakhour.io/blog/beyond-the-ip-address-advanced-rate-limiting/" rel="alternate"></link><published>2025-09-01T00:00:00+10:00</published><updated>2025-09-01T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2025-09-01:/blog/beyond-the-ip-address-advanced-rate-limiting/</id><summary type="html">&lt;p&gt;Discover why traditional IP-based rate limiting is obsolete and how advanced techniques provide robust protection against modern distributed attacks.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For years, &lt;a href="/learning/api-protection/what-is-api-rate-limiting/"&gt;rate limiting&lt;/a&gt; has been a standard control for protecting websites and APIs from abuse. The basic model is simple: limit the number of requests a single "user" can make in a given period. If a user exceeds the limit (e.g., 10 login attempts in a minute), they are temporarily blocked.&lt;/p&gt;
&lt;p&gt;The hard part has always been identifying that "user". Traditionally, the answer was the IP address. The assumption was that one IP address equaled one user. In the early days of the internet, this was a reasonable approximation. Today, that assumption no longer holds, and it leaves systems exposed to modern attacks.&lt;/p&gt;
&lt;p&gt;The IP address is no longer a reliable identifier for a single user or device. There are three common reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Proxy Networks&lt;/strong&gt;: Attackers don't use a single IP address. They use large residential proxy networks to rotate requests through thousands or even millions of different IP addresses, making each request look like it comes from a new user.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared IPs (CGNAT)&lt;/strong&gt;: At the same time, a single IP address can represent thousands of legitimate users. Mobile carriers use Carrier-Grade NAT (CGNAT) to make many mobile devices share the same public IP. Similarly, an entire office building or university campus might appear to the internet as a single IP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distributed Attacks&lt;/strong&gt;: Modern automated attacks, like Layer 7 DDoS or credential stuffing, are inherently distributed. Attackers use botnets or proxy networks to spread their attack across a large number of IPs, so no single IP ever exceeds a traditional rate limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Blocking a shared IP because of one bad actor can cause collateral damage, denying access to thousands of legitimate users. On the other side, failing to see that thousands of IPs are part of a single coordinated attack means the attack succeeds. Traditional IP-based rate limiting is no longer enough.&lt;/p&gt;
&lt;h2&gt;The New Way: Advanced Rate Limiting&lt;/h2&gt;
&lt;p&gt;Advanced Rate Limiting addresses this by moving beyond the IP address. Instead of grouping requests by a single, unreliable identifier, it lets you count requests using more stable and meaningful characteristics of the connection or the software making it.&lt;/p&gt;
&lt;p&gt;This approach groups requests using identifiers like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TLS/HTTP2 Fingerprints&lt;/strong&gt;: Every client application (like a browser or a script) has a unique "fingerprint" based on how it initiates a secure connection (&lt;a href="/blog/tls-fingerprinting/"&gt;TLS&lt;/a&gt;) or communicates over HTTP/2. This fingerprint remains consistent even as an attacker rotates through thousands of IP addresses. By rate limiting based on the TLS fingerprint, you can track and block the underlying automation tool itself, not just the IPs it uses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Device Characteristics&lt;/strong&gt;: A fingerprint can be constructed from a range of attributes, including the device's operating system, browser version, and more. This allows for the detection of repeated requests coming from the same class of device.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Combination of Headers&lt;/strong&gt;: For authenticated APIs, you can group requests by an Authorization header or API key, enforcing fair usage and preventing abuse by a single authenticated client.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Practical Use Cases&lt;/h2&gt;
&lt;p&gt;The value of advanced rate limiting is clearest when it is applied to real-world threats:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mitigating Distributed Credential Stuffing&lt;/strong&gt;: An attacker using a tool like &lt;a href="/blog/the-rise-of-openbullet/"&gt;OpenBullet&lt;/a&gt; launches a credential stuffing attack against your login page, rotating through thousands of residential proxy IPs. Traditional rate limiting is ineffective here. However, the OpenBullet software has a consistent TLS fingerprint. By setting a rule to limit failed login attempts per TLS fingerprint, you can detect and block the entire distributed attack, regardless of how many IPs are involved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Protecting APIs from Abuse&lt;/strong&gt;: A partner is abusing their API key, sending far too many requests and degrading service for other users. By rate limiting based on the &lt;code&gt;Authorization&lt;/code&gt; header, you can enforce usage limits on a per-client basis, keeping access fair without affecting other users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stopping Content Scrapers&lt;/strong&gt;: A scraper is hammering your e-commerce site to steal pricing data. They are using a botnet to distribute the requests across hundreds of IPs. However, the scraping script has a unique combination of a user-agent and a TLS fingerprint. Advanced rate limiting can count requests based on this combined signature and block the scraper, protecting your intellectual property.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When attackers are distributed, your defences need to see the single actor behind the many IPs. Advanced rate limiting provides that visibility and should be part of a modern application security strategy.&lt;/p&gt;</content><category term="Rate Limiting"></category><category term="Rate Limiting"></category><category term="DDoS"></category><category term="API Security"></category><category term="Residential Proxies"></category><category term="Bot Management"></category><category term="Account Protection"></category></entry></feed>