Hardening API OCR Panjang: Jawaban Langsung
Masalah utama pada layanan OCR panjang seperti proyek Unlimited-OCR adalah permintaan satu-shot yang besar memicu penyalahgunaan, pengurasan sumber daya, dan kebocoran data dokumen. Untuk memastikan API tetap dapat diakses oleh klien sah, perlu digabungkan autentikasi tahan spoof, pembatasan laju yang adaptif, validasi unggahan mendalam, serta manajemen secret dan sesi yang disiplin.
Artikel ini membahas pola praktis di ekosistem Python/REST untuk masing-masing aspek: bagaimana menandatangani permintaan, mengontrol laju dengan Redis, memvalidasi struktur dokumen sebelum diproses, serta menjaga kredensial dan sesi tetap aman di lingkungan produksi.
Autentikasi API yang Tahan Spoof
Memastikan hanya aplikasi resmi yang boleh memanggil API OCR panjang berarti menolak permintaan berdasarkan parameter statis saja. Gunakan kombinasi API key, timestamp, dan HMAC-SHA256 payload signature. Pada arsitektur service-level, server menyimpan secret key per klien di vault (HashiCorp Vault, AWS Secrets Manager, atau Vault ringan berbasis file terenkripsi) dan secara berkala rotaion.
Contoh verifikasi sederhana di Flask:
from flask import request, abort
import hmac
import hashlib
API_SECRETS = {
"client-xyz": "b3c2d1..."
}
def verify_request():
client_id = request.headers.get("X-Client-Id")
sig = request.headers.get("X-Signature")
timestamp = request.headers.get("X-Timestamp")
if not all([client_id, sig, timestamp]):
abort(401)
secret = API_SECRETS.get(client_id)
if not secret:
abort(401)
payload = f"{client_id}:{timestamp}:{request.get_data(as_text=True)}"
expected = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()
if not hmac.compare_digest(sig, expected):
abort(401)
Tambahkan validasi timestamp (misalnya toleransi 60 detik) agar replay attack tertangkal. Saat menggunakan Unlimited-OCR, payload termasuk metadata dokumen serta hash file, sehingga signature berubah bila isi diubah.
Untuk klien berbasis SDK, berikan helper function yang otomatis menghasilkan header signature, dan pastikan secret hanya digunakan di lingkungan server, bukan di frontend.
Rate Limit dan Pencegahan Abuse
OCR panjang bisa memakan waktu dan memori signifikan. Gunakan rate limit per akun API dengan token bucket yang disimpan di Redis. Kombinasikan limit waktu pendek (misalnya 5 permintaan per menit) dan jangka panjang (1 permintaan per dua menit untuk dokumen >5MB).
Implementasi dengan Redis dan Lua script (untuk atomic):
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local now = tonumber(ARGV[2])
local window = tonumber(ARGV[3])
local current = redis.call("GET", key)
if current and tonumber(current) >= limit then
return redis.call("PTTL", key)
end
redis.call("INCR", key)
redis.call("PEXPIRE", key, window)
return limit - (current and tonumber(current) or 0) - 1
Untuk Python, gunakan redis-py mengirim script dengan evalsha. Caching status limit di layer API Gateway (misalnya Kong Gateway dengan plugin rate-limiting) mengurangi beban service utama.
Gunakan metrik (Prometheus + Grafana) untuk memantau kecepatan penolakan: tingginya 429 Too Many Requests bisa berarti bot attack, sedangkan rendah tapi menumpuk 500 error mengindikasikan backend belum mampu menangani request berat.
Validasi Unggahan Dokumen
Sebelum mengirimkan ke Unlimited-OCR, validasi struktur dokumen untuk menghindari file korup, malware, atau format tak didukung. Periksa:
- Prinsip minimum: ukuran file, ekstensi, MIME type.
- Safeguard: jalankan scanner ringan (ClamAV) di pipeline sebelum diproses.
- Pre-proses: hitung hash (SHA256) dan bandingkan dengan store jika klien mengupload ulang, mencegah duplikat.
Gunakan library Python seperti python-magic untuk MIME detection, dan jangan terlalu percaya pada header Content-Type yang dikirim klien.
Jika OCR dijalankan dengan job asynchronous (celah umum), pastikan validasi tetap terjadi di API gateway sebelum job dibuat agar rancangan pipeline tidak menerima permintaan berbahaya.
Manajemen Secret dan Proteksi Sesi
Rahasia untuk model OCR, API key, dan signature key harus disimpan di sistem yang terpisah dari kode. Contoh pola yang umum:
- Vault menyuntikkan secret ke container via environment variable atau mounted file, bukan disimpan di repo.
- Gunakan Kubernetes Secrets + Vault Injector untuk autoupdate tanpa deploy ulang.
- Secrets rotation otomatis, misalnya mengganti signature key setiap minggu, dan otomatis menolak signature lama lewat header Key-Id.
Sesi harus dilindungi dengan praktik keamanan API: gunakan OAuth 2.0 client credential flow untuk machine-to-machine uses, dan refresh token singkat. Jika API masih memakai API key tetap, pastikan key expired dan bisa dicabut via dashboard.
Untuk sesi panjang, tambahkan audit trail: catat IP, user agent, dan periksa anomali (perubahan IP drastis atau permintaan bertubi-tubi di 1 menit). Jika mendeteksi anomali, lap terenkripsi boolean disable sementara untuk client.
Pencegahan Abuse dan Monitoring
Jika API OCR dipanggil dari public internet, kombinasikan rate limit dengan behavioral detection. Contoh lapisan tambahan:
- Captcha ringan untuk endpoint unggah jika permintaan berasal dari IP baru.
- Honeypot endpoint yang sebenarnya tidak digunakan tapi dicatat jika diakses.
- Alert otomatis via Slack/Teams jika terjadi spike 429 atau 500.
Pastikan pipeline logging mencatat metadata request (client ID, URI, size) dan dibawa ke observability (OpenTelemetry, Grafana/Tempo). Audit log membantu investigasi bila abuse berhasil menembus autentikasi.
Penutup
Implementasi langkah-langkah ini menjadikan API OCR panjang lebih tahan terhadap spoofing, rate-based abuse, dan dokumen berbahaya. Paduan dari auth signature yang kuat, rate limit adaptif, validasi data ketat, dan manajemen secret yang disiplin adalah fondasi hardening yang dapat langsung diterapkan di backend Python atau REST API pada proyek seperti Unlimited-OCR.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!