-
Middleware 공부해보기 - 1편.Node.js 백엔드 2025. 11. 17. 20:40
회사에서 사용하는 다양한 미들웨어를 알아보자!
미들웨어는 순서가 중요하다고 하는데, 그전에 어떤 미들웨어를 사용하고 있는지 알아보자.
0. 간단한 목차
- helmet
- cookie-parser
- cors
- request-ip
- compression
- express-rate-limit
- morgan
1. helmet 라이브러리
Express 어플리케이션 보안 강화를 위한 HTTP 헤더를 설정하는 미들웨어 기능 모음.
//설치 npm install helmet //사용법 const express = require('express') const helmet = require('helmet') const app = express() app.use(helmet())별도의 커스텀 값을 넣지 않아도 기본 제공하는 보안 기능을 사용할 수 있다.
- CSP (content-security-policy) : 페이지에서 허용되는 리소스/스크립트 출처를 화이트리스트로 관리해서 여러 공격(XSS 포함) 완화.
- Strict-Transport-Security (HSTS) 등의 헤더를 설정해준다.
(* 필요하면 직접 찾아보자. )
2. cookie-parser
Express.js에서 쿠키를 쉽게 다루기 위한 미들웨어 라이브러리.
HTTP 요청 헤더의 Cookie 문자열을 파싱해서
req.cookies와 req.signedCookies 객체로 넣어주는 미들웨어.
직접 req.headers.cookie를 파싱할 필요없이, req.cookies.sessionId로 접근이 가능해진다.
npm install cookie-parser //서명 없는 쿠키만 사용할 때 app.use(cookieParser()); //서명(signing)된 쿠키도 사용할 때 (secret 문자열 필요함.) app.use(cookieParser('mySecretKey')); app.get('/', (req,res) => { console.log(req.cookies); // {name : 'yonggyun', theme: 'dark'} 같은 형태. console.log(req.signedCookies); // 서명된 쿠키들만 모여있음. res.send('OK'); }); app.listen(3000);주의할점은 cookie-parser는 설정/삭제와 관련이 없다는 것이다.
app.use(cookieParser(secret))을 쓰고 나면, 뒤이어 나오는 미들웨어에서
req.cookies 또는 req.signedCookies를 이용할 수 있다.
3. cors (별도로 다룰 예정)
Express에서 CORS 헤더를 자동으로 붙여주는 미들웨어
브라우저는 다른 도메인/포트/프로토콜로 요청을 보낼 때, 서버가 CORS 관련 헤더를 안 주면 보안 때문에 응답을 막아버림.
CORS 허용을 위해 헤더를 수동으로 설정하는 것보다 cors 패키지를 사용하는 것이 합리적임.
//프론트 <http://localhost:3000> //백엔드 <http://localhost:8080> //이런 경우 서로 origin이 달라서 CORS 이슈 발생 /*CORS 허용을 위해 서버는 - Access-Control-Allow-Origin - Access-Control-Allow-Credentials 등의 헤더를 설정해줘야함. //해당 내용을 일일이 수동 세팅하는 것보다 cors 패키지를 사용하는 게 //합리적임.
4. request-ip
클라이언트의 IP 주소를 뽑아주는 미들웨어/유틸이다.
요청 객체(req)에 들어있는 여러 헤더/필드를 검사해서 진짜 클라이언트 IP를 하나 골라서 리턴해줌.
프록시나 로드밸런서, 클라우드 플레어같은 CDN이 껴있어도 최대한 올바른 IP를 찾아주려고 함.
//함수 또는 미들웨어로 쓸 수 있다. //설치 npm install request-ip //사용법 const requestIp = require('request-ip'); //전역 미들웨어 등록 app.get('/ip', (req, res) => { const ip = req.clientIp; // 이렇게 바로 사용 가능함. res.send(ip); });언제 사용하는가?
- 로그에 클라이언트 IP 남길 때
- rate limiting (IP 기준 제한)
- 보안/모니터링용
- 프록시/로드밸런서 환경에서 req.ip만 믿기 애매할 때
5. compression
Express에서 응답(body)을 gzip 등으로 압축해서 보내주는 미들웨어
클라이언트가
Accept-Encoding: gzip, deflate, br 처럼
gzip 같은 압축된 응답을 받을 수 있다고 보내면,
compression( ) 미들웨어가 응답 body를 gzip 같은 방식으로 압축해줌.
⇒ 응답 헤더에 Content-Encoding: gzip 을 붙여줌.
⇒ 네트워크 전송량이 줄고, 응답 속도 체감이 빨라짐.
브라우저는 자동으로 풀어서 보여줌.
사용법은 아래와 같이 쓰면 된다.
const compression = require('compression'); app.use(compression());
6. express-rate-limit (limiter)
요청 수를 제한하는 미들웨어
제한한 횟수보다 더 많은 요청이 들어오면 429 (Too Many Requests) 에러를 돌려줌.
용도는
- API 남용
- 봇/스크래핑
- 간단한 DoS 공격 막기 등이 있음.
사용 방법은 아래와 같음.
const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ windowMs: 1* 60 * 1000, // 1분을 기준으로 정함. max: 100, // IP당 1분에 최대 100요청으로 제한함. }); app.use(limiter);
7. morgan 라이브러리
Express에서 HTTP 요청을 로그로 찍어주는 미들웨어
const morgan = require('morgan'); const app = express(); app.use(morgan('dev')); //app.use(morgan('combined')); 운영에서 많이 씀.해당 라이브러리를 이용하면 파일에 로그를 남기는 것도 가능하다.
'Node.js 백엔드' 카테고리의 다른 글
MongoDB Atlas와 도커 컨테이너 연결하기 (feat. mongod, mongosh) (0) 2025.12.01 엔트리포인트 & 서버 부팅 (0) 2025.11.11