ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js, Express 기본 middleware 정리
    백엔드/Node.js 2020. 7. 16. 15:29

    static

    express.static은 express에서 제공하는 미들웨어 함수이다. 이 미들웨어는 정적인 파일(static file) -이미지 파일, css 파일, javascript 파일 등- 을 제공하며 serve-static 기반이다. express.static(root, [option])의 형식으로 사용하면 되고, root 인자는 정적인 자료가 제공되는 디렉터리(directory)를 나타낸다(자세한 내용은 공식 문서 참고). 만약 파일을 찾지 못할 경우, 404 에러 메시지를 보내는 대신 다음 미들웨어 함수를 실행하기 위해 next() 함수를 call 한다.

    // /uploads, /static 경로에 express.static 미들웨어 마운트
    app.use('/uploads', express.static('uploads'));
    app.use('/static', express.static('static'));

     

    multer

    multer는 node.js가 제공하는 미들웨어로서 파일 업로드하는 데 사용된다. 다만 multipart/form-data가 아닌 형태는 처리하지 않는다. npm을 통해 모듈을 설치할 수 있으며 자세한 사용법은 npm 문서에 나와있다. 일반적으로 dest 옵션만 지정해도 되지만, 좀 더 세세하게 기능을 제어해야 될 경우 dest 대신 storage 옵션을 사용하면 된다.

    // 'uploads/videos/' 경로에 파일 업로드한다고 알려주는 옵션
    // (만약 옵션을 안 준다면 메모리에만 저장되고 디스크에는 저장되지 않는다)
    let upload = multer({ dest: 'uploads/videos/' });

    multer의 몇 가지 메서드 소개하자면 아래와 같다

    • .single(fieldname)
      fieldname으로 지정된 하나의 파일만 업로드.
    • .array(fieldname[, maxCount])
      fieldname으로 지정된 여러 개의 파일(배열 형태)을 업로드. maxCount는 최대 몇 개의 파일을 수용할 건지 지정하는 옵션.
    • .none()
      파일 업로드 없이 텍스트만 전송.
    // '/upload'에 post요청 보내면, form으로 전송되는 파일의 name 속성이 'videoFile'인 데이터 업로드
    app.post('/upload', upload.single('videoFile'), function(req, res, next){ ... })

     

    helmet

    helmet 미들웨어를 사용하면 HTTP 헤더를 적절히 설정하여 몇 가지 잘 알려진 웹 취약성으로부터 앱을 보호할 수 있다. 사실 helmet은 보안 관련 HTTP 헤더를 설정하는 더 작은 크기의 미들웨어들의 모음이다. 

    • csp: Content-Security-Policy 헤더를 설정하여 XSS(Cross-site scripting) 공격 및 기타 교차 사이트 인젝션을 예방
    • hidePoweredBy: X-Powered-By 헤더 제거
    • hsts: 서버에 대한 안전한(SSL/TLS를 통한 HTTP) 연결을 적용하는 Strict-Transport-Security 헤더 설정
    • ieNoOpen: IE8 이상에 대해 X-Download-Options 설정
    • noCache: Cache-Control 및 Pragma 헤더를 설정하여 클라이언트 측에서 캐싱을 사용하지 않도록 함
    • noSniff: X-Content-Type-Options를 설정해 선언된 콘텐츠 유형을 벗어난 응답에 대한 브라우저의 MIME 가로채기 방지
    • frameguard: X-Frame-Options 헤더를 설정하여 Clickjacking 공격으로부터 보호
    • xssFilter: X-XSS-Protection을 설정하여 대부분의 최신 웹 브라우저에서 XSS(Cross-site scripting) 필터를 사용하도록 함

    helmet을 사용하지 않는 경우라도 X-Powered-By 헤더를 사용하지 않도록 따로 설정하는 게 좋다. 공격자가 X-Powered-By 헤더(기본적으로 사용하도록 설정되어 있음)를 이용해 Express를 실행하는 앱을 발견한 후 특정한 대상에 대한 공격을 실행할 수 있기 때문이다.

    const app = express();
    // helmet 사용
    app.use(helmet());
    
    // 만약 helmet을 사용하지 않는 경우 아래와 같이 'x-powered-by'헤더 사용을 막는게 좋다
    app.disable('x-powered-by')

     

    morgan

    HTTP 요청 로거 미들웨어로서 morgan(format, options) 형식으로 사용한다. options 객체에는 immediate, skip, stream 속성을 받을 수 있으며, format에는 아래와 같이 기존에 선언된 속성들을 사용할 수 있다

    • combined: 표준 Apache combined 로그 출력
    • common: 표준 Apache common 로그 출력
    • dev: 응답 코드에 상태에 따라 다른 색깔로 출력하며 축약된 로그를 보여줌 (빨간색 - 서버 에러 / 노란색 - 클라이언트 에러 / 청록색 - 리다이랙션 코드/ 녹색 - 정상 응답 코드)
    • short: 기본값보다 짧은 로그 출력. 응답 시간 포함
    • tiny: 최소화된 로그 출력
    import logger from 'morgan';
    
    app.logger('dev');

    dev 포멧을 사용했을 때 출력 화면

    cf) Winston

     

    NodeJS 인기있는 Logging 모듈 Winston

    Nodejs로 Express 서버를 만드는데 Debugging 용도로 console.log를 사용했었다. 그냥 이게 편하고 익숙해서...ㅎ 하지만 Project를 실제 수행하다보면 서버의 동작을 파악하거나 오류를 찾아야 할때 로그파�

    basketdeveloper.tistory.com

     

    cookie-parser

    쿠키 헤더를 파싱하고 요청 객체에 cookies 속성을 부여

     

    body-parser

    API 요청에서 받은 body 값을 파싱

     

     

     

     


    참고 자료

    댓글

jaejade's blog ٩( ᐛ )و