Skip to main content

API Security Best Practices

· 2 min read
Rajiv I'm
Engineer @ UseDocu

Securing your APIs is crucial in modern web development. Learn essential practices to protect your endpoints and user data from common security threats.

Authentication Strategies

Implement robust authentication using JWT tokens:

const jwt = require("jsonwebtoken");

// Generate JWT token
function generateToken(user) {
return jwt.sign({ id: user.id, email: user.email }, process.env.JWT_SECRET, {
expiresIn: "24h",
});
}

// Verify token middleware
const verifyToken = (req, res, next) => {
const token = req.headers["authorization"]?.split(" ")[1];

if (!token) {
return res.status(403).json({ message: "No token provided" });
}

try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (err) {
return res.status(401).json({ message: "Invalid token" });
}
};

Rate Limiting

Protect your API from abuse using rate limiting:

const rateLimit = require("express-rate-limit");

const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // Limit each IP to 100 requests per window
message: "Too many requests, please try again later",
standardHeaders: true,
legacyHeaders: false,
});

// Apply to all routes
app.use("/api/", apiLimiter);

Input Validation

Validate all incoming data to prevent injection attacks:

const { body, validationResult } = require("express-validator");

// Validation middleware
const validateUser = [
body("email").isEmail().normalizeEmail(),
body("password").isLength({ min: 8 }),

(req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
next();
},
];