Skip to content
Kembali ke Blog
Keamanan

Dasar-Dasar Keamanan Web: Hashing, Validasi & Autentikasi

Dasar-dasar keamanan web: hashing bcrypt vs Argon2, pencegahan XSS dan SQL injection, praktik terbaik JWT, header CSP dan MFA — dengan contoh kode JS.

12 menit baca

Praktik Terbaik Keamanan untuk Web Developer

Sebagian besar kerentanan web berasal dari kesalahan yang bisa dicegah: password yang di-hash dengan MD5, input yang tidak disanitasi, sesi tanpa flag httpOnly. Panduan ini membahas praktik keamanan yang langsung bisa diimplementasikan.

Keamanan Password

Jangan Pernah Simpan Password dalam Teks Polos

Selalu hash password menggunakan algoritma modern seperti bcrypt, Argon2, atau scrypt. Algoritma-algoritma ini dirancang untuk menjadi lambat, membuat serangan brute-force menjadi tidak praktis.

// Baik: Menggunakan bcrypt
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);

Perbandingan Algoritma Hashing

Tidak semua algoritma hashing sama. Memilih yang tepat tergantung pada threat model dan kasus penggunaan Anda:

AlgoritmaUkuran OutputKecepatanKasus PenggunaanStatus Keamanan
MD5128-bitSangat cepatChecksum, hash non-keamananBroken untuk keamanan
SHA-256256-bitCepatIntegritas data, tanda tangan digitalAman
bcrypt184-bitLambat (dapat disesuaikan)Hashing passwordAman
Argon2Dapat dikonfigurasiLambat (dapat disesuaikan)Hashing password (modern)Direkomendasikan untuk proyek baru

bcrypt dan Argon2 sengaja dibuat lambat — ini adalah fitur, bukan bug. Setiap operasi hash memakan waktu puluhan atau ratusan milidetik, membuat serangan brute-force berskala besar menjadi tidak ekonomis.

Memahami Entropi Password

Kekuatan password dapat diukur secara matematis menggunakan entropi: entropi = log2(ukuran_charset^panjang). Password yang menggunakan huruf kecil (26 karakter) dengan 8 karakter memiliki ~37,6 bit entropi. Password 16 karakter yang mencampur huruf besar, huruf kecil, angka, dan simbol (95 karakter) memiliki ~105 bit — secara eksponensial lebih sulit dicrack. Inilah mengapa panjang lebih penting daripada kompleksitas untuk sebagian besar pengguna. Untuk penjelasan lebih dalam tentang matematika di balik kekuatan password, baca panduan entropi password dijelaskan kami.

Gunakan Password Manager

Rekomendasikan kepada pengguna Anda untuk menggunakan password manager. Password yang dipilih manusia cenderung mengikuti pola yang dapat diprediksi yang dieksploitasi penyerang dengan serangan kamus. Password manager menghasilkan string yang benar-benar acak dan menghilangkan penggunaan ulang password di seluruh layanan — salah satu vektor paling umum untuk serangan credential stuffing.

Gunakan Salt Round yang Cukup

Salt round menentukan biaya komputasi. Lebih tinggi lebih aman tapi lebih lambat. 10-12 round adalah keseimbangan yang baik untuk sebagian besar aplikasi.

Validasi Input

Validasi di Sisi Client dan Server

Validasi sisi client meningkatkan UX, tapi validasi sisi server wajib untuk keamanan. Jangan pernah percaya input client.

Sanitasi Semua Input Pengguna

Cegah serangan injection dengan mensanitasi input:

  • Gunakan parameterized query untuk SQL
  • Escape output HTML untuk mencegah XSS
  • Validasi upload file secara ketat

Contoh Serangan Konkret

Memahami serangan nyata membantu Anda bertahan melawannya. Bayangkan form komentar yang merender input pengguna langsung ke HTML. Penyerang mengirimkan:

<script>alert('xss')</script>

Jika aplikasi merender ini tanpa escaping, script tersebut dijalankan di browser setiap pengunjung — mencuri cookie, mengarahkan pengguna, atau menyisipkan keylogger. Solusinya: selalu encode output sesuai konteks. Gunakan library seperti DOMPurify untuk sanitasi HTML.

SQL injection sama berbahayanya. Di form login, penyerang memasukkan username:

' OR 1=1 --

Jika query dibangun dengan penggabungan string ("SELECT * FROM users WHERE username='" + input + "'") ini melewati autentikasi sepenuhnya. -- mengomentari sisa query. Solusinya: selalu gunakan parameterized query (juga disebut prepared statement). Setiap library database utama mendukungnya:

// SALAH: Penggabungan string
db.query(`SELECT * FROM users WHERE username='${input}'`);

// BENAR: Parameterized query
db.query('SELECT * FROM users WHERE username = $1', [input]);

Content Security Policy (CSP)

Sebagai pertahanan berlapis, terapkan header Content Security Policy. CSP memberi tahu browser sumber konten mana yang dipercaya, secara efektif memblokir inline script dan pemuatan resource yang tidak sah. Bahkan jika kerentanan XSS ada dalam kode Anda, CSP yang ketat dapat mencegah script yang disuntikkan dari dijalankan. Mulai dengan Content-Security-Policy: default-src 'self' dan tambahkan pengecualian secara bertahap sesuai kebutuhan.

Fungsi Hash

Memilih Hash yang Tepat

Kasus penggunaan yang berbeda memerlukan fungsi hash yang berbeda:

Kasus PenggunaanRekomendasi
Passwordbcrypt, Argon2
IntegritasSHA-256
ChecksumSHA-256, MD5 (non-keamanan)
Hashing cepatBLAKE3

Memahami Output Hash dan Collision

MD5 menghasilkan hash 128-bit (32 karakter hex), sementara SHA-256 menghasilkan hash 256-bit (64 karakter hex). Perbedaan ini penting: ruang output yang lebih besar berarti secara eksponensial lebih banyak nilai hash yang mungkin, membuat collision jauh lebih tidak mungkin. Collision terjadi ketika dua input berbeda menghasilkan hash yang sama — penyerang yang bisa membuat collision dapat memalsukan tanda tangan digital atau merusak data yang terverifikasi.

Collision MD5 dapat dihasilkan dalam hitungan detik pada hardware modern. SHA-256 tetap tahan collision tanpa serangan praktis yang diketahui. Inilah mengapa pemilihan algoritma harus sesuai konteks:

  • Checksum dan deduplikasi: MD5 dapat diterima ketika keamanan bukan perhatian
  • Integritas data dan tanda tangan: SHA-256 memberikan ketahanan collision yang kuat
  • Penyimpanan password: bcrypt atau Argon2, yang menambahkan salt dan kelambatan yang disengaja

HMAC untuk Autentikasi Pesan

Ketika Anda perlu memverifikasi integritas dan autentisitas pesan, gunakan HMAC (Hash-based Message Authentication Code). HMAC menggabungkan fungsi hash dengan secret key, memastikan bahwa hanya pihak yang mengetahui key yang bisa membuat atau memverifikasi tag. Ini penting untuk autentikasi API, verifikasi webhook, dan pembuatan token yang aman.

Jangan Pernah Gunakan MD5 atau SHA-1 untuk Keamanan

MD5 dan SHA-1 sudah broken untuk tujuan keamanan. Gunakan SHA-256 atau SHA-3 untuk hashing kriptografis.

HTTPS di Mana-Mana

Apa yang Sebenarnya Dilakukan TLS

TLS (Transport Layer Security) memberikan tiga perlindungan kritis: enkripsi saat transit (mencegah penyadapan), autentikasi server (membuktikan Anda berbicara dengan server asli, bukan penipu), dan integritas data (mendeteksi manipulasi apa pun selama transmisi). Tanpa TLS, setiap data antara pengguna dan server Anda — password, token, informasi pribadi — berjalan dalam teks polos.

Selalu Gunakan TLS

  • Dapatkan sertifikat dari CA tepercaya (Let’s Encrypt gratis dan sepenuhnya otomatis)
  • Redirect HTTP ke HTTPS
  • Gunakan header HSTS
  • Perbarui versi TLS

HSTS dan Mixed Content

Header HTTP Strict Transport Security (HSTS) memberi tahu browser untuk hanya terhubung melalui HTTPS, bahkan jika pengguna mengetik http://. Atur Strict-Transport-Security: max-age=31536000; includeSubDomains untuk memberlakukan ini selama satu tahun penuh di semua subdomain. Ini mencegah serangan SSL stripping di mana penyerang menurunkan koneksi ke HTTP.

Waspadai peringatan mixed content: jika halaman HTTPS Anda memuat gambar, script, atau stylesheet melalui HTTP, browser akan memblokir atau memperingatkannya. Audit halaman Anda untuk URL http:// yang di-hardcode dan gunakan path relatif-protokol atau berlakukan HTTPS untuk semua resource.

Autentikasi

Implementasikan Rate Limiting

Cegah serangan brute-force dengan rate limiting:

  • Batasi percobaan login per IP
  • Tambahkan delay setelah percobaan gagal
  • Gunakan CAPTCHA untuk aktivitas mencurigakan

Dasar-Dasar Autentikasi JWT

JSON Web Token (JWT) menyediakan mekanisme autentikasi stateless yang terstruktur sebagai header.payload.signature. Server menandatangani token dengan secret key, dan client menyertakannya dalam permintaan berikutnya. Karena token berisi claim pengguna, server tidak perlu mencari state sesi di setiap permintaan — menjadikan JWT cocok untuk sistem terdistribusi dan microservice.

Selalu atur waktu kedaluwarsa pendek pada access token (misalnya, 15 menit) dan gunakan refresh token untuk mendapatkan access token baru. Simpan refresh token secara aman (httpOnly cookie, bukan localStorage) dan implementasikan rotasi token sehingga setiap refresh token hanya bisa digunakan sekali.

Multi-Factor Authentication (MFA)

MFA tidak lagi opsional untuk aplikasi serius apa pun. Memerlukan faktor kedua — kode TOTP (Google Authenticator), hardware key (YubiKey), atau push notification — secara dramatis mengurangi dampak password yang dikompromikan. Bahkan jika penyerang mendapatkan kredensial valid, mereka tidak bisa melakukan autentikasi tanpa faktor kedua.

Pencegahan Session Fixation

Serangan session fixation terjadi ketika penyerang mengatur session ID yang diketahui sebelum pengguna melakukan autentikasi. Setelah login, penyerang menggunakan session ID yang sama untuk membajak sesi yang sudah terautentikasi. Cegah ini dengan selalu membuat ulang session ID setelah autentikasi berhasil dan membatalkan yang lama.

Gunakan Manajemen Sesi yang Aman

  • Buat session ID yang acak secara kriptografis
  • Atur flag secure dan httpOnly pada cookie
  • Implementasikan timeout sesi
  • Batalkan sesi saat logout

Checklist Security Header

Menerapkan header respons HTTP yang tepat adalah salah satu cara paling efektif dan rendah usaha untuk memperkuat aplikasi Anda. Berikut tabel referensi cepat header keamanan penting:

HeaderTujuanContoh Nilai
Content-Security-PolicyMencegah XSS dan injeksi datadefault-src 'self'
Strict-Transport-SecurityMemaksa koneksi HTTPSmax-age=31536000; includeSubDomains
X-Content-Type-OptionsMencegah MIME type sniffingnosniff
X-Frame-OptionsMencegah clickjackingDENY
Referrer-PolicyMengontrol informasi referrerstrict-origin-when-cross-origin

Header-header ini dapat diatur di level web server (Nginx, Apache), di level CDN/edge (Cloudflare, Vercel), atau di dalam framework aplikasi Anda. Uji header Anda menggunakan tools seperti securityheaders.com. Targetkan rating A+ — sebagian besar header ini hanya satu baris konfigurasi dan tidak memerlukan biaya untuk diterapkan.

Menggunakan Tool Keamanan Kami

Jelajahi tool keamanan kami untuk membantu pengembangan Anda:

Untuk gambaran lebih luas tentang bagaimana tool encoding, hashing, dan konversi cocok dengan alur kerja pengembangan Anda, baca Panduan Tool Penting untuk Developer kami.

Pertanyaan yang Sering Diajukan

Apa kerentanan keamanan web yang paling umum?

Cross-Site Scripting (XSS) tetap menjadi kerentanan web paling umum menurut OWASP. Ini terjadi ketika aplikasi menyertakan data yang tidak dipercaya di halaman web tanpa validasi yang tepat. Cegah XSS dengan mensanitasi semua input pengguna, menggunakan header Content Security Policy, dan encoding output berdasarkan konteks (HTML, JavaScript, URL, atau CSS).

Apakah MD5 masih aman untuk hashing password?

Tidak — MD5 tidak boleh digunakan untuk hashing password. Algoritma ini cepat secara komputasional, membuatnya rentan terhadap serangan brute-force dan rainbow table. GPU modern dapat menghitung miliaran hash MD5 per detik. Gunakan bcrypt, scrypt, atau Argon2 sebagai gantinya, yang sengaja lambat dan menyertakan salting bawaan untuk melawan serangan.

Berapa panjang password yang aman di tahun 2026?

Minimal 12 karakter direkomendasikan, tapi 16+ karakter memberikan perlindungan yang jauh lebih kuat. Panjang lebih penting daripada kompleksitas — passphrase 20 karakter seperti “correct-horse-battery-staple” lebih kuat daripada password pendek yang kompleks seperti “P@ss1!”. Aktifkan multi-factor authentication (MFA) tanpa memandang panjang password untuk akun penting.

Apa perbedaan antara enkripsi dan hashing?

Enkripsi bersifat reversibel — Anda bisa mendekripsi data kembali ke bentuk aslinya menggunakan key. Hashing bersifat satu arah — Anda tidak bisa mendapatkan kembali data asli dari hash. Gunakan enkripsi untuk data yang perlu Anda ambil (seperti data pengguna yang tersimpan), dan hashing untuk data yang hanya perlu Anda verifikasi (seperti password dan checksum).

Haruskah saya membangun sistem autentikasi sendiri?

Tidak — membangun autentikasi dari nol berisiko dan rawan kesalahan. Gunakan framework dan layanan yang sudah teruji seperti Auth0, Firebase Auth, atau Supabase Auth. Ini menangani hashing password, manajemen sesi, rotasi token, MFA, dan perlindungan brute-force. Fokuskan waktu pengembangan Anda pada fitur unik aplikasi Anda.

Penutup

Checklist singkat: hash password dengan bcrypt/Argon2, sanitasi semua input, gunakan parameterized query, pasang header keamanan (CSP, HSTS, X-Content-Type-Options), dan aktifkan MFA untuk akun admin. Audit secara berkala — kerentanan baru ditemukan terus-menerus.

Artikel Terkait

Lihat semua artikel