Positif Palsu Perjalanan Mustahil: VPN, Waktu, dan Data Lokasi
Perjalanan mustahil membandingkan lokasi hasil-IP sebuah login dengan titik tersimpan sebelumnya untuk pengguna tersebut dan menandai kecepatan tersirat yang secara fisik mustahil ditempuh dalam waktu yang berlalu. Hasil high berarti perhitungan jarak-per-waktu mentah melewati sebuah ambang batas — ini sendiri bukan bukti pengambilalihan akun, dan beberapa situasi biasa bisa memicunya.
Perhitungan di balik skor tersebut
POST /v1/risk/check menghitung great-circle distance antara lokasi tersimpan sebelumnya milik pengguna dan lokasi saat ini, membaginya dengan waktu yang berlalu sejak observasi sebelumnya tersebut, dan mengklasifikasikan kecepatan tersirat: di bawah 500 km/jam adalah low, 500–900 km/jam adalah medium, di atas 900 km/jam adalah high (impossibleTravel: true). Sebuah penerbangan jarak jauh yang nyata bisa mendarat mendekati batas medium/high, itulah sebabnya ambang batas ini ada sebagai rentang, bukan satu titik potong tunggal — tetapi perhitungan itu sendiri tidak punya konsep "penerbangan," "VPN," atau "jaringan bersama"; ia hanya melihat dua titik dan sebuah durasi.
Observasi pertama tidak pernah ditandai
Pemeriksaan pertama seorang pengguna tidak punya apa pun untuk dibandingkan: ia selalu mengembalikan risk: "low" dengan previousLocation null dan nilai distance/speed/elapsed null, dan (kecuali commit: false) menjadi baseline tersimpan yang baru. Ini berarti login pertama dari perangkat atau jaringan baru membangun kepercayaan secara default — penting untuk diketahui jika tindakan pertama seorang penyerang juga tidak ditandai karena alasan struktural yang sama.
Situasi yang umumnya memicu positif palsu
Berpindah exit node VPN atau gateway jaringan seluler antar-login bisa memindahkan lokasi hasil resolusi dengan jarak jauh tanpa ada perjalanan nyata sama sekali — v1 belum punya penekanan yang sadar VPN atau pusat data, jadi ini terbaca identik dengan perjalanan mustahil yang sungguhan. Perputaran IP operator seluler yang biasa (lokasi fisik yang sama diselesaikan ke kota gateway yang berbeda pada request yang berbeda) dan rentang IP bersama/anycast bisa menghasilkan efek yang sama. Tidak satu pun dari ini melibatkan penyerang; semuanya adalah artefak dari cara kerja lokasi hasil-IP, dibahas lebih dalam di artikel accuracy.
Apa yang tidak dibuktikan oleh skor high
risk: "high" adalah sinyal mentah dari sebuah perhitungan jarak-per-waktu — bukan event pengambilalihan akun yang terverifikasi, bukan bukti tentang siapa yang memulai login tersebut, dan bukan informasi tentang apakah kredensial pengguna benar-benar dikompromikan. Perlakukan ini sebagai satu input untuk keputusan peninjauan atau step-up authentication Anda sendiri, dikombinasikan dengan bukti autentikasi yang sudah Anda miliki, bukan putusan berdiri sendiri untuk ditindaklanjuti sendirian.
Contoh dua-observasi
Baseline tersimpan seorang pengguna adalah Toronto, diobservasi pada 09:00 UTC. Sebuah login datang dari IP yang diselesaikan ke Frankfurt pada 09:45 UTC — kira-kira 6.400 km dalam 45 menit, kecepatan tersirat jauh di atas 900 km/jam, sehingga ini mengembalikan risk: "high" dan impossibleTravel: true. Hasil itu konsisten dengan salah satu dari: akun yang dikompromikan digunakan dari benua lain, atau trafik pengguna sah yang sama tiba-tiba dirutekan lewat exit VPN Frankfurt karena alasan yang tidak berkaitan — API mengembalikan klasifikasi yang sama pada kedua kasus, itulah tepatnya mengapa ini dirancang sebagai satu input untuk peninjauan, bukan pemblokiran otomatis.
Apa yang tidak diklaim oleh artikel ini
Ini menjelaskan implementasi v1 milik Watch-IP sendiri. Ini tidak mengklaim deteksi pengambilalihan akun yang komprehensif, analisis perilaku, atau device fingerprinting — itu adalah teknik berbeda yang tidak dicoba oleh endpoint ini. Ketersediaan dan penerapan paket-risiko independen untuk endpoint ini belum dikonfirmasi; hubungi kami sebelum mengandalkannya di produksi.
Sumber
Ditulis oleh tim editorial Watch-IP, 6 September 2026. Ditinjau berdasarkan apps/api/src/lib/risk.ts dan apps/api/src/durable-objects/session-risk.ts.