Hampir setiap aplikasi modern memiliki sistem autentikasi. Yang paling umum digunakan adalah autentikasi berbasis email dan password. Namun, tahukah Anda bahwa password bukanlah satu-satunya cara untuk mengenali siapa pengguna sebenarnya?
Saat ini, semakin banyak metode autentikasi yang disebut passwordless authentication, yaitu proses login tanpa perlu mengingat atau menyimpan password. Salah satu bentuk paling umum dari metode ini adalah biometrik, seperti sidik jari dan pengenalan wajah. Tapi dalam artikel ini, kita akan membahas metode passwordless yang lebih sederhana dan mudah diimplementasikan: menggunakan email atau sistem perpesanan.
Mengapa Password Bukan Lagi Solusi Ideal?
1. Terlalu Banyak Akun, Terlalu Banyak Password
Saat ini, hampir setiap platform mengharuskan pengguna membuat akun—dari media sosial, e-commerce, perbankan digital, hingga game. Akibatnya, satu orang bisa memiliki puluhan akun berbeda, masing-masing dengan kebijakan password-nya sendiri.
2. Solusi Cepat: Pakai Password yang Sama
Karena harus mengelola banyak akun, banyak orang memilih cara instan dengan menggunakan password yang sama di banyak tempat. Ini terlihat praktis, tapi justru menjadi salah satu kesalahan paling fatal dalam keamanan digital.
3. Risiko Keamanan yang Meningkat
Ketika satu akun Anda diretas—misalnya melalui kebocoran data atau phishing—maka akun lain yang menggunakan password yang sama juga terancam. Bahkan jika password Anda cukup kuat, menyimpannya di browser atau menggunakan ulang di banyak tempat tetaplah celah keamanan besar.
4. Beban komputasi hashing
Hashing password seperti bcrypt membutuhkan daya komputasi yang besar, terutama saat skala pengguna meningkat.
Salah satu solusi yang sudah dikenal luas adalah OAuth (misalnya login dengan Google/Facebook). Tapi bagaimana jika kita ingin solusi yang lebih sederhana, fleksibel, dan tetap aman?
Passwordless via Email
Jika kita sudah memiliki email pengguna, maka kita bisa mengirimkan sesuatu ke alamat tersebut sebagai bukti autentikasi—misalnya sebuah link berisi token yang hanya bisa digunakan sekali dan memiliki waktu berlaku.
Namun, bagaimana caranya kita memastikan bahwa token tersebut tidak dimodifikasi? Di sinilah digital signature atau tanda tangan digital digunakan.
Apa Itu Signature?
Signature (tanda tangan digital) adalah mekanisme untuk menjamin bahwa data yang dikirimkan:
- Asli (tidak diubah oleh pihak ketiga),
- Dapat dipercaya (dibuat oleh sistem kita sendiri),
- Bisa diverifikasi oleh penerima.
Perbedaan Signature dan Enkripsi
Signature |
Enkripsi |
Menjamin keaslian data |
Menjamin kerahasiaan data |
Dapat dibaca siapa saja |
Hanya bisa dibaca oleh penerima yang memiliki kunci |
Contoh: JWT dengan HMAC |
Contoh: AES, RSA, dll |
Analogi Signature vs Enkripsi
Signature = “Tanda Tangan”
Bayangkan Anda bertujuan mengirimkan dokumen kepada seseorang dan isinya dokumen tersebut tidak membuat Anda khawatir apakah dibaca orang lain atau hanya orang yang Anda tujukan. Yang pasti yang membaca mengenal atau mengetahui bahwa dokumen tersebut asli dari Anda.
Enkripsi = “Pesan Rahasia”
Anda bertujuan mengirim suatu dokumen tetapi Anda hanya ingin orang yang Anda tujukan saja yang dapat membaca dokumen tersebut. Jika dokumen dibuka dan dibaca orang lain maka orang lain tidak dapat membaca karena isinya diacak dengan berbagai teks agar tidak dipahami (ciphertext). Untuk dapat membacanya harus memiliki kunci agar tulisan chipertext dapat dibaca.
Tabel Perbandingan
Aspek |
Signature |
Enkripsi |
Tujuan utama |
Validasi keaslian |
Menjaga kerahasiaan |
Data bisa dibaca |
Siapa saja |
Hanya yang punya kunci |
Bisa dimodifikasi? |
Tidak (akan ketahuan) |
Tidak (tapi tetap bisa dibuka jika punya kunci) |
Contoh |
JWT, HMAC, SHA256 |
AES, RSA, TLS |
Menerapkan Signature dengan JWT
Dalam kasus penerapan passwordless, signature lebih cocok untuk kita gunakan, kenapa? karena data yang akan kita kirimkan ke pengguna hanya perlu kita validasi apakah tanda tangannya kita yang membuat atau bukan.
Sebenarnya ada banyak library lain untuk dapat mengimplementasikan signature misalnya di python ada itsdangerous. Pilihan disini JWT karena lintas platform hampir semua bahasa pemrograman memiliki library JWT.
JWT (JSON Web Token) adalah salah satu cara paling populer untuk membuat signature yang bisa diverifikasi. JWT terdiri dari tiga bagian:
- Header – tipe token dan algoritma signature
- Payload – data yang dikirim, misalnya email atau ID
- Signature – hasil hash dari header + payload menggunakan secret key
Format JWT:
xxxxx-header-xxxxx.xxxxx-payload-xxxxx.xxxxx-signature-xxxxx
Contoh Implementasi JWT di Python
pip install pyjwt import jwt import datetime # Secret key untuk membuat dan memverifikasi signature SECRET_KEY = "sangat-rahasia-harus-diganti" # Membuat token (misalnya untuk dikirim ke email) payload = { "email": "user@example.com", "exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=15) # Token berlaku 15 menit } token = jwt.encode(payload, SECRET_KEY, algorithm="HS256") print(f"Link login: https://example.com/login?token={token}")
Memverifikasi Token Saat User Klik Link
try: decoded = jwt.decode(token, SECRET_KEY, algorithms=["HS256"]) print("Token valid. Email:", decoded["email"]) except jwt.ExpiredSignatureError: print("Token kadaluarsa.") except jwt.InvalidTokenError: print("Token tidak valid.")
Bagaimana Jika Payload-nya Dimodifikasi?
Nah, disinilah pentingnya signature. Walaupun token JWT bisa di-decode tanpa secret key, tetapi tidak bisa diubah tanpa membuat signature-nya jadi tidak valid. Misalnya, mari kita coba membaca isi token tanpa memverifikasi signature:
# Decode tanpa verifikasi signature (HATI-HATI! hanya untuk demonstrasi) decoded_payload = jwt.decode(token, options={"verify_signature": False}) print("Payload terlihat:", decoded_payload) Hasil dari kode di atas akan menampilkan isi payload dalam bentuk dictionary: {'email': 'user@example.com', 'exp': 1712600000}
Ini berarti token yang kita hasilkan dapat dilihat siapapun yang mendapatkannya.
Bagaimana Jika Ada yang Mengubah Payload?
Misalnya si pengguna atau penyerang mencoba mengganti email di token menjadi milik orang lain, seperti ini:
# Modifikasi payload fake_payload = { "email": "hacker@example.com", "exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=15) } # Encode ulang dengan payload palsu (tanpa tahu SECRET_KEY) fake_token = jwt.encode(fake_payload, "secret-palsu", algorithm="HS256")
# Verifikasi dengan SECRET_KEY yang asli try: decoded = jwt.decode(fake_token, SECRET_KEY, algorithms=["HS256"]) print("Token valid. Email:", decoded["email"]) except jwt.InvalidTokenError: print("Token TIDAK valid karena tanda tangannya tidak cocok.")
Output:
Token TIDAK valid karena tanda tangannya tidak cocok.
Artinya, meskipun payload dapat dimanipulasi, token tersebut langsung dianggap tidak sah oleh sistem kita karena signature-nya tidak bisa dipalsukan tanpa SECRET_KEY.
Kesimpulan
Autentikasi passwordless menawarkan kenyamanan dan keamanan yang lebih baik dibandingkan password tradisional. Dengan hanya menggunakan email dan JWT, Anda bisa membangun sistem login yang:
- Tidak memerlukan password
- Mudah diimplementasikan lintas platform
- Tetap aman berkat mekanisme signature
Namun perlu diingat:
Setiap metode punya kelebihan dan kekurangannya. Jika Anda menerapkan metode passwordless berbasis email, maka keandalan layanan email harus sangat diperhatikan. Keterlambatan atau kegagalan pengiriman email akan langsung berdampak pada pengalaman pengguna.
Selain itu, semakin besar volume email yang dikirim, biaya layanan email pun meningkat. Artinya, implementasi ini juga harus linier dengan skala dan anggaran sistem Anda.
Jika Anda membangun aplikasi web atau mobile modern, saatnya mempertimbangkan metode ini sebagai alternatif yang lebih ringan dan efisien dibandingkan autentikasi konvensional.