1.理解中間件的概念與作用
2.使用中間件管理請求與響應
3.學習應用安全性最佳實踐
4.應用安全驗證與授權
中間件(Middleware) 是在 Express 應用中處理請求和響應的函數。中間件可以在請求進入路由之前或響應返回客戶端之前執行操作。
每個中間件函數接收三個參數:
app.use((req, res, next) => {
console.log('Request URL:', req.originalUrl);
next(); // 繼續到下一個中間件或路由處理
});
Express 內建了幾個常用的中間件,例如解析 JSON 和 URL 編碼數據:
app.use(express.json()); // 解析 JSON 數據
app.use(express.urlencoded({ extended: true })); // 解析 URL 編碼數據
npm install morgan
使用 morgan:
const morgan = require('morgan');
app.use(morgan('dev')); // 記錄請求日誌
npm install helmet
使用 Helmet:
const helmet = require('helmet');
app.use(helmet()); // 自動設置多個安全相關的 HTTP 標頭
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('path/to/key.pem'),
cert: fs.readFileSync('path/to/cert.pem')
};
https.createServer(options, app).listen(443, () => {
console.log('HTTPS Server running on port 443');
});
使用 Helmet 提升安全性
Helmet 能夠自動設置一些 HTTP 標頭來防止多種常見的 Web 攻擊,如:
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "trustedscripts.com"],
objectSrc: ["'none'"],
upgradeInsecureRequests: [],
}
}));
npm install jsonwebtoken
生成 JWT:
const jwt = require('jsonwebtoken');
const token = jwt.sign({ userId: user._id }, 'your_secret_key', { expiresIn: '1h' });
res.json({ token });
驗證 JWT:
const jwt = require('jsonwebtoken');
const authenticateJWT = (req, res, next) => {
const token = req.header('Authorization').replace('Bearer ', '');
if (!token) {
return res.status(401).json({ error: 'Access denied' });
}
try {
const decoded = jwt.verify(token, 'your_secret_key');
req.user = decoded;
next();
} catch (err) {
res.status(400).json({ error: 'Invalid token' });
}
};
app.use('/protected-route', authenticateJWT, (req, res) => {
res.send('This is a protected route.');
});