https://expressjs.com/en/guide/using-middleware.html를 요약하여 작성하였다 (Express 4.X 기준).

미들웨어란

Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출입니다.

위 말처럼 Express는 미들웨어에서 시작해 미들웨어로 끝난다. 그만큼 Express에서 미들웨어는 중요한 개념이다. 미들웨어 함수는 요청 오브젝트(req), 응답 오브젝트 (res), 그 다음의 미들웨어 함수(next)를 매개변수로 전달받는 함수이다. 인증, 요청 검증, 요청 처리, 오류 처리 등 다양한 기능을 미들웨어로 만들 수 있다.

미들웨어의 종류

Express는 미들웨어들을 아래와 같이 나눌 수 있다.

애플리케이션 레벨 미들웨어

애플리케이션 인스턴스에 직접 연결되어, 전체 애플리케이션의 요청 및 응답 처리에 적용된다.

//express 인스턴스에 미들웨어를 등록한다.
const app = express();

app.use((req, res, next) => { ... });
app.use('/user/:id', (req, res, next) => { ... });
app.get('/user/:id', (req, res, next) => { ... });
app.post('/user/:id', (req, res, next) => { ... });

라우터 레벨 미들웨어

특정 라우터의 요청 및 응답 처리에 적용된다.

//라우터에 미들웨어를 등록한다.
const app = express.Router();

app.use((req, res, next) => { ... });
app.use('/user/:id', (req, res, next) => { ... });
app.get('/user/:id', (req, res, next) => { ... });

오류 처리 미들웨어

에러가 발생했을 때 호출되는 특수한 형태의 미들웨어이다. 매개변수가 4개이면 오류 처리 미들웨어로 적용된다.

app.use((err, req, res, next) => { ... })

기본 제공 미들웨어

Express에서 기본적으로 제공하는 미들웨어 함수이다. 4.X 버전에서는 기본 제공 미들웨어는 아래 3가지를 제공한다.

const options = {
    dotfiles: 'ignore', // dotfile을 제공하기 위한 옵션 “allow”, “deny”, “ignore”
    etag: false, // etag를 생성할지
    extensions: ['htm', 'html'], // 파일 확장자 폴백을 설정
    index: false, // 디렉토리 인덱스 파일을 전송할지
    lastModified: false, // 해당 파일이 마지막으로 수정된 날짜를 Last-Modified 헤더에 설정할지
    maxAge: '1d', // Cache-Control 헤더의 max-age 특성을 설정
    redirect: false, // 경로 이름이 디렉토리인 경우 후미부의 “/”로 경로를 재지정할지
    setHeaders: function (res, path, stat) {
      res.set('x-timestamp', Date.now());
    }
}

app.use(express.static(path.join(__dirname, 'public'), options));

써드 파티 미들웨어

써드 파티 미들웨어는 express에 기본으로 포함되지 않은 미들웨어이다.

아래 미들웨어들은 예전 express에 포함되었지만 4.x 버전에는 별도의 모듈로 분리가 되었다. 사용하기 위해서는 별도로 설치를 해야한다.

미들웨어 이전 이름 기능
compression compress HTTP 응답을 압축하여 전송
connect-timeout timeout 요청의 타임아웃을 설정
cookie-parser cookieParser 쿠키를 파싱하여req.cookies에 저장
cookie-session cookieSession 세션 정보를 쿠키에 저장
csurf csrf CSRF(Cross-Site Request Forgery) 공격을 방지
errorhandler error-handler 오류 발생 시 에러를 처리하고 응답
express-session session 서버 측 세션을 관리
method-override method-override HTTP 메서드(예: POST)를 다른 메서드로 변경
morgan logger HTTP 요청 로그를 기록
response-time response-time 요청 처리 시간 정보를 응답 헤더에 추가
serve-favicon favicon 애플리케이션에 파비콘을 제공
serve-index directory 디렉토리 목록을 제공하는 기능을 추가
vhost vhost 가상 호스트를 지원하여 여러 도메인을 처리