Загрузка…
Загрузка…
Node.js · middle · сложность 4
Аутентификация на основе файлов cookie:
Масштабируемость:
Безопасность:
// Cookie-based session example
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
app.use(session({
store: new RedisStore({ client: redisClient }),
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
secure: process.env.NODE_ENV === 'production',
httpOnly: true,
maxAge: 1000 * 60 * 60 * 24, // 24 hours
sameSite: 'strict'
}
}));Аутентификация на основе токенов:
Масштабируемость:
Безопасность:
// Token-based authentication
const jwt = require('jsonwebtoken');
// Secure token handling
function authenticateToken(req, res, next) {
// Extract from Authorization header
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
// Or extract from secure cookie
// const token = req.cookies.accessToken;
if (!token) {
return res.status(401).json({ error: 'Access token required' });
}
jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
if (err) {
return res.status(403).json({ error: 'Invalid or expired token' });
}
req.user = decoded;
next();
});
}Сводка сравнения:
Выберите файлы cookie для:
Выберите токены для:
Гибридный подход:
// Best of both worlds
app.post('/login', async (req, res) => {
// Validate credentials
const user = await validateUser(req.body);
// Create JWT
const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET, {
expiresIn: '15m'
});
// Store in HTTP-only cookie
res.cookie('accessToken', token, {
httpOnly: true,
secure: true,
sameSite: 'strict',
maxAge: 15 * 60 * 1000 // 15 minutes
});
res.json({ user: { id: user.id, email: user.email } });
});Ключевой вывод для интервью: сравните аутентификацию на основе файлов cookie и токенов с точки зрения масштабируемости и безопасности.