Account takeover rarely begins with a dramatic exploit. It begins with a valid password used from a device, network, and automation stack the account has never seen. That makes password-only rules a poor boundary: by the time the credential is proven stolen, the attacker is already inside the login flow.

What to check before authentication completes

Evaluate the request before issuing a session, but keep the decision proportional to the evidence. Network intelligence can identify datacenter space, VPN exits, Tor, and residential proxies. Device signals can reveal automation, tampering, and links to other accounts. Velocity adds the missing context: one unfamiliar login is normal; hundreds of unfamiliar logins in a minute are not.

  • Network: classify the source without treating a VPN as proof of abuse.
  • Device: look for automation and reuse across accounts.
  • Velocity: compare attempts by account, device, IP, and ASN.
  • History: compare the current request with the account's normal pattern.

Use step-up authentication instead of a blanket block

A new country or a privacy relay should not strand a real customer. Combine signals into tiers: allow familiar sessions, ask for an additional factor when the evidence is mixed, and block only when several independent signals agree.

const verdict = await sentinel.evaluate({ token, accountId, ip, device });
if (verdict.decision === 'block') return deny();
if (verdict.decision === 'review') return requireWebAuthnOrOtp();
return createSession();

Bottom line

Account takeover detection works best as a layered pre-authentication decision, not as a second password check.