미들웨어란?
미들웨어는 request를 받아 작업을 하는 과정 중간에서 어떤 로직을 수행하게 해주는 존재이다.
미들웨어는 express와는 별개로 존재하며 express 내장 미들웨어를 사용해도 되고,
다른사람들이 만들어놓은 npm 패키지를 다운받아 사용해도 된다.
라우터란?
라우터는 일종의 미들웨어라고 볼 수 있는데,
클라이언트로부터 uri이 담긴 req가 들어왔을 때 이에 맞는 화면을 res로 답해주는 역할을 하게 된다.
Express에서 미들웨어 사용하기
생성해놓은 express 객체의 use 메소드를 사용하면 된다.
const express = require('express');
const app = express();
app.get('/', function (req, res, next) {
console.log('First MiddleWare');
next();
});
const myMiddleWare = function (req, res, next) {
console.log('Second MiddleWare');
next();
};
app.use(myMiddleWare);
app.listen(8080);
next() 메소드를 실행시켜주어야 다음 미들웨어로 넘어가기 때문에 꼭 써주어야 한다.
미들웨어는 위에서 아래로 실행되기 때문에 순서가 중요하다.
Express 기본 내장 미들웨어
- express.static은 res에 담아 보낼 때 따로 처리를 해주지 않고 그대로 보내도 되는 파일들을 처리해주는 미들웨어이다.
app.use(expree.static(__dirname + '/public'));
public이라는 폴더를 static 폴더로 지정하게 되면, 안에 있는 정적 파일들은
클라이언트로 바로 보내지는것이 아닌 static 미들웨어를 한번 거쳤다가 보내지며,
정적 파일들을 참조하는 곳에서는 절대경로가 아닌 static 폴더로 접근하므로 보안에도 도움이 된다.
- express.json은 req의 body가 json 형태를 띌 때 이를 parse해주는 역할을 하는 미들웨어이다.
app.use(express.json());
외부 미들웨어
npm으로 install 해야하는 미들웨어
쿠키와 세션
웹 개발을 하다보면 쿠키와 세션에 대해서 얘기를 듣는데, 얘네들은 뭘까?
쿠키
Client로 부터 req를 받을 때, 서버에서는 사용자에 대한 정보를 IP주소나 브라우저 정보 정도만 알 수 있다.
이러한 정보들로만은 사용자를 식별하기에는 어렵기 때문에
res를 쏴줄 때 key-value로 이루어진 쿠키를 보내어 해당 res를 받는 Client가 누구인지 서버에서 판별할 수 있게 해준다.
const express = require('express');
const app = express();
app.get('/', function (req, res) {
res.writeHead(200, { 'Set-cookie': 'name=John Doe' });
res.end();
});
app.listen(8080);
이렇게 한 번 설정되고 난 후에는, 브라우저에서 서버로 다시 req를 보낼때 자동으로 쿠키가 담기게 된다.
위의 코드로 설정한 쿠키는 브라우저가 꺼질때까지 유효한데, 쿠키의 expire를 따로 지정해 줄 수 있다.
아니 그러면 쿠키를 내 맘대로 바꿔서 보낼 수 있지 않은가??
실제로 F12를 눌러 쿠키값을 내 맘대로 바꿀 수 있다.
이러한 쿠키 변조를 방지해주는것이 바로 세션이다.
세션
세션에 대한 정보는 서버에만 저장되어있고, Client는 자기 자신의 암호화된 세션키밖에 알지 못한다.
따라서 유효한 변조는 불가능하다.
쿠키와 세션의 관계에 대해 알아보았다.
cookie-parser
Client가 보내는 쿠키는 string 문자열인데, req.headers.cookie를 통해 접근할 수 있다.
이를 자바스크립트에서 parsing하기 위해서는 별도의 과정이 필요하다.
cookie-parse 미들웨어는 이 번거로운 작업을 알아서 해준다
cookie-parse를 사용하면 express의 req 객체에 cookies 속성이 부여되므로,
res.cookies.쿠키명 을 통해 쿠키 값에 접근 할 수 있게 된다.
express-session
세션도 마찬가지로 원래는 cookies.session으로 접근할 수 있었지만,
미들웨어를 통해 req.session 으로 세션 값에 접근 할 수 있게 된다.
종합
const express = require('express');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const app = express();
app.set('port', process.env.PORT || 8080);
app.use(express.static(__dirname + '/public'));
app.use(cookieParser('secret@1234')); // 안전하게 쿠키를 전송하기 위한 secret 값
app.use(
session({ //session 객체 생성
secret: 'secret@1234',
resave: false,
saveUninitialized: true,
cookie: {
httpOnly: true,
},
})
);
app.use(express.json());
app.get('/', (req, res) => {
if (req.session.name) { // session의 name이 유효한지 검사
const output = `
<h2>로그인한 사용자</h2><br>
<p>${req.session.name}님 안녕하세요.</p><br>`;
res.send(output);
} else {
const output = `
<h2>로그인하지 않은 사용자</h2><br>
<p>로그인 해주세요</p><br>`;
res.send(output);
}
});
// /와 /login으로 라우팅
app.get('/login', (req, res) => { // 실제로는 post여야 한다.
console.log(req.session);
req.session.name = 'John Doe';
res.end('Login Ok');
});
app.get('/logout', (req, res) => {
res.clearCookie('connect.sid'); // 세션 쿠키 삭제, 세션 쿠키의 default name이 connect.sid이다.
res.end('Logout Ok');
});
app.listen(8080);
express-session을 사용하여 세션 정보를 따로 저장하지 않고 req.session을 통해 세션 정보에 접근 할 수 있다.
대부분의 미들웨어는 next 메소드가 내장되어있어 따로 호출을 안해주어도 다음 미들웨어로 제어권을 넘긴다.
참고
https://book.naver.com/bookdb/book_detail.nhn?bid=21139328
'etc > Node.js' 카테고리의 다른 글
[Node.js] Node.js 첫걸음 (0) | 2022.03.08 |
---|