티스토리 뷰

카테고리 없음

[Javascript] 미들웨어(Middleware)

쳉링통망통 2024. 3. 29. 15:35

미들웨어(Middleware)가 무엇이고 왜 중요한가?

미들웨어는 Express.js와 같은 웹 프레임워크에서 핵심적인 개념 중 하나입니다. 이 글에서는 미들웨어의 개념, 기능, 그리고 Express.js에서의 활용 방법에 대해 자세히 알아보겠습니다. 각 미들웨어의 역할과 함께 예시 코드를 통해 실제 구현 방법도 확인해보겠습니다.

 

1. 미들웨어란 무엇인가?

미들웨어는 Express.js에서 요청과 응답 사이에 위치하여 요청을 처리하고 응답을 생성하는 데 사용되는 함수입니다. 미들웨어는 다음 미들웨어로 제어를 전달하거나 응답을 생성하는 등의 작업을 수행합니다. 이를 통해 Express 애플리케이션의 동작을 조율하고 확장할 수 있습니다.

 

2. Express.js에서의 미들웨어 사용법

Express.js에서 미들웨어를 사용하는 방법은 매우 간단합니다. 미들웨어는 app.use() 메서드를 사용하여 추가됩니다. 예를 들어, 다음과 같이 로그를 출력하는 미들웨어를 추가할 수 있습니다.

const express = require('express');
const app = express();

// Logger 미들웨어
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url}`);
  next();
});

// 라우트
app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

이 예제에서는 모든 요청에 대해 요청 메서드와 URL을 로깅하는 간단한 미들웨어를 추가했습니다.

3. 자주 사용되는 미들웨어들과 예시 코드

Body Parser 미들웨어

Body Parser 미들웨어는 Express 애플리케이션에서 요청 본문을 파싱하는 데 사용됩니다. 이를 통해 클라이언트가 전송한 JSON, URL 인코딩된 데이터 등을 쉽게 처리할 수 있습니다. Body Parser 미들웨어는 보통 POST나 PUT 요청과 함께 전송된 데이터를 처리하는 데 자주 사용됩니다.

아래는 Body Parser 미들웨어를 사용하여 JSON 데이터를 파싱하는 예시 코드입니다.

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

// JSON 파싱 미들웨어
app.use(bodyParser.json());

// 라우트
app.post('/api/data', (req, res) => {
  console.log(req.body); // 파싱된 JSON 데이터 출력
  res.send('Data received');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

 

위 코드에서 app.use(bodyParser.json())는 Body Parser 미들웨어를 추가하고 있습니다. 이를 통해 Express 애플리케이션은 JSON 형식의 요청 본문을 파싱하여 req.body 객체에 저장합니다. 그리고 /api/data 엔드포인트에서 POST 요청이 들어오면, 파싱된 데이터를 콘솔에 출력하고 응답으로 "Data received"를 전송합니다.

 

Logger 미들웨어

Logger 미들웨어는 요청에 대한 정보를 로깅하는 데 사용됩니다. 이를 통해 요청의 메서드, URL 등에 대한 정보를 콘솔이나 로그 파일에 기록할 수 있습니다. 보통 개발 및 디버깅 목적으로 사용되며, Express 애플리케이션의 동작을 추적하고 이해하는 데 도움이 됩니다.

Logger 미들웨어는 다음과 같이 간단하게 구현할 수 있습니다.

const express = require('express');
const app = express();

// Logger 미들웨어
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url}`);
  next();
});

// 라우트
app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

 

위 코드에서 app.use()를 통해 Logger 미들웨어를 추가하고 있습니다. 이 미들웨어는 각 요청이 들어올 때마다 해당 요청의 메서드와 URL을 콘솔에 출력합니다. 그리고 다음 미들웨어로 제어를 전달하기 위해 next()를 호출합니다.

 

Authentication 인증 미들웨어

인증 미들웨어(Authentication Middleware)는 Express.js 애플리케이션에서 사용자의 인증을 수행하는 역할을 담당하는 미들웨어입니다. 이 미들웨어는 클라이언트의 요청이 서비스에 접근할 권한이 있는지를 확인하고, 인증되지 않은 사용자를 거부하거나 특정 리소스에 접근 권한을 제한하는 등의 작업을 수행합니다.

인증 미들웨어는 주로 요청 헤더나 쿠키 등에 포함된 사용자 인증 정보를 검사하고 확인하는데 사용됩니다. 일반적으로 사용되는 인증 방법으로는 토큰 기반 인증(JSON Web Token 등), 세션 기반 인증, 기본 인증(Basic Authentication) 등이 있습니다.

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

// 토큰 검증 미들웨어
const authenticateToken = (req, res, next) => {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];
  if (!token) {
    return res.sendStatus(401); // 인증 실패 시 401 Unauthorized 응답 전송
  }

  jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => {
    if (err) {
      return res.sendStatus(403); // 토큰이 유효하지 않은 경우 403 Forbidden 응답 전송
    }
    req.user = user; // 요청 객체에 사용자 정보를 저장
    next(); // 다음 미들웨어로 요청 전달
  });
};

// 미들웨어 적용
app.use(authenticateToken);

// 보호된 엔드포인트
app.get('/protected', (req, res) => {
  res.send(`Hello ${req.user.name}!`);
});

// 서버 시작
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

 

위 코드에서 authenticateToken 함수는 토큰을 검증하여 인증을 수행하는 인증 미들웨어로 정의되어 있습니다. 이 함수는 클라이언트가 요청 헤더에 포함한 토큰을 추출하여 검증한 후, 토큰이 유효하면 요청 객체에 사용자 정보를 저장한 뒤 next()를 호출하여 다음 미들웨어로 요청을 전달합니다. 토큰이 없거나 유효하지 않은 경우에는 각각 401 Unauthorized와 403 Forbidden 응답을 클라이언트에게 반환합니다.

 

이렇게 함으로써 Express 애플리케이션에서 특정 엔드포인트에 대한 인증이 보장됩니다. 인증 미들웨어를 통해 보안적인 요구사항을 충족시키고, 인증된 사용자에게만 접근 권한을 부여할 수 있습니다.

4. 커스텀 미들웨어 작성하기

커스텀 미들웨어(custom middleware)는 Express.js와 같은 웹 프레임워크에서 개발자가 직접 작성한 함수로, 요청과 응답을 처리하는 과정에서 중간에 실행되는 소프트웨어입니다. 이러한 미들웨어 함수는 Express 애플리케이션의 요청-응답 주기에 간섭하여 다양한 작업을 수행할 수 있습니다.

커스텀 미들웨어는 일반적으로 다음과 같은 작업을 수행하는 데 사용됩니다:

  1. 요청 로깅: 요청에 대한 정보를 기록하여 디버깅 및 모니터링에 활용합니다.
  2. 인증 및 권한 부여: 사용자의 인증 상태를 확인하고 권한을 부여하여 접근 제어를 수행합니다.
  3. 데이터 변환 및 가공: 요청 또는 응답의 데이터를 가공하거나 변환하여 필요한 형식으로 만듭니다.
  4. 오류 처리: 예외 상황을 처리하고 오류 메시지를 생성하여 클라이언트에 반환합니다.
  5. 캐싱: 요청에 대한 결과를 캐싱하여 성능을 향상시킵니다.
  6. 세션 관리: 사용자 세션을 관리하고 유지합니다.

커스텀 미들웨어는 Express 애플리케이션의 app.use() 메서드를 사용하여 등록됩니다. 이러한 미들웨어는 요청 처리 파이프라인에서 순차적으로 실행되며, 각 미들웨어는 요청 객체(req), 응답 객체(res), 그리고 다음 미들웨어로 요청을 전달하는 next 함수를 인자로 받습니다.

const express = require('express');
const app = express();

// 커스텀 미들웨어
const myMiddleware = (req, res, next) => {
  console.log('This is a custom middleware');
  next();
};

// 커스텀 미들웨어 사용
app.use(myMiddleware);

// 라우트
app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

위 코드에서 myMiddleware라는 커스텀 미들웨어 함수를 정의하고 있습니다. 이 함수는 요청 객체(req), 응답 객체(res), 그리고 다음 미들웨어로 요청을 전달하는 next 함수를 인자로 받습니다. 이 함수는 간단히 콘솔에 "This is a custom middleware"라는 메시지를 출력한 뒤 next()를 호출하여 다음 미들웨어로 요청을 전달합니다.

 

그 후 app.use() 메서드를 사용하여 애플리케이션에 커스텀 미들웨어를 추가하고 있습니다. 이를 통해 모든 요청이 해당 미들웨어를 거치게 됩니다.

 

마지막으로 / 경로에 대한 GET 요청이 들어오면, Express는 등록된 미들웨어를 순서대로 실행하게 되며, 그 중 myMiddleware가 실행됩니다. 따라서 요청이 해당 경로로 오면 콘솔에 "This is a custom middleware"가 출력되고, 다음으로 응답이 전송되는 것을 확인할 수 있습니다.

 

이와 같이 커스텀 미들웨어를 사용하면 애플리케이션의 요청 처리 과정을 중간에 개입하여 원하는 작업을 수행할 수 있습니다.

 

5. 마치며

미들웨어의 개념과 Express.js에서의 활용 방법, 그리고 몇 가지 자주 사용되는 미들웨어들에 대해 알아보았습니다. 미들웨어를 사용하여 Express 애플리케이션을 보다 효율적으로 구축하고 유연하게 조작할 수 있습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함