Bayangkan kamu login di HP teman, lalu lupa logout. Atau ada seseorang yang berhasil menebak password kamu dan login diam-diam dari kota lain. Tanpa notifikasi, kamu tidak akan tahu kalau akunmu sedang diakses. Fitur notifikasi keamanan login dari perangkat baru akan langsung mengirimkan email peringatan ke pengguna setiap kali akun diakses dari perangkat atau lokasi yang belum dikenali.
Tujuannya: menjaga keamanan akun dan memberi kesempatan pengguna untuk segera mengambil tindakan (misalnya mengganti password atau logout semua perangkat).
Struktur Database Tambahan
Kita akan menggunakan tabel user_sessions yang sudah dibuat sebelumnya. Namun, tambahkan kolom untuk menandai apakah perangkat ini sudah pernah dikonfirmasi oleh pengguna:
ALTER TABLE user_sessions ADD COLUMN is_verified TINYINT(1) DEFAULT 0;
Kolom is_verified digunakan untuk membedakan perangkat baru (belum dikenal) dan lama (sudah pernah login).
Deteksi Login dari Perangkat Baru
Setiap kali user login berhasil, sistem akan cek apakah device + IP + user agent sudah pernah digunakan sebelumnya.
<?php
$user_id = $user['id'];
$ip = $_SERVER['REMOTE_ADDR'];
$agent = $_SERVER['HTTP_USER_AGENT'];
$stmt = $conn->prepare("SELECT * FROM user_sessions WHERE user_id=? AND ip_address=? AND user_agent=? AND is_verified=1 LIMIT 1");
$stmt->bind_param("iss", $user_id, $ip, $agent);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 0) {
// Perangkat baru terdeteksi
sendSecurityAlert($user['email'], $ip, $agent);
}
?>
Fungsi Mengirim Notifikasi Email (PHPMailer)
Gunakan PHPMailer untuk mengirim email peringatan ke pengguna:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
function sendSecurityAlert($email, $ip, $agent) {
$mail = new PHPMailer(true);
try {
// Konfigurasi SMTP
$mail->isSMTP();
$mail->Host = 'smtp.yourdomain.com';
$mail->SMTPAuth = true;
$mail->Username = 'noreply@yourdomain.com';
$mail->Password = 'yourpassword';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('noreply@yourdomain.com', 'Keamanan Akun');
$mail->addAddress($email);
$mail->isHTML(true);
$mail->Subject = '⚠️ Login dari Perangkat Baru Terdeteksi';
$mail->Body = "
<h2>Login dari perangkat baru terdeteksi</h2>
<p>Kami mendeteksi login baru pada akun Anda:</p>
<ul>
<li><b>Alamat IP:</b> $ip</li>
<li><b>Perangkat:</b> $agent</li>
<li><b>Waktu:</b> " . date('Y-m-d H:i:s') . "</li>
</ul>
<p>Jika ini Anda, abaikan pesan ini.</p>
<p>Jika bukan, segera <a href='https://yourdomain.com/reset_password.php'>ganti password Anda</a> dan <a href='https://yourdomain.com/devices.php'>logout semua perangkat</a>.</p>
<hr>
<p style='color:gray'>Pesan ini dikirim otomatis untuk melindungi akun Anda.</p>";
$mail->send();
} catch (Exception $e) {
error_log("Gagal mengirim email: {$mail->ErrorInfo}");
}
}
?>
Simpan dan Tandai Perangkat yang Dikenali
Setelah mengirim notifikasi, tambahkan data perangkat ke tabel user_sessions dan tandai sebagai terverifikasi:
<?php
$token = bin2hex(random_bytes(32));
$stmt = $conn->prepare("INSERT INTO user_sessions (user_id, ip_address, user_agent, token, is_verified) VALUES (?, ?, ?, ?, 1)");
$stmt->bind_param("isss", $user_id, $ip, $agent, $token);
$stmt->execute();
?>
Dengan cara ini, jika user login dari perangkat yang sama di lain waktu, sistem tidak akan mengirim notifikasi lagi.
Menambahkan Informasi Lokasi (Opsional)
Untuk meningkatkan keamanan, kamu bisa menambahkan lokasi perkiraan login berdasarkan IP menggunakan API geolocation seperti ip-api.com atau ipinfo.io.
Contoh sederhana:
<?php
function getLocationByIP($ip) {
$data = @file_get_contents("http://ip-api.com/json/{$ip}");
if ($data) {
$json = json_decode($data, true);
return "{$json['city']}, {$json['country']}";
}
return 'Lokasi tidak diketahui';
}
?>
Lalu kirimkan info lokasi di email notifikasi:
<?php $location = getLocationByIP($ip); $mail->Body .= "<li><b>Lokasi:</b> $location</li>"; ?>
Tips Keamanan Tambahan
Untuk menjaga fitur ini tetap aman dan efisien:
-
Batasi pengiriman email → jangan kirim terus-menerus setiap login; hanya untuk perangkat baru.
-
Gunakan
HttpOnlycookie agar token login tidak mudah dicuri via JavaScript. -
Gunakan hash untuk token perangkat jika disimpan di database.
-
Tambahkan “Verifikasi Perangkat” (opsional) agar user bisa melihat dan menandai perangkat terpercaya.
Contoh Tampilan Notifikasi di Email
Subjek: ⚠️ Login dari Perangkat Baru Ditemukan
Isi:Kami mendeteksi login baru pada akun Anda dari Google Chrome (Windows 10)
IP: 36.79.XX.XX – Lokasi: Jakarta, IndonesiaJika ini Anda, abaikan pesan ini.
Jika bukan, segera ganti password Anda dan logout dari semua perangkat.
Kesimpulan
Dengan menambahkan fitur Notifikasi Keamanan Login dari Perangkat Baru, kamu telah meningkatkan keamanan sistem login PHP MySQL ke level profesional.
Sekarang pengguna:
✅ Mendapatkan email peringatan otomatis jika akun diakses dari perangkat asing
✅ Bisa segera mengganti password atau logout semua perangkat
✅ Memiliki rasa aman seperti menggunakan sistem dari perusahaan besar