[Express Node] api 서버에 api key 도입하기.
1. api key
개발한 api 서버에 보안성 향상을 위해 api key를 적용하라는 요구사항이 생겼다.
간단한 앱이고 사용자가 적기 때문에 간단한 api key 발급 절차와 검증체크만 구현하여 진행해보고자 한다.
상용 서비스에선 로그인 기능까지 겹쳐 Bareer Token
을 사용하기도 하지만, 여기서는 로그인절차도 따로 없고, api인증만 필요하므로 간단하게 X-API-Key
를 사용하기로 했다.
2. api서버에 적용
server.js 에 다음 내용을 추가한다.
const checkApiKey = (req, res, next) => {
const providedApiKey = req.header('X-API-Key')
if (!providedApiKey || providedApiKey !== API_KEY) {
return res.status(401).json({ error: 'Invalid API key' })
}
next()
}
app.use(checkApiKey)
사전에 제공된 api key를 체크하는 함수를 작성하여 비교한 후 next()를 통해 인증 후 다음 절차로 넘어갈수 있도록 한다.
app.use(checkApiKey)를 선언하여 미들웨어 적용하는 과정을 잊지말고, 적절한 위치에 넣는것이 중요하다.
3. .env 를 활용한 적용 (코드수정 없이)
api-key를 외부에서 관리하도록 하게끔 해서 코드 수정의 필요를 제거한다.
별거 아닌듯 하지만 추후에 Docker로 올려서 관리할 예정이기 때문에 환경변수로 관리하도록 하자.
우선, express 에서 환경변수를 사용하기 위해 dotenv
라는 라이브러리를 사용한다.
npm install dotenv
또는
yarn add dotenv
프로젝트의 root 경로에 .env 파일을 만든다.
# .env 예시
API_KEY=test
server.js 에 해당 값을 읽어들이도록 변수에 저장한다.
// dotenv를 활용하여 설정파일을 읽을때 필요
require('dotenv').config()
// .env에서 작성한 API_KEY를 읽어와서 변수에 저장
const API_KEY = process.env.API_KEY
4. api key 발급
지정된 api key를 사용할 수 있도록 api key를 발급을 구현한다.
app.use(express.json())
app.get('/apikey', (req, res) => {
res.send(API_KEY)
})
GET 방식으로 /apikey 로 요청이 오면 API_KEY를 반환하도록 한다.
5. 결과
잘못된 apikey나 없이 보낼경우, 401을 응답받는것을 볼 수 있다.
요청시 Header 부분의 x-api-key 에 담아서 request 하도록 구현해야한다.
마치며
와. 진짜 간단하게 api에 apikey 인증로직을 추가하여 보안성을 향상시켰다.
로그인이 필요없는 간단한 서비스라면 이정도로도 apikey를 모르는 사용자들의 접근을 막을 수 있다.
'IT' 카테고리의 다른 글
[Grafana Express] Grafana의 Express(node.js)를 위한 Metrics (0) | 2024.01.29 |
---|---|
[Docker] Grafana, Prometheus를 활용한 API서버(Express) 모니터링 (1) | 2024.01.29 |
[Mac] 터미널에서 Putty처럼 사용하기 (0) | 2023.09.27 |
[Mac] Homebrew 설치 (0) | 2023.09.27 |