Valse positieven bij onmogelijke reizen: VPN's, timing en locatiegegevens
Onmogelijke reis vergelijkt de IP-afgeleide locatie van een inlog met het vorige opgeslagen punt voor die gebruiker en signaleert een impliciete snelheid die fysiek onmogelijk zou zijn om in de verstreken tijd af te leggen. Een hoog resultaat betekent dat de ruwe berekening van afstand over tijd een drempel heeft overschreden — het is op zichzelf geen bewijs van accountovername, en verschillende alledaagse situaties kunnen dit veroorzaken.
De berekening achter de score
POST /v1/risk/check berekent de kortste-boogafstand tussen de vorige opgeslagen locatie van een gebruiker en de huidige, deelt dit door de verstreken tijd sinds die vorige observatie, en classificeert de impliciete snelheid: onder 500 km/u is low, 500–900 km/u is medium, boven 900 km/u is high (impossibleTravel: true). Een echte langeafstandsvlucht kan dicht bij de grens tussen medium en high landen, en daarom bestaan de drempels als bereiken in plaats van één harde grens — maar de berekening zelf heeft geen begrip van "vlucht", "VPN" of "gedeeld netwerk"; deze ziet alleen twee punten en een tijdsduur.
De eerste observatie wordt nooit gesignaleerd
De allereerste controle van een gebruiker heeft niets om mee te vergelijken: deze geeft altijd risk: "low" terug met een null previousLocation en null-waarden voor afstand/snelheid/verstreken tijd, en wordt (tenzij commit: false) de nieuwe opgeslagen baseline. Dit betekent dat de allereerste inlog vanaf een nieuw apparaat of netwerk standaard vertrouwen vestigt — goed om te weten, aangezien de eerste actie van een aanvaller om dezelfde structurele reden ook niet wordt gesignaleerd.
Situaties die vaak een vals positief veroorzaken
Het wisselen van VPN-exitnodes of gateways van mobiele netwerken tussen inlogs kan de herleide locatie een grote afstand verplaatsen zonder dat er daadwerkelijk is gereisd — v1 heeft geen VPN- of datacenterbewuste onderdrukking, dus dit leest identiek aan een echte onmogelijke reis. Gewone IP-wisselingen van mobiele providers (dezelfde fysieke locatie die bij verschillende verzoeken naar een andere gatewaystad herleidt) en gedeelde/anycast-IP-bereiken kunnen hetzelfde effect veroorzaken. Geen van deze situaties betreft een aanvaller; het zijn artefacten van hoe IP-afgeleide locatie werkt, uitgebreider behandeld in het artikel over nauwkeurigheid.
Wat een hoge score niet bewijst
risk: "high" is een ruw signaal uit een berekening van afstand over tijd — geen bevestigde accountovername, geen bewijs over wie de inlog heeft geïnitieerd, en geen informatie over of de inloggegevens van de gebruiker daadwerkelijk zijn gecompromitteerd. Behandel het als één input voor je eigen beoordeling of beslissing over stap-omhoog-authenticatie, gecombineerd met authenticatiebewijs dat je al hebt, niet als een op zichzelf staand oordeel om alleen op te handelen.
Een voorbeeld met twee observaties
De opgeslagen baseline van een gebruiker is Toronto, geobserveerd om 09:00 UTC. Een inlog komt binnen vanaf een IP-adres dat naar Frankfurt herleidt om 09:45 UTC — ongeveer 6.400 km in 45 minuten, een impliciete snelheid ver boven 900 km/u, dus dit levert risk: "high" en impossibleTravel: true op. Dat resultaat is consistent met zowel een gecompromitteerd account dat vanaf een ander continent wordt gebruikt, als hetzelfde legitieme verkeer van de gebruiker dat plotseling om een niet-gerelateerde reden via een VPN-exit in Frankfurt routeert — de API geeft in beide gevallen dezelfde classificatie terug, en precies daarom is het ontworpen als één input voor beoordeling, geen automatische blokkade.
Wat dit artikel niet beweert
Dit beschrijft de eigen v1-implementatie van Watch-IP. Het claimt geen alomvattende detectie van accountovername, gedragsanalyse of apparaatfingerprinting — dat zijn andere technieken die dit endpoint niet probeert. Beschikbaarheid en onafhankelijke handhaving per risicoabonnementsfamilie voor dit endpoint zijn niet bevestigd; neem contact met ons op voordat je hierop vertrouwt in productie.
Bronnen
Geschreven door de redactie van Watch-IP, 6 september 2026. Getoetst aan apps/api/src/lib/risk.ts en apps/api/src/durable-objects/session-risk.ts.