JS/Node.js

[node.js] morgan, cookie-parser, body-parser 등 미들웨어란?

kth990303 2021. 4. 1. 21:11
반응형

어제 공부한 내용인데 기억이 가물가물해서 오늘 복습하고 포스팅하여 기록에 남겨두려고 한다.

바로 nodejs에서 자주 사용되는 middleware들인 morgan, cookie-parser, express-session이다.

참고로 위에서 말했듯이 어제 공부한 내용을 기록하는 거라 아주 기초적인 내용밖에 없다.

 

(21.04.01. 기준) 제가 공부하려고, 그리고 까먹지 않으려고 기록한 내용이라 상세한 내용은 없습니다.

(특히 express-session 쪽은 그냥 노베이스 상태입니다)

 

따라서 npm i morgan cookie-parser express-session 으로 위 세 개의 패키지를 깔아두는 것이 좋을 것이다.


인프런 조현영님의 Node.js 교과서를 수강 후

기록하기 위해 정리해본 내용입니다.

틀린 점이 있다면 댓글로 피드백 부탁드립니다 :)



Morgan

먼저 코드와 실행결과를 보자.

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

app.use(morgan('combined'));

app.get('/about', (req, res)=>{
    res.send('hello expresss');
});
 
app.post('/about', (req, res)=>{
    res.send('hello expresss');
});

app.get('/category/:name', (req, res)=>{
    res.send(`hello ${req.params.name}`);
});

실행 결과

대략 느낌이 오는가?

그렇다. morgan은 접속 로그를 띄워주는 미들웨어다.

 

app.use(morgan('dev')); 로 할 경우 method, 접속 주소, 상태(status), 걸린 시간, 용량 순으로 로그를 띄워준다. 주로 개발 시에 많이 이용한다고 한다.

 

app.use(morgan('combined'));로 할 경우 브라우저 및 시간, ip, 환경까지 더 자세한 로그를 띄워준다고 한다. 주로 배포한 후에 많이 사용한다고 한다.


cookie-parser

 

이것도 쿠키 관련 작업을 더 간편하게 해주는 미들웨어라 생각하면 된다.

const cookieParser=require('cookie-parser');

app.use(cookieParser());

app.get('/', (req, res)=>{
    req.cookies;
    res.cookie('name', encodeURIComponent('name'), {
        expires: new Date(),
        httpOnly: true,
        path: '/'
    });
    res.clearCookie('name', encodeURIComponent('name'), {
        httpOnly: true,
        path: '/'
    });
    res.sendFile(path.join(__dirname, 'index.html'));
});

cookie를 간단하게 생성하고 지울 수 있다. 

clearCookie로 쿠키를 지울 땐 생성한 쿠키와 내용이 같아야 한다.

참고로 const cookie-parser가 아니고 const cookieParser이다.

 

그리고 app.use(cookieParser('kth990303password')); 와 같이 쿠키에 암호화가 필요한 데이터가 있는 경우,

req.signedcookies; 로 받아들이면 된다고 한다.


express-session

const express=require('express');
const path=require('path');
const morgan=require('morgan');
const cookieParser=require('cookie-parser');
const session=require('express-session');

const app=express();

app.set('port', process.env.PORT || 3000);

app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(cookieParser('kth990303password'));
app.use(session({  
    resave: false,
    saveUninitialized: false,
    secret: 'kth990303password',
    cookie:{
        httpOnly: true,
    },
    name: 'connect.sid',
}));
app.use(express.json());
app.use(express.urlencoded({extended: true}));

session에도 다양한 기능이 있다.

  • resave: 요청이 왔을 때 수정사항이 없어도 다시 저장할지 여부
  • saveUninitialized: 저장할 게 없어도 세션에 저장할지 여부
  • secret: 쿠키 암호화

보통 resave, uninitialized는 false로 한다고 한다.

 

session에 대한 기능은 다음에 실제로 예제를 만들어보면서 익히면 좋을 듯하다.

솔직히 지금은 딱히 쓸 게 없다. 

express-session에 대해선 이것저것 만들어보면서 추가수정하는걸로~


body-parser

참고로 body-parser는 최근에 express 안에 들어가서 일부의 경우 외에는 따로 설치를 할 필요가 없다고 한다.

app.use(express.json());
app.use(express.urlencoded({extended: true}));

그냥 이렇게 사용해주면 된다고 한다.

참고로 웬만해선 extended: true를 추천한다고 한다.

 

true일 경우 qs,

false일 경우 내장된 querystring을 사용한다고 하는데,

qs가 후자보다 더 강력하다고 한다.


 

그리고 미들웨어끼리도 순서가 중요하다. 필수적이진 않지만 미들웨어의 실행 여부에 따라 메모리 및 시간 손실을 줄일 수 있다.

 

예를 들어 정적인 라우터가 실행될 필요가 없는 단순 이미지 파일만 출력이 필요한 경우,

cookie-parser 미들웨어, express-session 미들웨어까지 다 실행되는 건 시간만 낭비할 뿐이다.

따라서 제일 광범위한 범위인 미들웨어일수록 위쪽에 놓는 것이 좋다.

예를 들면 morgan, static (정적 파일 제공 미들웨어)가 있다.

 

미들웨어 또한 노드이므로 위에서부터 아래로 실행이 된다.

그리고 미들웨어는 자체적으로 next()를 가지고 있다는 점도 잊지 말자.


미들웨어가 생각보다 내용이 많아서 까먹지 않기 위해 포스팅하였다.

어서 실전예제를 익히고싶은데... 한 5월쯤부터 익히지 않을까 싶다.

반응형