const jwt = require('jsonwebtoken'); exports.verifyToken = (req, res, next) => { try { const authHeader = req.headers['authorization']; if (!authHeader) { return res.status(401).json({ error: '토큰 없음' }); } const token = authHeader.split(' ')[1]; if (!token) { return res.status(401).json({ error: '토큰 누락' }); } const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); // ✅ 반드시 next 호출 } catch (err) { console.error('[verifyToken 오류]', err.message); return res.status(403).json({ error: '토큰 검증 실패', detail: err.message }); } }; /** * Admin 등급 이상 권한 체크 미들웨어 */ exports.requireAdmin = (req, res, next) => { try { if (!req.user) { return res.status(401).json({ error: '인증 필요', message: '먼저 로그인해주세요.' }); } const userRole = req.user.role; const adminRoles = ['admin', 'system']; if (!adminRoles.includes(userRole)) { return res.status(403).json({ error: '권한 부족', message: '관리자 권한이 필요합니다.', required: 'admin 또는 system', current: userRole }); } console.log(`✅ Admin 권한 확인: ${req.user.username} (${userRole})`); next(); } catch (err) { console.error('[requireAdmin 오류]', err.message); return res.status(500).json({ error: '권한 확인 중 오류 발생', detail: err.message }); } }; /** * System 등급 권한 체크 미들웨어 */ exports.requireSystem = (req, res, next) => { try { if (!req.user) { return res.status(401).json({ error: '인증 필요', message: '먼저 로그인해주세요.' }); } if (req.user.role !== 'system') { return res.status(403).json({ error: '권한 부족', message: '시스템 관리자 권한이 필요합니다.', required: 'system', current: req.user.role }); } console.log(`✅ System 권한 확인: ${req.user.username}`); next(); } catch (err) { console.error('[requireSystem 오류]', err.message); return res.status(500).json({ error: '권한 확인 중 오류 발생', detail: err.message }); } };