TIL | What is Middleware?

Wook·2021년 12월 26일
0

TIL | Backend

목록 보기
16/19

📲 Middleware

API는 요청이 들어왔을 때부터 응답으로 내보내기 까지의 전 과정을 처리합니다.
그 안에서 여러 함수들을 차례대로 거치게 되는데 그 함수 하나를 middleware라고 합니다.
미들웨어에서 다음 기능으로 통과시킬지 말지를 결정 할 수 있습니다.
이를 응용하면 미들웨어를 이용하여 여러 기능을 실행하기 전 수행해야할 기능을 만들 수 있습니다.


⚡️ Middleware의 용도

1) req.body 추가

postman 보통 사용시 raw - json으로 body 값을 보냅니다.
하지만 http의 특성상 모든 값들은 string으로 전송됩니다. 그래서 원래라면 string을 json 형태로 바꾸어서 req.body 안에 넣는 기능을 따로 구현했어야 했습니다. 이는 모든 요청에서 사용될 수 있기 때문에 express에서 미들웨어 형태로 제공하게 되었습니다.

2) 인증, 인가

인증 인가시, custom 미들웨어를 통해 인증과 인가 기능을 구현할 수 있습니다. 이는 인증과 인가가 필요한 API 각각 해당 기능을 구현할 필요 없이 인증을 통과하면 해당 API 기능을 실행할 수 있게 만들면 됩니다.

3) CORS

CORS는 브라우저의 보안 정책입니다. 해당 서버의 자원을 들고 올 때, 기본적으로 같은 origin에서 접근하여야 해당 API를 호출할 수 있습니다. 그래서 항시 브라우저한테 해당 서버는 모든 요청에 대해서 개방되어 있다라는 내용을 전달하여야합니다. 모든 요청에서 사용하므로 해당 부분은 미들웨어로 사용할 수 있습니다.


⚙️ 예시 코드

1) req.body

const express = require('exress');

const app = express();

// bad location
app.post('/bad', (req, res, next) => {
	console.log(req.body); // undefined
	res.json({ message: "bad" });
});

// express 안에 json 메소드를 이용하여 미들웨어를 구성합니다.
// 아래와 같이 app 초기 부분에 use를 쓰면 모든 요청에 대해서 미들웨어를 수행합니다.
app.use(express.json());

// good location
app.post('/', (req, res, next) => {
	console.log(req.body); // json형식으로 보낸 body 객체가 출력됩니다.
	res.json({ message: "root" });
});

app.post('/good', (req, res, next) => {
	console.log(req.body); // json형식으로 보낸 body 객체가 출력됩니다.
	res.json({ message: "root" });
});

app.listen(10010);

2) 인증, 인가

async function authMiddleware(req, res, next) {
	const token = req.headers.authorization;

	if ( !validToken(token) ) {
		res.status(400).json({"message": "invalid token"});
		return;
	}

	const userInfo = await getUser(token.id);

	if (userInfo) { // 로그인이 되었을 때
		req.userInfo = userInfo; // 다음으로 넘어가는 미들웨어 or 기능에서 req.isLogin 값을 사용할 수 있습니다.
		next(); // 다음 미들웨어 or 엔드 포인트로 넘어갑니다.
	}
	else { // 로그인에 실패하였을 때
		// 로그인에 실패했다면 다음 미들웨어로 넘어가지 않고 바로 응답을 보낼 수 있습니다.
		res.status(400).json({ message: "로그인할 수 없습니다." });
	}
}

3) CORS

const express = require('exress');
const cors = require('cors');

const app = express();

app.use(cors());
// cors 설정들이 적용됩니다.

app.listen(10010);
profile
지속적으로 성장하고 발전하는 진취적인 태도를 가진 개발자의 삶을 추구합니다.

0개의 댓글