Kembali ke blog

Mengapa Proxy Berfungsi di Browser Tapi Gagal di Kode: Analisis Lengkap Masalah

Proksi berfungsi baik di browser, tetapi skrip mengembalikan error? Kami bahas penyebab umum dan berikan solusi siap pakai untuk Python, Node.js, dan cURL.

📅11 Desember 2025
```html

Mengapa Proxy Berfungsi di Browser, tetapi Tidak di Kode: Analisis Lengkap Masalah

Situasi klasik: Anda mengatur proxy di browser, membuka situs — semuanya berfungsi. Anda menjalankan skrip dengan proxy yang sama — kesalahan koneksi, timeout, atau pemblokiran. Mari kita cari tahu mengapa ini terjadi dan bagaimana cara memperbaikinya.

Perbedaan Permintaan dari Browser vs. Kode

Ketika Anda membuka situs melalui proxy di browser, ada lebih banyak hal yang terjadi daripada sekadar permintaan HTTP. Browser secara otomatis:

  • Mengirimkan serangkaian header lengkap (User-Agent, Accept, Accept-Language, Accept-Encoding)
  • Melakukan TLS-handshake dengan set cipher yang benar
  • Menangani pengalihan (redirects) dan cookies
  • Menjalankan JavaScript dan memuat sumber daya dependen
  • Melakukan cache respons DNS dan sertifikat

Permintaan minimal dari kode terlihat sangat berbeda bagi server — seperti robot, bukan manusia. Bahkan jika proxy berfungsi dengan benar, situs tujuan mungkin memblokir skrip Anda karena karakteristiknya.

Masalah Otentikasi Proxy

Penyebab paling umum adalah transmisi login dan kata sandi yang salah. Browser menampilkan jendela pop-up untuk memasukkan kredensial, tetapi dalam kode, ini harus dilakukan secara eksplisit.

Format URL yang Salah

Kesalahan umum adalah menghilangkan skema atau pengkodean karakter khusus yang tidak tepat:

# Salah
proxy = "user:pass@proxy.example.com:8080"

# Benar
proxy = "http://user:pass@proxy.example.com:8080"

# Jika kata sandi berisi karakter khusus (@, :, /)
from urllib.parse import quote
password = quote("p@ss:word/123", safe="")
proxy = f"http://user:{password}@proxy.example.com:8080"

Otentikasi Berbasis IP vs. Login/Kata Sandi

Beberapa penyedia proxy menggunakan daftar putih (whitelist) berdasarkan alamat IP. Proxy berfungsi di browser Anda karena IP Anda ada di whitelist. Tetapi skrip di server tidak berfungsi karena server memiliki IP yang berbeda.

Periksa panel penyedia proxy Anda untuk melihat metode otentikasi apa yang digunakan dan IP mana yang ada di whitelist.

Ketidakcocokan Protokol HTTP/HTTPS/SOCKS

Browser sering kali secara otomatis mendeteksi jenis proxy. Dalam kode, Anda harus menentukannya secara eksplisit, dan kesalahan protokol dapat menyebabkan kegagalan tanpa pesan kesalahan yang jelas.

Jenis Proxy Skema di URL Fitur
HTTP Proxy http:// Bekerja untuk HTTP dan HTTPS melalui CONNECT
HTTPS Proxy https:// Koneksi terenkripsi ke proxy
SOCKS4 socks4:// Tanpa otentikasi, hanya IPv4
SOCKS5 socks5:// Dengan otentikasi, UDP, IPv6
SOCKS5h socks5h:// Resolusi DNS melalui proxy

Sangat penting: Jika Anda memiliki proxy SOCKS5, tetapi Anda menentukan http:// — koneksi tidak akan terjalin. Pustaka akan mencoba berkomunikasi menggunakan protokol HTTP dengan server SOCKS.

Kurangnya Header dan Sidik Jari (Fingerprint)

Bahkan jika proxy berfungsi dengan benar, situs tujuan dapat memblokir permintaan karena header yang mencurigakan. Bandingkan:

Permintaan dari Browser

GET /api/data HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1

Permintaan dari requests secara default

GET /api/data HTTP/1.1
Host: example.com
User-Agent: python-requests/2.28.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive

Perbedaannya jelas. Situs dengan perlindungan anti-bot akan langsung mendeteksi bahwa permintaan tersebut bukan berasal dari browser.

Set Header Minimum untuk Penyamaran

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Cache-Control": "max-age=0"
}

Sertifikat SSL dan Verifikasi

Browser memiliki penyimpanan sertifikat root bawaan dan dapat menangani berbagai konfigurasi SSL. Masalah dapat muncul dalam kode:

Kesalahan SSL: CERTIFICATE_VERIFY_FAILED

Beberapa proxy menggunakan sertifikat mereka sendiri untuk inspeksi lalu lintas. Browser mungkin memiliki sertifikat ini dalam daftar tepercaya, tetapi skrip Anda mungkin tidak.

# Solusi sementara untuk debugging (TIDAK untuk produksi!)
import requests
response = requests.get(url, proxies=proxies, verify=False)

# Solusi yang benar — tentukan jalur ke sertifikat
response = requests.get(url, proxies=proxies, verify="/path/to/proxy-ca.crt")

Penting: Menonaktifkan verifikasi SSL (verify=False) membuat koneksi rentan terhadap serangan MITM. Gunakan hanya untuk debugging di lingkungan yang aman.

TLS Fingerprint

Sistem anti-bot tingkat lanjut menganalisis TLS fingerprint — urutan dan set cipher saat koneksi dibuat. Python requests menggunakan set standar yang berbeda dari browser.

Untuk mengatasinya, gunakan pustaka dengan TLS fingerprint kustom:

# Instalasi: pip install curl-cffi
from curl_cffi import requests

response = requests.get(
    url,
    proxies={"https": proxy},
    impersonate="chrome120"  # Meniru TLS fingerprint Chrome 120
)

Kebocoran DNS dan Resolusi

Masalah lain yang tidak jelas adalah resolusi DNS. Saat menggunakan proxy HTTP, permintaan DNS mungkin dikirim langsung dari mesin Anda, melewati proxy.

Bagaimana Ini Mempengaruhi Kinerja

  • Situs melihat resolver DNS yang sebenarnya, bukan proxy
  • Geolokasi ditentukan secara tidak benar
  • Beberapa situs memblokir ketidaksesuaian antara IP dan wilayah DNS

Solusi untuk SOCKS5

Gunakan skema socks5h:// alih-alih socks5:// — huruf "h" berarti resolusi DNS akan dilakukan di sisi proxy:

# DNS diselesaikan secara lokal (bocor!)
proxy = "socks5://user:pass@proxy.example.com:1080"

# DNS diselesaikan melalui proxy (benar)
proxy = "socks5h://user:pass@proxy.example.com:1080"

Contoh Kode yang Berfungsi untuk Python, Node.js, dan cURL

Python dengan requests

import requests
from urllib.parse import quote

# Data proxy
proxy_host = "proxy.example.com"
proxy_port = "8080"
proxy_user = "username"
proxy_pass = quote("p@ssword!", safe="")  # Mengenkode karakter khusus

# Membentuk URL proxy
proxy_url = f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"

proxies = {
    "http": proxy_url,
    "https": proxy_url
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
}

try:
    response = requests.get(
        "https://httpbin.org/ip",
        proxies=proxies,
        headers=headers,
        timeout=30
    )
    print(f"Status: {response.status_code}")
    print(f"IP: {response.json()}")
except requests.exceptions.ProxyError as e:
    print(f"Kesalahan Proxy: {e}")
except requests.exceptions.ConnectTimeout:
    print("Timeout koneksi ke proxy")

Python dengan aiohttp (asinkron)

import aiohttp
import asyncio

async def fetch_with_proxy():
    proxy_url = "http://user:pass@proxy.example.com:8080"
    
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://httpbin.org/ip",
            proxy=proxy_url,
            headers={"User-Agent": "Mozilla/5.0..."}
        ) as response:
            return await response.json()

result = asyncio.run(fetch_with_proxy())
print(result)

Node.js dengan axios

const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');

const proxyUrl = 'http://user:pass@proxy.example.com:8080';
const agent = new HttpsProxyAgent(proxyUrl);

axios.get('https://httpbin.org/ip', {
    httpsAgent: agent,
    headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'
    }
})
.then(response => console.log(response.data))
.catch(error => console.error('Error:', error.message));

Node.js dengan node-fetch dan SOCKS

const fetch = require('node-fetch');
const { SocksProxyAgent } = require('socks-proxy-agent');

const agent = new SocksProxyAgent('socks5://user:pass@proxy.example.com:1080');

fetch('https://httpbin.org/ip', { agent })
    .then(res => res.json())
    .then(data => console.log(data));

cURL

# HTTP proxy
curl -x "http://user:pass@proxy.example.com:8080" \
     -H "User-Agent: Mozilla/5.0..." \
     https://httpbin.org/ip

# SOCKS5 proxy dengan DNS melalui proxy
curl --socks5-hostname "proxy.example.com:1080" \
     --proxy-user "user:pass" \
     https://httpbin.org/ip

# Debugging — tampilkan seluruh proses koneksi
curl -v -x "http://user:pass@proxy.example.com:8080" \
     https://httpbin.org/ip

Daftar Periksa Diagnostik

Jika proxy tidak berfungsi di kode, periksa secara berurutan:

  1. Format URL Proxy — apakah ada skema (http://, socks5://)?
  2. Karakter Khusus dalam Kata Sandi — apakah sudah dienkode URL?
  3. Jenis Proxy — apakah protokol yang ditentukan cocok dengan yang sebenarnya?
  4. Otentikasi — berdasarkan IP atau login? Apakah IP server ada di whitelist?
  5. Header — apakah header browser ditambahkan?
  6. SSL — apakah ada kesalahan sertifikat?
  7. DNS — apakah socks5h:// digunakan untuk resolusi melalui proxy?
  8. Timeout — apakah waktu yang dialokasikan cukup untuk koneksi (terutama untuk proxy residensial)?

Kesimpulan

Perbedaan antara browser dan kode terletak pada detail: header, protokol, SSL, DNS. Browser menyembunyikan kerumitan ini, tetapi dalam kode, setiap aspek harus dikonfigurasi secara eksplisit. Mulailah dengan memeriksa format URL dan otentikasi, lalu tambahkan header browser — ini menyelesaikan 90% masalah.

Untuk tugas pengikisan (scraping) dan otomatisasi di mana stabilitas dan persentase pemblokiran yang rendah penting, proxy residensial sangat cocok — Anda dapat mempelajari lebih lanjut tentangnya di proxycove.com.

```