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가지를 제공한다.
express.static
: 정적 파일을 제공하는 기능. 이 함수는 serve-static을 기반으로 한다.express.json
: 요청 본문을 JSON으로 파싱. (4.16버전 이상에서 사용 가능)express.urlencoded
: 요청 본문을 URL-encoded 형식으로 파싱. (4.16버전 이상에서 사용 가능)
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 | 가상 호스트를 지원하여 여러 도메인을 처리 |