Express - 자주 사용하는 미들웨어

Lia·2021년 6월 24일
0

Node.js

목록 보기
2/5
Contents
1. morgan
2. static
3. body-parser
4. cookie-parser
5. express-session
6. multer
7. 에러처리 미들웨어

# 01 - morgan

morgan은 HTTP request 정보들의 로그를 보여주는 미들웨어 입니다.

npm i morgan --save
npm 으로 morgan을 설치할 수 있습니다.

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

위와 같은 형태로 morgan 미들웨어를 사용합니다.

morgan() 의 인수로 dev 외에 combined, common, short, tiny 등을 전달해 줄 수 있습니다.
각각의 인수들에 대한 설명은 morgan npm 홈페이지 에서 확인할 수 있습니다.


# 02 - static

static 미들웨어는 정적인 파일들을 제공하는 라우터 역할을 합니다.
Express.js에서 기본적으로 제공되기 때문에 Express가 설치되어 있으면 따로 설치할 필요가 없습니다.

app.use('요청 경로', express.static('실제 경로'));

이와 같은 형태로 사용하게 됩니다.

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

위와 같이 미들웨어를 사용하게 되면
public/stylesheets/style.csslocalhost:3000/stylesheets/style.css 로 접근할 수 있습니다.

static 미들웨어는 요청 경로에 해당하는 파일이 없으면 내부적으로 next() 를 호출합니다. 하지만 파일이 있다면 응답으로 파일을 보내고 next() 를 호출하지 않기 때문에 다음 미들웨어는 실행되지 않습니다.


# 03 - body-parser

body-parser 는 요청 본문에 있는 데이터를 해석해서 req.body 객체로 만들어주는 미들웨어 입니다. 하지만 이미지, 동영상, 파일 등의 멀티파트 데이터는 처리하지 못합니다.

npm i body-parser --save
npm으로 body-parser 를 설치할 수 있습니다.

// parse application/json
app.use(express.json());

// parse application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }));

body-parser 미들웨어는 이와 같이 사용할 수 있습니다.

body-parserExpress 4.16.0 버전부터 body-parser 미들웨어의 일부 기능이
Express 에 내장되어 져 있습니다. 하지만 설치하여 사용해야 할 경우도 있습니다.

body-parserJSON, URL-encoded 형식 외에도 Raw, Text 형식의 데이터를 해석할 수 있습니다.

const bodyParser = require('body-parser');

app.use(bodyParser.raw());
app.use(bodyParser.text());

// parse some custom thing into a Buffer
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))

// parse an HTML body into a string
app.use(bodyParser.text({ type: 'text/html' }))

bodyParser.raw() 는 option값을 지정해 주지 않으면 기본 type은 application/octet-stream 입니다.
bodyParser.text() 는 option값을 지정해 주지 않으면 기본 type은 text/plain 입니다.


# 04 - cookie-parser

cookie-parser 는 요청에 포함된 쿠키를 해석하여 req.cookies 객체로 만듭니다.

npm i cookie-parser --save
npm으로 cookie-parser 를 설치할 수 있습니다.

cookie-parser 미들웨어는 다음과 같이 사용할 수 있습니다.

const cookieParser = require('cookie-parser');
app.use(cookieParser(SECRET_KEY));

해석된 쿠키들은 req.cookies 객체로 들어갑니다.

cookieParser() 의 첫 번째 인수로 비밀 키를 전달해 줄 수 있습니다.
비밀 키를 이용해 만든 서명을 쿠기 값 뒤에 붙입니다.
이렇게 서명된 쿠키는 다시 비밀키를 이용해 자신의 서버가 만든 쿠키임을 검증할 수 있습니다.

서명된 쿠키는 req.signedCookies 객체에 들어있습니다.

cookie-parser 는 cookie를 생성할 때에 사용하지는 않습니다. 쿠키를 생성 또는 제거하기 위해서 res.cookie() 또는 res.clearCookie() 를 사용합니다.

res.cookie() 의 기본 형태는 다음과 같습니다.
res.cookie(name, value [, options])


options의 종류는 다음과 같습니다.

res.cookie() 는 다음과 같이 사용할 수 있습니다.

res.cookie('id', 'Lia@1234.com', {
	expires: new Date(Date.now() + 100000),
    	httpOnly: true,
    	secure: true,
    	signed: true
});

httpOnly 옵션을 적용하게 되면 브라우저에서 cookie 에 대한 접근을 못하게 합니다.
또한 signed 옵션을 적용하게 되면 쿠키 뒤에 서명이 붙습니다.
이러한 설정들은 보안을 위해서 적용하면 좋습니다.


res.clearCookie() 는 다음과 같이 사용할 수 있습니다.

res.clearCookie('id', 'Lia@1234.com', { httpOnly: true, secure: ture, signed: true });

쿠키를 삭제하기 위해서는 name, value, options 의 값이 모두 일치해야 합니다.

공식문서에 따르면 res.clearCookie() 호출 시 expires, maxAge 옵션은 제외해도 상관 없다고 기술되어 있습니다.


# 05 - express-session

express-session 은 세션 관리용 미들웨어 입니다.
req.session 객체 안에서 유지됩니다.

npm i express-session --save
npm으로 express-session 을 설치할 수 있습니다.

express-session() 의 기본 형태는 다음과 같습니다.
express-session(options)

express-session 의 options 값은 다음과 같습니다.

cookie
genid
name
proxy
resave
rolling
saveUninitialized
secret
store
unset

resave 옵션은 요청이 올 때 세션에 수정 사항이 생기지 않더라도 세션을 다시 저장할지 설정합니다.

saveUninitialized 옵션은 세션에 저장할 데이터가 없더라도 처음부터 세션을 생성할지 설정합니다.

name 옵션은 세션 쿠키의 이름을 설정합니다. 기본값은 connect.id 입니다.

cookie 옵션은 세션 쿠키에 대한 설정 입니다. 일반적인 쿠키 옵션들을 모두 설정 가능합니다.

store 옵션을 사용하면 세션을 데이터베이스에 저장할 수 있습니다.
기본값은 메모리에 세션을 저장합니다.


express-session 미들웨어는 다음과 같이 사용할 수 있습니다.

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

express-session 1.5 이전 버전은 내부적으로 cookie-parser 를 사용하고 있어서 cookie-parser 미들웨어 보다 뒤에 위치해야 한다.

express-session 은 세션 관리 시 클라이언트에 세션 쿠키를 보냅니다.


만들어진 세션은 req.session 객체에 값을 대입하거나 삭제해서 변경할 수 있습니다.

req.session.name = 'lia';		// 세션 등록
req.sessionID;				// 세션 아이디 확인
req.session.destroy();			// 세션 모두 제거

# 06 - multer

multer 는 이미지, 동영상 등을 비롯한 여러 종류의 파일들을 멀티파트 형식으로
업로드 할 때 사용하는 미들웨어 입니다.

npm i multer --save
npm으로 multer 를 설치할 수 있습니다.

multer 미들웨어의 기본적인 설정은 다음과 같습니다.

const multer = require('multer');

const upload = multer({
	storage: multer.diskStorage({
    		destination(req, file, done) {
            		done(null, 'uploads/');
            	},
                filename(req, file, done) {
                	const ext = path.extname(file.originalname);
                    	done(null, path.basename(file.originalname, ext) + Date.now() + ext);
                },
    	}),
    	limits: { fileSize: 5 * 1024 * 1024 },		// 5MB
});

multer 함수의 인수로 설정을 전달 합니다.
설정 값들은 다음과 같습니다.

storage 속성에는 destinationfilename을 넣었습니다.
두 개의 함수 모두 차례대로 req, file, done 매개변수를 받게 됩니다.

req 매개변수에는 요청에 대한 정보가 들어 있습니다.
file 매개변수에는 업로드한 파일의 정보가 들어 있습니다. 파일에 대한 정보는 다음과 같습니다.

done 매개변수는 함수 입니다. 이 함수의 첫 번째 인수에는 에러, 두 번째 인수에는 실제 경로나
파일 이름을 넣어줍니다. reqfile의 데이터를 가공해서 done으로 넘겨주는 형식 입니다.

limits 속성은 업로드에 대한 제한 사항을 지정할 수 있습니다.
limits 속성에 대한 옵션들은 다음과 같습니다.


설정을 끝마친 upload 변수에는 여러 종류의 미들웨어가 들어가게 됩니다.

파일을 하나만 업로드 하는 경우 single 미들웨어를 사용합니다.

app.post('/upload', upload.single('INPUT_TAG_NAME'), (req, res) => {
	...
    	...
        ...
});

업로드 성공 시 결과는 req.file (객체) 에 있습니다.


파일을 여러개 업로드 하는 경우 HTML input 태그에 multiple을 사용해 주고
미들웨어는 array 를 사용합니다.

app.post('/upload', upload.array('INPUT_TAG_NAME'), (req, res) => {
	...
    	...
        ...
});

업로드 성공 시 결과는 req.files (배열) 에 있습니다.


파일을 여러개 업로드 하고 input 태그나 form 데이터의 키가 다른 경우에는
fileds 미들웨어를 사용합니다.

app.post('/upload',
	upload.fileds([{ name: 'INPUT_TAG_NAME' }, { name: 'INPUT_TAG_NAME' }]),
    	(req, res) => {
        	...
            	...
                ...
        }
);

업로드 성공 시 결과는 req.files.INPUT_TAG_NAME 에 각각 들어있습니다.


# 07 - 에러처리 미들웨어

에러처리 미들웨어는 다른 미들웨어와는 다르게 인수를 err 를 포함하여
4가지 인수를 갖는다는 것이 다릅니다.

공식문서에 따르면 에러처리 미들웨어는 다른 미들웨어를 모두 정의한 다음 마지막으로 정의를 해야 한다고 기술되어 있습니다.

에러처리 미들웨어는 서버에 에러가 발생하거나 혹은 next(err) 를 호출할 경우에 실행됩니다.
에러처리 미들웨어는 다음 형태와 같습니다.

app.use((err, req, res, next) => {
	...
    	...
        ...
});



본 블로그는 조현영(zerocho)님의 저서 'Node.js 교과서 개정2판'을 참고하여 정리한 글입니다. 이점 참고 부탁드립니다.

profile
하고싶은게 많아요

0개의 댓글