본문 바로가기
BackEnd

[API] Middleware에 대해서

by SoriKim 2023. 11. 15.
반응형

1. Middleware 란? 

API는 요청이 들어올 때부터 응답으로 내보내기까지 전 과정을 처리합니다. 

그 안에서 여러 함수들을 차례대로 거치게 되는데 그 함수 하나를 middleware라고 합니다. 

middleware에서 다음 기능으로 통과시킬지 말지 결정할 수 있으며 이를 이용해 여러 기능 실행 전 수행해야 할 기능을 만들 수 있습니다. 

2. Middleware 용도

1️⃣ req.body 추가(app.use(express.json());)

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

 

🖌️ 예시 코드 

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());
// (err, req, res, next) => { req.body = ~; next(); }

// 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️⃣ 인증, 인가 

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

 

🖌️ 예시 코드 

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

	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 값을 사용할 수 있습니다.
		console.log(req.userInfo) // 36
		next(); // 다음 미들웨어 or 엔드 포인트로 넘어갑니다.
	}
	else { // 로그인에 실패하였을 때
		// 로그인에 실패했다면 다음 미들웨어로 넘어가지 않고 바로 응답을 보낼 수 있습니다.
		res.status(400).json({ message: "로그인할 수 없습니다." });
	}
}

 

 

3️⃣ CORS

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

 

🖌️ 예시 코드 

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

const app = express();

app.use(cors());
// cors 설정들이 적용됩니다.
// 세션때 자세히 다룰 예정입니다.

app.listen(10010);

 

 

위의 예시 이외에도 여러 용도로 사용이 가능합니다.

 

반응형

'BackEnd' 카테고리의 다른 글

Error Handing 적용하기  (0) 2023.11.19
Error Handing에 대해서  (0) 2023.11.19
[API] Path Parameter & Query Parameter에 대해서  (0) 2023.11.15
[API] RESTful API란?  (0) 2023.11.15
Git Rebase란? Git Merge와 Git Rebase의 차이점  (0) 2023.11.14

댓글