Gratis update & dukungan instalasi

Tutorial Website 27 Oct 2026

Cara Menambahkan Google reCAPTCHA v3 di Laravel: Anti Spam Tanpa Ganggu Pengunjung (Panduan 2026)

R Oleh renz mobellgnd
Cara Menambahkan Google reCAPTCHA v3 di Laravel: Anti Spam Tanpa Ganggu Pengunjung (Panduan 2026)

Google reCAPTCHA v3 dipasang di Laravel dengan cara mendaftarkan situs di Google reCAPTCHA Admin Console, menyimpan site key dan secret key di file .env, memuat skrip reCAPTCHA di form Blade untuk menghasilkan token, lalu memverifikasi token tersebut di backend lewat endpoint siteverify Google dan menolak submission yang skornya di bawah ambang yang kamu tentukan. Pengunjung tidak perlu mencentang apa pun — semua berjalan di latar belakang.

Kalau form login, kontak, atau pendaftaran di websitemu mulai dibanjiri akun palsu dan pesan sampah, artikel ini solusinya — tanpa kotak centang, tanpa gesekan untuk pengguna asli.

Apa itu Google reCAPTCHA v3?

reCAPTCHA v3 adalah layanan gratis dari Google yang menilai setiap interaksi di websitemu dan mengembalikan skor antara 0,0 (kemungkinan besar bot) sampai 1,0 (kemungkinan besar manusia). Tidak ada gambar yang harus dipilih, tidak ada centang yang harus diklik. Google menganalisis perilaku — seperti pola gerakan, riwayat interaksi, dan konteks halaman — lalu kamu yang memutuskan ambang skornya.

Dokumentasi resmi Google (developers.google.com/recaptcha/docs/v3) menjelaskan dua konsep kunci: action dan score. Action adalah label untuk tiap aksi di situsmu, misalnya login, register, atau contact, sehingga kamu bisa melihat statistik per form di dashboard reCAPTCHA Admin. Score adalah hasil penilaiannya.

Apa bedanya reCAPTCHA v2 dan v3?

Aspek reCAPTCHA v2 reCAPTCHA v3
Pengalaman penggunaHarus mencentang kotak, kadang memilih gambarTanpa interaksi sama sekali
HasilLolos / tidak lolosSkor 0,0–1,0
KontrolSedikitThreshold per form bisa diatur
Cocok untukForm yang jarang dipakaiLogin, register, kontak, checkout
Beban implementasiRinganSedikit lebih banyak (validasi skor di backend)

Singkatnya: kalau kamu tidak mau pengunjung kabur gara-gara captcha yang merepotkan, v3 adalah pilihan yang tepat. Kalau kamu butuh tantangan eksplisit untuk aksi yang sangat sensitif, v2 masih masuk akal — dan keduanya bisa hidup berdampingan di situs yang sama.

Persiapan: apa yang kamu butuhkan?

Sebelum mulai, siapkan tiga hal ini:

  1. Proyek Laravel yang sudah berjalan (panduan ini memakai Laravel 11/12, tapi langkahnya sama untuk Laravel 10).
  2. Akun Google untuk mengakses reCAPTCHA Admin Console.
  3. Domain atau localhost untuk didaftarkan — Google mengizinkan localhost di daftar domain, jadi kamu bisa menguji di mesin lokal dengan key yang sama.

Langkah 1: Daftarkan situs dan ambil site key serta secret key

Buka Google reCAPTCHA Admin Console dan klik tanda tambah untuk mendaftarkan situs baru:

  1. Isi label, misalnya nama websitemu.
  2. Pilih tipe reCAPTCHA v3 (bukan v2).
  3. Tambahkan domain, misalnya kioskoding.com dan localhost untuk pengujian lokal.
  4. Terima ketentuan layanan, lalu klik Submit.

Google akan menampilkan dua kunci: Site Key (dipakai di frontend) dan Secret Key (dipakai di backend dan tidak boleh bocor ke publik). Simpan keduanya, lalu lanjut ke konfigurasi.

Langkah 2: Simpan key di .env dan config/services.php

Jangan pernah menulis key langsung di kode atau di Blade. Simpan di .env:

RECAPTCHA_SITE_KEY=6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI
RECAPTCHA_SECRET_KEY=6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
RECAPTCHA_MIN_SCORE=0.5

Catatan: key di atas adalah key pengujian resmi dari Google (lihat bagian pengujian di bawah), bukan key produksi. Ganti dengan key dari Admin Console saat deploy.

Lalu daftarkan di config/services.php agar bisa diakses lewat config():

'recaptcha' => [
'site_key' => env('RECAPTCHA_SITE_KEY'),
'secret_key' => env('RECAPTCHA_SECRET_KEY'),
'min_score' => env('RECAPTCHA_MIN_SCORE', 0.5),
],

Satu jebakan klasik di shared hosting: setelah mengubah .env, jalankan php artisan config:clear kalau sebelumnya kamu pernah menjalankan config:cache. Kalau tidak, Laravel tetap memakai konfigurasi lama yang tercache dan key barumu seolah-olah tidak terbaca.

Langkah 3: Pasang skrip reCAPTCHA di form Blade

Tambahkan skrip Google di layout atau di halaman form, lalu minta token setiap kali form disubmit. Contoh pada form login:

<form method="POST" action="/login" id="login-form">
@csrf
<input type="email" name="email" required>
<input type="password" name="password" required>
<input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response">
<button type="submit">Masuk</button>
</form>

<script src="https://www.google.com/recaptcha/api.js?render={{ config('services.recaptcha.site_key') }}"></script>
<script>
document.getElementById('login-form').addEventListener('submit', function (e) {
e.preventDefault();
grecaptcha.ready(function () {
grecaptcha.execute('{{ config('services.recaptcha.site_key') }}', {action: 'login'})
.then(function (token) {
document.getElementById('g-recaptcha-response').value = token;
e.target.submit();
});
});
});
</script>

Dua detail penting di sini. Pertama, token hanya berlaku sekitar 2 menit, jadi ambil token tepat saat submit, seperti contoh di atas — bukan saat halaman dimuat. Kedua, action harus konsisten dan berbeda untuk tiap form (login, register, contact) supaya statistik di dashboard Admin tidak tercampur.

Langkah 4: Buat Rule validasi untuk verifikasi backend

Inilah bagian yang paling sering dilewati tutorial lain — dan justru yang paling penting. Tanpa verifikasi backend, token dari frontend tidak ada artinya: bot bisa mengirim form tanpa token sama sekali. Buat Rule kustom:

php artisan make:rule RecaptchaV3

Lalu isi app/Rules/RecaptchaV3.php:

<?php

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;

class RecaptchaV3 implements ValidationRule
{
public function __construct(
protected string $action,
protected ?float $minScore = null,
) {}

public function validate(string $attribute, mixed $value, Closure $fail): void
{
$response = Http::timeout(5)->asForm()->post(
'https://www.google.com/recaptcha/api/siteverify',
[
'secret' => config('services.recaptcha.secret_key'),
'response' => $value,
'remoteip' => request()->ip(),
]
);

$data = $response->json();

if (! ($data['success'] ?? false)) {
Log::warning('reCAPTCHA gagal', ['errors' => $data['error-codes'] ?? []]);
$fail('Verifikasi keamanan gagal. Silakan coba lagi.');
return;
}

if (($data['action'] ?? null) !== $this->action) {
$fail('Verifikasi keamanan tidak valid.');
return;
}

$threshold = $this->minScore ?? config('services.recaptcha.min_score', 0.5);

if (($data['score'] ?? 0) < $threshold) {
Log::info('reCAPTCHA skor rendah ditolak', [
'action' => $this->action,
'score' => $data['score'] ?? null,
]);
$fail('Aktivitas Anda terdeteksi mencurigakan. Silakan coba lagi nanti.');
}
}
}

Perhatikan tiga hal dalam Rule ini: timeout(5) supaya request ke Google yang lambat tidak menggantung form, pemeriksaan action sehingga token form kontak tidak bisa dipakai ulang untuk login, dan pencatatan setiap penolakan ke log — data inilah yang nanti membantumu menyetel threshold dengan benar.

Langkah 5: Pakai Rule di Form Request

Terakhir, pasang Rule di Form Request atau controller. Contoh untuk login:

use App\Rules\RecaptchaV3;

public function rules(): array
{
return [
'email' => ['required', 'email'],
'password' => ['required'],
'g-recaptcha-response' => ['required', new RecaptchaV3('login')],
];
}

Untuk form yang lebih sensitif, naikkan threshold-nya langsung di tempat pemakaian tanpa mengubah konfigurasi global:

'g-recaptcha-response' => ['required', new RecaptchaV3('register', 0.7)],

Pola ini membuat satu Rule bisa dipakai di semua form dengan ambang yang berbeda-beda.

Berapa threshold yang tepat untuk tiap form?

Google menyarankan 0,5 sebagai titik awal, tapi angka ideal tergantung risiko tiap form. Berikut panduan praktisnya:

Form Threshold awal Alasan
Formulir kontak0,3–0,5Jangan sampai pelanggan asli tertolak
Login0,5Seimbang antara keamanan dan kenyamanan
Pendaftaran0,6–0,7Akun palsu adalah target utama bot
Reset password0,7Aksi sensitif, pengguna asli jarang gagal
Komentar / ulasan0,5Spam komentar merusak reputasi

Aturan praktisnya: jalankan dulu selama satu sampai dua minggu dengan mode "observasi" — catat skor di log tanpa menolak apa pun — lalu lihat distribusi skor pengguna aslimu sebelum mengunci threshold. Kalau kamu sudah memakai login sosial seperti di panduan login Google dengan Socialite, reCAPTCHA v3 bisa dipasang berdampingan tanpa konflik.

Bagaimana cara menguji reCAPTCHA v3 di lokal?

Google menyediakan key pengujian resmi yang selalu mengembalikan hasil tetap:

  1. Site key pengujian: 6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI
  2. Secret key pengujian: 6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe

Dengan key ini, verifikasi selalu sukses dengan skor 0,9, dan badge reCAPTCHA menampilkan peringatan bahwa ini key pengujian. Uji tiga skenario ini sebelum deploy: token valid (harus lolos), form tanpa token (harus ditolak oleh Rule required), dan skor di bawah threshold (simulasikan dengan menurunkan RECAPTCHA_MIN_SCORE ke 1,0 untuk sementara — semua submission harus ditolak). Kalau ketiganya berperilaku benar, implementasimu sudah solid.

Troubleshooting: masalah yang paling sering muncul

"Invalid site key" di console browser. Biasanya domain belum didaftarkan di Admin Console, atau kamu memakai site key v2 untuk skrip v3. Periksa kembali daftar domain — termasuk www dan non-www kalau keduanya aktif.

Token expired atau timeout-or-duplicate. Token hanya berlaku 2 menit dan sekali pakai. Penyebab paling umum: token diambil saat halaman dimuat, bukan saat submit. Perbaiki dengan pola submit handler seperti Langkah 3.

Semua pengguna ditolak, termasuk kamu sendiri. Turunkan threshold sementara ke 0,3 dan cek log skor. Jangan menaikkan threshold secara membabi buta — data log adalah jawabannya. Kalau setelah deploy malah muncul error 500, cek panduan mengatasi error 500 setelah upload website.

Skor pengguna asli fluktuatif. Ini normal — skor bukan nilai tetap. Itulah kenapa threshold harus disetel dari data, bukan dari tebakan.

Kapan reCAPTCHA v3 tidak cocok?

Jujur saja, v3 bukan obat untuk semua masalah. Cara ini tidak cocok jika kamu butuh bukti eksplisit bahwa pengguna adalah manusia untuk keperluan hukum atau audit, karena v3 tidak pernah menampilkan tantangan apa pun. Situs yang penggunanya mayoritas memakai Tor atau jaringan bersama dengan reputasi buruk juga akan melihat banyak skor rendah yang sulit dibedakan dari bot. Dan ingat: reCAPTCHA melindungi form dari bot, bukan dari serangan lain — injeksi, pencurian sesi, dan kebocoran data tetap butuh lapisan keamanan sendiri, seperti yang dibahas di panduan mengamankan website setelah beli source code.

Lapisan tambahan: jangan hanya mengandalkan reCAPTCHA

reCAPTCHA v3 bekerja paling baik sebagai satu lapisan dari beberapa lapisan: rate limiting (throttle:5,1 pada route login), honeypot field (input tersembunyi yang hanya diisi bot), validasi server yang ketat, dan monitoring log penolakan tiap minggu. Kombinasi ini membuat bot harus melewati empat gerbang sekaligus, sementara pengguna asli tidak merasakan satu pun.

Kesimpulan

Memasang Google reCAPTCHA v3 di Laravel hanya butuh lima langkah: daftar situs di Admin Console, simpan key di .env, pasang skrip di form Blade dengan action yang tepat, verifikasi token di backend lewat Rule kustom dengan pemeriksaan skor dan action, lalu setel threshold per form dari data log selama satu sampai dua minggu. Hasilnya: form yang bersih dari spam tanpa satu pun centang captcha yang mengganggu pengunjung.

FAQ

Apakah Google reCAPTCHA v3 gratis?

Ya, reCAPTCHA v3 gratis hingga 1 juta penilaian per bulan. Di atas itu berlaku harga Google Cloud. Untuk kebanyakan website UMKM dan toko online, kuota gratis ini sudah lebih dari cukup.

Apakah reCAPTCHA v3 melanggar privasi pengguna?

Google menyatakan reCAPTCHA hanya mengumpulkan data yang diperlukan untuk analisis risiko, dan badge reCAPTCHA wajib menampilkan tautan Kebijakan Privasi dan Persyaratan Google. Kalau websitemu menargetkan pengguna Eropa, cantumkan juga penjelasan ini di halaman kebijakan privasimu.

Bisakah reCAPTCHA v2 dan v3 dipakai bersamaan?

Bisa. Keduanya memakai site key dan secret key yang berbeda dan didaftarkan sebagai situs terpisah di Admin Console. Pola yang umum: v3 untuk semua form, lalu v2 sebagai tantangan cadangan saat skor v3 rendah.

Berapa lama token reCAPTCHA v3 berlaku?

Sekitar 2 menit dan hanya bisa dipakai sekali. Karena itu token harus diminta tepat saat form disubmit, bukan saat halaman dimuat.

Apakah reCAPTCHA v3 bisa dipasang tanpa paket Composer?

Ya, dan itulah pendekatan artikel ini: cukup HTTP client bawaan Laravel (Http::post) ke endpoint siteverify Google. Paket Composer memang mempercepat setup, tapi implementasi manual memberimu kontrol penuh atas threshold, logging, dan pemeriksaan action.

Kenapa skor pengguna asli saya rendah?

Skor dipengaruhi perilaku browsing, jaringan bersama, dan riwayat interaksi dengan layanan Google. Pengguna dari jaringan kantor atau VPN bersama sering mendapat skor lebih rendah. Solusinya: setel threshold dari data log, dan pertimbangkan menampilkan tantangan v2 sebagai cadangan, bukan menolak mentah-mentah.

Apakah reCAPTCHA v3 memperlambat website?

Dampaknya minimal. Skrip dimuat secara asinkron dan token diambil saat submit, sehingga tidak memblokir rendering halaman. Yang perlu dijaga adalah timeout request verifikasi di backend — contoh di artikel ini memakai 5 detik agar form tidak menggantung kalau jaringan ke Google bermasalah.