ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Middleware 공부해보기 - 1편.
    Node.js 백엔드 2025. 11. 17. 20:40

    회사에서 사용하는 다양한 미들웨어를 알아보자!

    미들웨어는 순서가 중요하다고 하는데, 그전에 어떤 미들웨어를 사용하고 있는지 알아보자.

    0. 간단한 목차

    1. helmet
    2. cookie-parser
    3. cors
    4. request-ip
    5. compression
    6. express-rate-limit
    7. 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'));  운영에서 많이 씀. 
    

    해당 라이브러리를 이용하면 파일에 로그를 남기는 것도 가능하다.

Designed by Tistory.