Best Practice dalam Penggunaan Express.js Authentication
Mengimplementasikan autentikasi dalam aplikasi Express.js melibatkan beberapa best practices untuk memastikan keamanan dan efisiensi. Berikut adalah beberapa langkah dan praktik terbaik dalam mengimplementasikan autentikasi:
1. Gunakan Middleware Autentikasi
Gunakan middleware untuk menangani autentikasi. Middleware seperti passport.js sangat populer dan menyediakan banyak strategi autentikasi (misalnya, local, OAuth, JWT).
Contoh penggunaan passport.js dengan strategi local:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
// Definisikan strategi local
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false, { message: 'Incorrect username.' }); }
if (!user.validPassword(password)) { return done(null, false, { message: 'Incorrect password.' }); }
return done(null, user);
});
}
));
// Middleware untuk autentikasi
app.post('/login', passport.authenticate('local', {
successRedirect: '/dashboard',
failureRedirect: '/login',
failureFlash: true
}));
2. Gunakan JSON Web Tokens (JWT)
JWT adalah standar terbuka untuk membuat token yang dikirim antara server dan client. Token ini dienkripsi dan digunakan untuk mengotentikasi permintaan.
Instalasi JWT:
npm install jsonwebtoken
Menggunakan JWT:
const jwt = require('jsonwebtoken');
// Buat token
const token = jwt.sign({ userId: user.id }, 'secretKey', { expiresIn: '1h' });
// Middleware untuk memverifikasi token
function authenticateToken(req, res, next) {
const token = req.header('Authorization').replace('Bearer ', '');
if (!token) return res.sendStatus(401);
jwt.verify(token, 'secretKey', (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
// Route dengan middleware autentikasi
app.get('/protected', authenticateToken, (req, res) => {
res.send('This is a protected route');
});
3. Lindungi Password dengan Hashing
Jangan pernah menyimpan password dalam bentuk plaintext. Gunakan bcrypt untuk meng-hash password sebelum disimpan di database.
Instalasi bcrypt:
npm install bcrypt
Menggunakan bcrypt:
const bcrypt = require('bcrypt');
const saltRounds = 10;
// Hash password sebelum disimpan
bcrypt.hash(userPassword, saltRounds, function(err, hash) {
// Simpan hash di database
});
// Verifikasi password saat login
bcrypt.compare(inputPassword, storedHash, function(err, result) {
if(result) {
// Password cocok
} else {
// Password tidak cocok
}
});
4. Lindungi Rute dengan Middleware
Gunakan middleware untuk melindungi rute tertentu yang memerlukan autentikasi.
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}
app.get('/dashboard', ensureAuthenticated, (req, res) => {
res.send('Welcome to your dashboard');
});
5. Gunakan HTTPS
Pastikan aplikasi Anda berjalan di HTTPS untuk mengenkripsi data yang dikirimkan antara client dan server.
6. Implementasi Rate Limiting
Batasi jumlah permintaan autentikasi untuk mencegah serangan brute force.
Instalasi rate-limiter-flexible:
npm install rate-limiter-flexible
Menggunakan rate-limiter:
const { RateLimiterMemory } = require('rate-limiter-flexible');
const rateLimiter = new RateLimiterMemory({
points: 5, // 5 attempts
duration: 60, // per 60 seconds by IP
});
app.post('/login', (req, res) => {
rateLimiter.consume(req.ip)
.then(() => {
// Lakukan proses login
})
.catch(() => {
res.status(429).send('Too many requests');
});
});
7. Kelola Session dengan Baik
Jika menggunakan session-based authentication, pastikan session disimpan dengan aman.
Instalasi express-session:
npm install express-session
Menggunakan express-session:
const session = require('express-session');
app.use(session({
secret: 'yourSecret',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));
8. Terapkan Logout
Pastikan pengguna dapat logout dan session mereka dihapus.
app.post('/logout', (req, res) => {
req.logout();
res.redirect('/');
});
Dengan mengikuti best practices ini, Anda dapat meningkatkan keamanan dan efisiensi autentikasi dalam aplikasi Express.js Anda.