← Kembali ke blog

Cara Menghindari TLS/JA4-Fingerprinting di 2026: curl_cffi dan Peniruan Browser dalam Praktek

Membeli proxy residensial, tetapi situs tetap memberikan 403 pada permintaan pertama? Anda terdeteksi melalui TLS handshake bahkan sebelum header HTTP. Mari kita bahas JA3/JA4 fingerprinting dan cara menghindarinya dalam lima menit menggunakan curl_cffi dan impersonasi browser β€” dengan kode, pemeriksaan sidik jari, dan pemilihan proxy.

πŸ“…21 Juli 2026
Cara Menghindari TLS/JA4-Fingerprinting di 2026: curl_cffi dan Peniruan Browser dalam Praktek

Anda telah membeli proxy residensial, mengatur User-Agent Chrome yang baru, tetapi situs tetap memberikan 403 pada permintaan pertama. Apakah ini terdengar familiar? Masalahnya bukan pada IP atau header. Anda telah terdeteksi bahkan sebelum server membaca satu pun header HTTP β€” melalui handshake TLS. Pada tahun 2026, ini adalah vektor deteksi nomor 1, dan requests biasa gagal secara otomatis. Mari kita bahas bagaimana ini bekerja dan bagaimana memperbaikinya dengan beberapa baris kode melalui curl_cffi.

Apa yang terjadi: Anda terdeteksi oleh handshake TLS

Ketika klien membuat koneksi HTTPS, ia pertama-tama mengirimkan paket ClientHello β€” bahkan sebelum HTTP. Di dalamnya tercantum: versi TLS, daftar cipher suites yang didukung, ekstensi TLS (SNI, ALPN, supported_groups), kurva eliptik, dan format titik. Urutan dan komposisi bidang ini berbeda-beda di antara klien yang berbeda berbeda β€” dan dari situ klien dapat dikenali sebelum ia mengucapkan sepatah kata pun.

Dari bidang-bidang ini, sebuah sidik jari dihitung. JA3 (standar tahun 2017) mengambil string dalam bentuk TLSVersion,Ciphers,Extensions,EllipticCurves,ECPointFormats dan menghash-nya dengan MD5, menghasilkan tanda tangan 32 karakter. Masalah JA3 adalah bahwa sejak Januari 2023, Chrome mengacak urutan ekstensi β€” 16 ekstensi memberikan 16! (lebih dari 20 triliun) kemungkinan, dan browser yang sama menghasilkan JA3 yang berbeda.

Oleh karena itu, industri beralih ke JA4 (FoxIO, penerapan massal 2024–2025). JA4 mengurutkan kode ekstensi berdasarkan nilai hex sebelum hashing β€” pengacakan Chrome tidak lagi merusaknya. Hash β€” SHA-256 yang dipangkas, format yang mudah dibaca manusia dan terdiri dari tiga bagian (a_b_c), di dalamnya termasuk ALPN dan dukungan QUIC/HTTP3. Contoh: Chrome 124 memberikan t13d1516h2 (15 cipher, 16 ekstensi, ALPN h2), sementara Python requests yang polos memberikan t13d1715h2. Untuk anti-bot, tanda tangan kedua adalah penanda langsung "ini adalah skrip".

Mengapa pada tahun 2026 Anda tidak bisa ke mana-mana tanpa ini

Deteksi JA4 tertanam di semua vendor besar: Cloudflare mencocokkan sidik jari dengan allowlist, Akamai menambahkan hash terpisah untuk frame HTTP/2 SETTINGS, DataDome membandingkan dengan basis data bot yang dikenal. Logikanya sederhana dan mematikan: jika Anda mengirim User-Agent: Chrome 131, tetapi sidik jari TLS berteriak "urllib3/OpenSSL" β€” ini adalah sinkronisasi yang salah, dan Anda akan diblokir seketika. Tidak ada proxy yang menyelamatkan: IP residensial yang sempurna dengan sidik jari Python requests tetap kalah.

Itulah sebabnya kombinasi "proxy + pemalsuan sidik jari" menjadi dasar kebersihan scraping pada tahun 2026, bukan opsi untuk yang lebih maju.

Solusi: curl_cffi dalam 5 menit

curl_cffi adalah pembungkus Python di atas curl-impersonate (curl yang dimodifikasi, dibangun dengan BoringSSL dari Chrome atau NSS dari Firefox sebagai pengganti OpenSSL). Ini mereproduksi handshake browser yang asli dan memiliki API yang hampir identik dengan requests yang biasa.

Langkah 1. Instalasi. Biner curl-impersonate untuk Windows/macOS/Linux diunduh secara otomatis:

pip install curl-cffi

Langkah 2. Permintaan dasar. Ubah impor dan tambahkan satu parameter:

from curl_cffi import requests

resp = requests.get("https://target.com/", impersonate="chrome")
print(resp.status_code)
print(resp.http_version)  # HTTP/2 β€” seperti di browser asli

Satu baris impersonate="chrome" memalsukan langsung empat lapisan: sidik jari TLS (JA3/JA4), versi HTTP (HTTP/2 alih-alih HTTP/1.1), urutan header, dan negosiasi ALPN.

Langkah 3. Selalu gunakan alias generik, bukan pin versi. Tulis impersonate="chrome" (atau "safari", "safari_ios") β€” alias secara otomatis diselesaikan ke profil terbaru. impersonate="chrome124" yang di-hardcode akan kadaluarsa: Chrome diperbarui setiap ~4 minggu, dan profil lama akan menjadi anomali. Target yang dapat diandalkan β€” Chrome, Edge, dan Safari/iOS (profil dari chrome99 hingga chrome131, safari15–18).

Langkah 4. Proxy dan sesi. Untuk scraping yang nyata, simpan status dalam sesi dan sambungkan proxy. IP residensial atau seluler di sini wajib β€” data center terdeteksi secara terpisah dari TLS berdasarkan ASN:

from curl_cffi import requests

session = requests.Session(impersonate="chrome")

headers = {
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Referer": "https://www.google.com/",
}
proxies = {
    "http": "http://user:pass@proxy-host:port",
    "https": "http://user:pass@proxy-host:port",
}

resp = session.get("https://target.com", headers=headers, proxies=proxies)

Langkah 5. Asinkron untuk volume. Berbeda dengan requests, curl_cffi secara bawaan memiliki async dan HTTP/2:

import asyncio
from curl_cffi.requests import AsyncSession

async def fetch(session, url):
    r = await session.get(url, impersonate="chrome")
    return r.status_code

async def main(urls):
    async with AsyncSession() as session:
        return await asyncio.gather(*[fetch(session, u) for u in urls])

asyncio.run(main(["https://target.com"] * 20))

Periksa sidik jari Anda β€” jangan menebak

Sebelum mengirimkan lalu lintas produksi, pastikan bahwa pemalsuan benar-benar berfungsi. Kirim permintaan ke verifier publik dan bandingkan JA4 dengan browser referensi:

  • tls.peet.ws β€” mengembalikan JA3, JA4, sidik jari Akamai, dan frame HTTP/2 dalam JSON. Minta melalui curl_cffi dan melalui Chrome asli, bandingkan hash-nya.
  • ja4db.com β€” basis data JA4 yang dikenal, membantu memahami dengan siapa Anda mirip.
  • browserleaks.com/tls dan alat JA3/JA4 dari Scrapfly β€” rincian pemisahan bidang.

Di staging, nyaman untuk menempatkan mitmproxy antara scraper dan target dan memantau hash JA4 yang sebenarnya dari setiap permintaan.

Diagnostik: masih mendapatkan 403/429

Jika sidik jari sudah benar, tetapi pemblokiran tetap ada β€” ikuti checklist dari yang umum hingga yang jarang:

  1. IP dari data center. Alasan nomor 1. Beralih ke proxy residensial atau seluler β€” mengapa satu sidik jari tidak cukup, dijelaskan secara rinci dalam artikel tentang deteksi proxy residensial melalui IP Intelligence.
  2. Profil kadaluarsa. pip install -U curl-cffi dan alias generik "chrome".
  3. Rate terlalu tinggi. Tambahkan jeda acak 1–3 detik antara permintaan.
  4. Header telanjang. Pastikan untuk mengirim Accept-Language, Accept-Encoding, Referer β€” ketidakhadiran mereka juga merupakan anomali.
  5. Sinkronisasi yang salah antara sesi dan IP. Aturan: satu sesi β€” satu IP selama masa hidupnya.
  6. Status 200 β‰  sukses. Periksa isi respons: di bawah kode 200 mungkin terdapat halaman dengan CAPTCHA.

Di mana curl_cffi terhenti

curl_cffi menutup lapisan jaringan β€” dan itu saja. Ia tidak mengeksekusi JavaScript. Oleh karena itu, ia tidak berdaya terhadap tantangan JS: Cloudflare Turnstile, halaman "Memeriksa browser Anda…" (IUAM), cookie cf_clearance yang ditetapkan oleh skrip setelah pemeriksaan β€” semua ini memerlukan lingkungan browser yang sebenarnya. Mengapa pada tahun 2026 solver CAPTCHA hampir tidak berfungsi melawan sistem pencegahan semacam itu, telah kami bahas dalam analisis terpisah tentang penghindaran CAPTCHA.

Apa yang harus dilakukan ketika terhenti di dinding JS:

  • Hibrida. Playwright atau Nodriver menjalankan tantangan dan mendapatkan cf_clearance, kemudian cookie diserahkan ke curl_cffi yang cepat untuk sebagian besar permintaan β€” sehingga Anda membayar untuk browser berat hanya sekali.
  • Layanan Solver (CapSolver, 2Captcha) untuk otomatisasi pengeluaran token.
  • API scraping terkelola, jika Anda tidak ingin mengelola infrastruktur.

Dan ingat tentang keamanan thread: setiap thread β€” sesi sendiri. Tetapkan versi curl-cffi dalam requirements.txt dan tinjau profil setiap 6–12 minggu, saat browser diperbarui.

Alternatif curl_cffi

  • tls-client β€” pembungkus di atas pustaka Go berbasis uTLS, dengan profil (chrome_124, safari_ios_17) dan bendera random_tls_extension_order=True. Penyesuaian sidik jari yang fleksibel.
  • primp β€” klien di Rust, memungkinkan untuk secara independen menetapkan impersonate_os dan memberikan throughput lebih tinggi; minus β€” API tidak sepenuhnya cocok dengan requests dan pustaka ini lebih muda.

Proxy apa yang dibutuhkan dan mengapa

Pemalsuan sidik jari dan proxy menyelesaikan dua sisi dari satu tugas: curl_cffi menutup pertanyaan "seperti apa koneksinya", proxy β€” "dari mana asalnya". Anti-bot memeriksa kedua sinyal secara independen, jadi JA4 yang sempurna dengan ASN data center hitam tidak ada gunanya. Untuk tujuan yang aman (marketplace, media sosial, agregator perjalanan) gunakan proxy residensial atau proxy seluler: mereka memiliki asal operator yang bersih, dan proxy seluler juga bersembunyi di balik efek CGNAT "kerumunan". Tinggalkan data center untuk tujuan yang tidak sensitif dan volume tinggi.

Kesimpulan

Pada tahun 2026, scraping adalah permainan identitas, bukan hanya IP. requests polos terlihat seperti skrip pada tingkat handshake TLS dan kalah sebelum header pertama. Mengganti impor dengan curl_cffi dengan impersonate="chrome" menghilangkan kegagalan ini dalam lima menit, tetapi hanya berfungsi dalam kombinasi dengan IP residensial atau seluler yang bersih dan dengan pemahaman batas: lapisan jaringan β€” ya, tantangan JavaScript β€” tidak. Kumpulkan tumpukan dengan jujur: sidik jari yang benar, proxy yang benar, hibrida dengan browser di mana ada dinding JS β€” dan 403 pada permintaan pertama akan menjadi masa lalu.