이전 미들웨어 사용하기에 이어서 진행할 예정이다.

이전 미들웨어 코드는 아래와 같다.

app.use((req, res, next) => {
  console.log('모든 요청에 실행하고 싶어요');
  next();
})

특정 라우터에 미들웨어 실행

해당 미들웨어는 모든 요청을 거쳐서 실행이 되는 코드이고, 만약 특정 라우터에서만 실행되길 원한다면 아래처럼 코드를 작성할 수 있다.

// /about에 대해서만 미들웨어 동작
app.use('/about', (req, res, next) => {
  console.log('/about 요청에 실행하고 싶어요');
  next();
})

미들웨어 연달아 실행

또, 미들웨어는 next()가 있으면 다음으로 넘어가므로, 여러가지 미들웨어를 붙이는 것이 가능하다.

app.use((req, res, next) => {
  console.log('1 요청에 실행하고 싶어요');
  next();
}, (req, res, next) => {
  console.log('2 요청에 실행하고 싶어요');
  next();
}, (req, res, next) => {
  console.log('3 요청에 실행하고 싶어요');
  next();
})

에러 미들웨어

미들웨어나 라우터에서 에러가 발생하면 에러처리를 미들웨어로 할 수 있다.

app.use((err, req, res, next) => {
  console.error(err);
  res.send('에러 발생');
})

에러 미들웨어는 err 매개변수를 보유하고 있다. 또한, 4가지 매개변수를 모두 사용해야 한다.

404 커스터마이징

express는 위에서부터 순차적으로 라우터를 찾기 때문에 만약 가장 아래까지 라우터를 탐색했을 때 찾고자 하는 라우터가 없다면, 404 에러를 발생시킨다.

따라서 모든 라우터 하단에 404 에러를 처리하는 미들웨어를 하나 추가한다면 404 에러를 커스텀해서 처리할 수 있다.

res에는 status 200 이 생략되어 있으므로, 상태도 별도로 status 설정이 가능하다.

// 가장 하단에 추가
app.use((req, res, next) => {
    res.status(404).send('404 발생');
})

실무적으로는 상태가 해커에게 힌트를 줄 수 있다. 예를 들어서 401 이면 인증 실패, 403이면 권한 없음 등등이 있어서 일부러 403이 뜨는 요청에 대해 권한은 없지만 실제 페이지나 민감한 기능이 존재한다고 파악하여 공격을 시작할 수 있다. 따라서 해커들에게 힌트를 주지 않기 위해서 status를 속이는 방식으로 방어를 할 수 있다.

다만, 모든 에러 코드를 다 속인다면 협업하는 프론트엔드 개발자가 에러 원인을 찾지 못해 디버깅이 어려워진다. 따라서 모든 곳에 적용하기보다 관리자 페이지 주소나 민감한 API 등에 선택적으로 적용하는 것이 좋다.