Express 미들웨어 실행 순서 이슈로 인한 인증 버그 해결
문제 상황
회원 정보 조회 API는 정상 동작하는데, 프로필 수정 API에서만 인증 토큰이 있어도 401 에러가 반환되는 이슈가 리포트됐다. 같은 인증 미들웨어를 사용하는데 왜 특정 라우트만 문제가 생기는지 원인 파악이 필요했다.
원인 분석
코드를 점검해보니 라우터 등록 순서에 문제가 있었다.
// 문제가 있던 코드
app.use('/api/profile', profileRouter);
app.use(authMiddleware);
app.use('/api/user', userRouter);
Express는 미들웨어를 등록된 순서대로 실행한다. 위 코드에서 /api/profile 라우터는 인증 미들웨어보다 먼저 등록되어 인증 체크를 거치지 않았던 것이다.
해결 방법
전역 미들웨어는 라우터보다 먼저 등록하도록 수정했다.
// body parser 등 기본 미들웨어
app.use(bodyParser.json());
app.use(cors());
// 인증 미들웨어
app.use(authMiddleware);
// 라우터들
app.use('/api/user', userRouter);
app.use('/api/profile', profileRouter);
// 에러 핸들러
app.use(errorHandler);
특정 라우트만 인증을 제외하고 싶다면 미들웨어 내부에서 경로를 체크하거나, 해당 라우터에서 별도 처리하는 방식으로 구현했다.
const authMiddleware = (req, res, next) => {
const publicPaths = ['/api/auth/login', '/api/auth/signup'];
if (publicPaths.includes(req.path)) {
return next();
}
// 인증 로직
};
교훈
Express는 미들웨어 순서가 곧 실행 순서다. 특히 인증, 로깅, 에러 핸들링 같은 전역 미들웨어는 반드시 라우터보다 먼저 등록해야 한다. 간단한 원칙이지만 코드가 길어지면서 놓치기 쉬운 부분이었다.