express, middleware

2 분 소요

미들웨어

morgan

morgan 미들웨어는 콘솔에 요청에 대한 정보를 기록해준다.

사용법

...
var logger = reqire('morgan');
...
app.use(logger('dev'));
...

개발 시에는 주로 short, dev를 인자로 주며, 배포 시에는 common, combined를 사용한다.

parameter format
tiny :method :url :status :res[content-length] - :response-time ms
dev :method :url :status :response-time ms - :res[content-length]
short :remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms
common :remote-addr - :remote-user [:date[clf]] “:method :url HTTP/:http-version” :status :res[content-length]
combined :remote-addr - :remote-user [:date[clf]] “:method :url HTTP/:http-version” :status :res[content-length] “:referrer” “:user-agent”

참고로 데이터베이스에 로깅을 위해서는 winsotn모듈을 더 많이 사용한다.

body-parser

요청 본문 해석용 미들웨어다. 보통 폼 데이터와 AJAX 요청을 처리한다.

...
var bodyParser = require('body-parser');
...
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.raw());
app.use(bodyParser.text());
...

raw는 본문이 버퍼일 때, text는 본문이 텍스트 데이터일 때 해석하는 미들웨어이다.

json은 JSON 형태의 전달방식이며 url-encoded는 주소 형식으로 데이터를 보내는 방식이다. 보통 폼 전송이 이를 사용한다. 이 때 { extended: false }라는 옵션은 false일 노드의 querystring 모듈을 사용하여 해석하고 true이면 qs를 사용하여 해석한다.

4.16.0 버전부터 express에 bodyParser 일부 기능이 내장되었기 때문에 설치하지 않고도 사용이 가능하다. 사용법은 아래와 같다.

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

동봉된 쿠키를 해석한다. 사용법은 아래와 같다.

...
var cookieParser = reqire('cookie-parser');
...
app.use(cookieParser());
...

해석된 쿠키는 req.cookies 객체에 들어가게 된다. name=b1n 쿠키를 보냈다면 req.cookies는 { nmae: ‘b1n’ }이다.

제공한 문자열로 서명된 쿠키를 사용하고 싶으면 아래와 같이 작성한다.

app.use(cookieParser('secret code'));

static

static 미들웨어는 정적 파일들을 제공한다. 내장된 미들웨어이다. 사용법은 아래와 같다.

...
app.use(express.static(path.join(__dirname, 'public')));
...

정적인 파일들이 담겨있는 폴더를 지정하면 된다. 현재는 public 폴더가 지정되어 있는데, public/style/style.css를 접근하려면 localhost/st~/sty.css로 접근할 수 있다. 정적파일을 따로 fs.readFile과 같이 사용하여 보내줄 필요가 없다.

서버 구조의 파악을 지양하기 위해 public 폴더명이 따로 주소로 노출되지 않는 것을 주목하자. 파일 구조를 완전히 파악하지 못하기 위해 아래와 같이 제공할 주소를 지정할 수 있다.

...
app.use('/img', express.static(path.join(__dirname, 'public')));
...

express-session

세션 관리용 미들웨어. 로그인을 이유로 세션을 구현할 때 매우 유용하다.

...
var session = require('express-session');
...
app.use(session({
  resave: false,
  saveUninitialized: false,
  secret: 'secret code',
  cookie: {
    httpOnly: true,
    secure: false,
  },
}));
...

1.5 버전 이전에는 내부적으로 cookie-parser를 사용하고 있어 cookie-parser보다 뒤에 있어야 했지만, 사용하지 않게 되어 순서가 상관없어졌다.

인자로는 세션에 대한 설정을 받게 되는데,

  • resave는 요청이 왔을 때 세션에 수정사항이 생기지 않더라도 세션을 다시 저장할지에 대한 설정이다.
  • saveUninitialized는 세션에 저장할 내역이 없더라도 세션을 저장할지에 대한 설정이다. 둘 다 보통 방문자를 추적할 때 사용하는 옵션이다.
  • secretcookie-parser의 비밀키와 같은 역할을 한다.

express-session은 세션 관리 시 클라이언트에게 쿠키를 보내며, 이를 세션 쿠키라고 부른다. 보안성을 위해 세션의 서명이 필요한데, 이 때 secret 인자 값이 필요한 것이다. cookie-parser의 secret과 같게 설정해야 한다.

cookie는 쿠키 옵션에 대한 설정이다. maxAge, domain, path, expires, sameSite, httpOnly, secure 등 일반적인 옵션이 모두 제공된다.

Refernce
  • 조헌영, Node.js 교과서, 길벗, 6장 express
  • https://www.npmjs.com/package/morgan