| name | securing-nodejs-apps |
| description | Hardens Node.js HTTP services: input validation, secure headers, authentication/authorization basics, secret handling, and dependency hygiene. Use when shipping to production or reviewing a service for security gaps. |
Securing Node.js Apps
When to use
- Shipping a service to production
- Reviewing a service for security gaps
- Adding authentication/authorization
- Handling secrets properly
Core rules
- Input validation on all external boundaries (class-validator or Zod)
- Secure headers: Helmet or equivalent
- Secrets in env vars, never in code or logs
- Authentication/authorization as ports, not hardcoded
- Dependency hygiene:
npm audit, no known vulnerabilities
- Rate limiting on public endpoints
Reference shape (TypeScript)
Input Validation (Zod)
import { z } from 'zod';
export const CreateUserSchema = z.object({
email: z.string().email().toLowerCase(),
password: z.string().min(12),
name: z.string().min(2).max(100),
});
export type CreateUserDto = z.infer<typeof CreateUserSchema>;
Secret Handling
const jwtSecret = 'my-secret';
import { config } from '@shared/config';
const jwtSecret = config.JWT_SECRET;
Examples — Do
const parsed = CreateUserSchema.safeParse(req.body);
if (!parsed.success) return res.status(400).json({ errors: parsed.error.format() });
Examples — Don't
app.post('/user', (req, res) => { db.save(req.body); });
const apiKey = 'sk_live_12345';
Checklist
See reference/security-patterns.md for full patterns.