[강의 정리] Node.js에서 API 서버 만들기 by 개발자의 품격
* Reference Video: https://www.youtube.com/watch?v=8XpVJaEWesM
node.js 기반으로 API 서버 만들기, REST API으로 구현
express을 기반으로 웹 서버 구축
*express는 node.js 기반으로 웹 서버를 구축해주는 하나의 모듈이다.
ㄴ 참고: https://naraewool.tistory.com/314
특정 url path로 서버로 호출했을 때 시스템에 있는 데이터를 사용자에게 전달해주는 프로그램을 짜보자.
터미널에서 node api.js 입력하면 서버 연결됨!
다음과 같이 get()을 정의하고 수정한 값 반영되도록 서버 다시 띄우기!
const express = require('express');
const app = express();
const server = app.listen(3001, () =>{
console.log('Start server : localhost:3001');
}); // 포트가 3001인 서버 띄우기
app.get('/api/user/:type', async (req,res)=>{ // url path, async (요청, 응답)
res.send('connect.'); // 성공 시 보여지는 응답
})
포스트맨을 이용하여 localhost:3001/api/user/1로 GET 요청을 보내면, 지정한 메시지 나옴(connect.)
:type은 무엇이냐? :type 에 들어오는 값을 파라미터로 받을 수 있음
다시 코드를 이렇게 수정해보서 postman을 이용하여 요청을 보내보면,
app.get('/api/user/:type', async (req, res)=>{
// res.send('connect.');
let {type} = req.params;
console.log(type);
res.send('ok');
})
성공 시 'ok'를 보여주고, 요청 시에 :type 위치에 지정한 파라미터(1) 값이 콘솔 로그에 출력된다.
배운 걸 이용하여 다음과 같은 코드를 짜볼 수 있다.
const express = require('express');
const app = express();
const server = app.listen(3001, () =>{
console.log('Start server : localhost:3001');
});
app.get('/api/user/:type', async (req, res)=>{
// res.send('connect.');
let {type} = req.params;
if (type=='seoul'){
let data = [{
name: "홍길동",
city: "seoul"
},
{
name: "김철수",
city: "seoul"
},
];
res.send(data);
} else if (type == 'jeju'){
let data = [{
name: "박지성",
city: "jeju"
},
{
name: "손흥민",
city: "jeju"
},
];
res.send(data);
} else{
res.send(data);
}
})
path만 입력하면 다 호출할 수 있으므로 보안을 위해 API 키가 있는 클라이언트만 요청을 허용하도록 해보자.
https://www.npmjs.com/package/uuid-apikey 을 참고하여 설치(npm install uuid-apikey)
생성하는 메서드 호출 시, key &uuid가 만들어짐. 웹서비스할 때는 이 값들을 DB에 저장하면됨
공부할때는 코드 내에 변수로 관리하기로
파라미터에서 apikey 받아올 수 있도록 변수로 선언. 올바른 apikey를 통해 path에 접근한 호출만 허용하도록 url도 수정.
isAPIKey() or check() 이용하여 API Key 검증(문서에 각 method 설명과 샘플 있음)
const express = require('express');
const app = express();
const uuidAPIKey = require('uuid-apikey');
const server = app.listen(3001, () =>{
console.log('Start server : localhost:3001');
});
//console.log(uuidAPIKey.create()); // API 키 생성하는 메서드
//발급받은 키와 uuid. 실제 서비스엔 별도의 DB로 관리
const key = {
apiKey: '08R9NZG-60R40KA-Q1K2421-AKYC7E2',
uuid: '02309afe-3030-404d-b866-220854fcc3b8'
};
app.get('/api/user/:apikey/:type', async (req, res)=>{
let {
apikey,
type} = req.params;
//API키가 아니거나 할당된 키가 아닐 경우 에러 메시지 띄우기
if(!uuidAPIKey.isAPIKey(apikey) || !uuidAPIKey.check(apikey, key.uuid)){
req.send('apikey is not valid.');
} else { //그렇지 않으면, 즉 검증된 API 키라면 다음 데이터 반환
if (type=='seoul'){
let data = [{
name: "홍길동",
city: "seoul"
},
{
name: "김철수",
city: "seoul"
},
];
res.send(data);
} else if (type == 'jeju'){
let data = [{
name: "박지성",
city: "jeju"
},
{
name: "손흥민",
city: "jeju"
},
];
res.send(data);
} else{
res.send(data);
};
};
});