express, middleware
미들웨어
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 }));
...
cookie-parser
동봉된 쿠키를 해석한다. 사용법은 아래와 같다.
...
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
는 세션에 저장할 내역이 없더라도 세션을 저장할지에 대한 설정이다. 둘 다 보통 방문자를 추적할 때 사용하는 옵션이다.secret
은cookie-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