<?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 their IP address much faster than most security teams can update a rule.&lt;/p&gt;
&lt;p&gt;Residential proxy services make this easy. One request might come through a home internet connection in Sydney, the next through a mobile network in Melbourne, and the next through an IP address that has never appeared on a blocklist.&lt;/p&gt;
&lt;p&gt;If you only count requests by IP address, these can look like several unrelated visitors generating very little traffic. In reality, they may all belong to the same operator running the same attack.&lt;/p&gt;
&lt;p&gt;It is tempting to replace the IP address with another identifier, but no single identifier works in every situation. Browser and network fingerprints, cookies, accounts, API keys and request patterns can all help connect related activity. They can also be copied, shared, cleared or changed.&lt;/p&gt;
&lt;p&gt;The goal is not to identify a specific person. It is to recognise enough continuity to control the abusive behaviour.&lt;/p&gt;
&lt;h2&gt;Look at What Stayed the Same&lt;/h2&gt;
&lt;p&gt;When IP addresses keep changing, look for other parts of the activity that remain consistent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the same account or group of accounts&lt;/li&gt;
&lt;li&gt;repeated usernames or passwords&lt;/li&gt;
&lt;li&gt;the same API token, tenant or application&lt;/li&gt;
&lt;li&gt;similar browser or network fingerprints&lt;/li&gt;
&lt;li&gt;the same pages, API routes or parameters&lt;/li&gt;
&lt;li&gt;similar timing, retries and failures&lt;/li&gt;
&lt;li&gt;traffic from a narrow group of networks or countries&lt;/li&gt;
&lt;li&gt;repeated access to the same products, records or other resources&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One signal may not mean much on its own. Several signals pointing in the same direction can provide enough evidence to limit, challenge or block the activity.&lt;/p&gt;
&lt;p&gt;Google’s investigation into IPIDEA, for example, found residential proxy infrastructure being sold through several SDK brands and resellers. Provider names and IP addresses may change even when the underlying network remains connected.&lt;/p&gt;
&lt;h2&gt;Fingerprints Group Similar Clients&lt;/h2&gt;
&lt;p&gt;A TLS fingerprint describes the shape of a secure connection. It can show that several connections look similar, but it cannot prove they came from the same person, device or program.&lt;/p&gt;
&lt;p&gt;This distinction matters because many legitimate users share the same browser fingerprint. Attack tools can also copy the fingerprints of popular browsers.&lt;/p&gt;
&lt;p&gt;A fingerprint becomes more useful when combined with what the client is doing. One successful login from a common browser fingerprint is normal. The same fingerprint trying passwords against thousands of accounts through rotating residential proxies is much more significant.&lt;/p&gt;
&lt;p&gt;You must also know where the fingerprint was captured. If your application sits behind a CDN, the connection visible at the origin may belong to the CDN rather than the visitor. Only compare fingerprints captured at equivalent, trusted points.&lt;/p&gt;
&lt;h2&gt;Build Limits Around the Behaviour&lt;/h2&gt;
&lt;p&gt;Rate limits should protect the action being abused, rather than relying on a single technical identifier.&lt;/p&gt;
&lt;p&gt;For credential stuffing, you might count:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;failed attempts against each account&lt;/li&gt;
&lt;li&gt;failed logins from the same fingerprint group&lt;/li&gt;
&lt;li&gt;failures across many accounts with similar request patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For scraping, you might count:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;access to a group of related products or records&lt;/li&gt;
&lt;li&gt;API operations performed by the same credential&lt;/li&gt;
&lt;li&gt;repeated requests that create a high application cost&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For fake account creation, you might count:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sign-up attempts from a similar device group&lt;/li&gt;
&lt;li&gt;repeated verification failures&lt;/li&gt;
&lt;li&gt;the number of accounts created across changing IP addresses&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use several counters where needed. A per-account limit protects an individual account. A broader fingerprint-based limit can detect activity spread across many accounts. A traditional IP limit still catches simple bursts.&lt;/p&gt;
&lt;p&gt;No single counter needs to detect the entire campaign.&lt;/p&gt;
&lt;p&gt;Be careful not to make the grouping too broad. A current browser release or widely used mobile application may place many legitimate users into the same fingerprint group. Before blocking anything, check how large the group is and how many requests lead to successful, legitimate outcomes.&lt;/p&gt;
&lt;p&gt;Large, common groups may be useful for investigation, but they are rarely safe to block on their own.&lt;/p&gt;
&lt;h2&gt;Request Sequences Reveal the Job&lt;/h2&gt;
&lt;p&gt;Automation often follows the same process even when its IP address changes.&lt;/p&gt;
&lt;p&gt;A normal login session might:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;load the login page&lt;/li&gt;
&lt;li&gt;obtain a security token&lt;/li&gt;
&lt;li&gt;submit one set of credentials&lt;/li&gt;
&lt;li&gt;establish a session&lt;/li&gt;
&lt;li&gt;continue to the expected page&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A credential-stuffing tool may skip most of those steps. It might call the login endpoint directly, submit a password, receive a failure, switch accounts and repeat.&lt;/p&gt;
&lt;p&gt;Each request may look harmless in isolation. The repeated sequence reveals what the traffic is trying to achieve.&lt;/p&gt;
&lt;p&gt;Security controls do not need to build a permanent profile of an individual. They only need enough recent history to decide whether a sensitive part of the application is being used as intended.&lt;/p&gt;
&lt;h2&gt;Expect the Traffic to Change&lt;/h2&gt;
&lt;p&gt;Once a security rule starts working, the attacker will often adapt.&lt;/p&gt;
&lt;p&gt;They may:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;randomise request headers&lt;/li&gt;
&lt;li&gt;imitate different browsers&lt;/li&gt;
&lt;li&gt;send requests more slowly&lt;/li&gt;
&lt;li&gt;spread activity across more fingerprints&lt;/li&gt;
&lt;li&gt;move to another page or API route&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This does not mean the original rule failed. It means the attacker had to spend time and resources changing their approach.&lt;/p&gt;
&lt;p&gt;Keep a record of what happened after each rule change, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;when the rule was activated&lt;/li&gt;
&lt;li&gt;which signals and limits it used&lt;/li&gt;
&lt;li&gt;how many requests were allowed, limited, challenged or blocked&lt;/li&gt;
&lt;li&gt;whether legitimate customers still completed their actions&lt;/li&gt;
&lt;li&gt;how much load reached the application&lt;/li&gt;
&lt;li&gt;which new fingerprints or routes appeared afterwards&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rules should also have a review or expiry date. Browser versions, network fingerprints and normal traffic patterns change over time. A rule created during an incident should not remain in place forever without being reviewed.&lt;/p&gt;
&lt;h2&gt;Treat Continuity as Evidence, Not Identity&lt;/h2&gt;
&lt;p&gt;The important question is not whether you have identified the attacker.&lt;/p&gt;
&lt;p&gt;The better question is whether a group of requests shares enough evidence to be counted and controlled together.&lt;/p&gt;
&lt;p&gt;Start with one abused route. Compare a basic IP limit with a small number of combined signals. Measure failed attempts, legitimate completions, group sizes and application load.&lt;/p&gt;
&lt;p&gt;Then apply a reversible action, such as a temporary rate limit or challenge, to the combination that best separates abusive activity from real customers.&lt;/p&gt;
&lt;p&gt;The IP address will keep changing. Effective controls follow the behaviour rather than 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>