[javascript] Express.js에서의 HMAC 인증 방법

이 블로그 포스트에서는 Express.js 서버에서 HMAC(Hierarchical Message Authentication Code) 인증 방법을 구현하는 방법에 대해 알아보겠습니다. HMAC은 메시지 무결성과 사용자의 신원 인증을 위해 사용되는 암호화 기술입니다.

HMAC이란?

HMAC은 해시 함수와 공유 키를 사용하여 메시지에 서명을 생성하는 메시지 인증 코드입니다. HMAC을 사용하면 메시지가 변경되었는지 확인하고, 메시지를 보낸 사용자의 신원을 인증할 수 있습니다.

Express.js에서 HMAC 인증 구현하기

  1. 먼저, crypto 모듈을 사용하여 HMAC 서명을 생성할 수 있습니다. 이 모듈은 Node.js에 내장되어 있으므로 별도로 설치할 필요가 없습니다.
const crypto = require('crypto');
  1. Express.js 앱의 미들웨어로 HMAC 검증 미들웨어를 작성할 수 있습니다. 이 미들웨어는 요청 헤더에서 HMAC 서명을 추출하고, 요청 본문과 공유 키를 사용하여 서명을 검증합니다.
app.use((req, res, next) => {
  const { hmac } = req.headers; // 요청 헤더에서 HMAC 추출
  const secretKey = 'YOUR_SECRET_KEY'; // 공유 키

  // HMAC 검증
  const payload = JSON.stringify(req.body); // 요청 본문을 문자열로 변환
  const hash = crypto.createHmac('sha256', secretKey).update(payload).digest('hex');
  
  if (hash === hmac) {
    next(); // HMAC이 일치하는 경우, 다음 미들웨어로 진행
  } else {
    res.status(401).json({ error: 'Invalid HMAC' }); // HMAC이 일치하지 않는 경우, 인증 오류 응답
  }
});
  1. 이제 Express.js 앱의 경로 핸들러에서 HMAC 검증 미들웨어를 사용할 수 있습니다. 이렇게 하면 해당 경로로 요청이 전달되기 전에 HMAC이 검증됩니다.
app.post('/api/secure', (req, res) => {
  // HMAC 검증 미들웨어를 통해 이미 HMAC이 검증되었으므로, 안전하게 요청 처리
  res.json({ message: 'Secure API endpoint' });
});
  1. HMAC 인증이 구현됐으므로, 클라이언트는 요청 헤더에 HMAC 서명을 포함시켜야 합니다.
const axios = require('axios');
const crypto = require('crypto');

const secretKey = 'YOUR_SECRET_KEY'; // 공유 키
const payload = { message: 'Hello, HMAC!' }; // 요청 본문

const hmac = crypto.createHmac('sha256', secretKey).update(JSON.stringify(payload)).digest('hex');

axios.post('http://localhost:3000/api/secure', payload, {
  headers: {
    hmac, // HMAC 서명을 요청 헤더에 포함
  },
})
  .then((response) => {
    console.log(response.data); // 응답 데이터 출력
  })
  .catch((error) => {
    console.error(error);
  });

결론

이제 Express.js 서버에서 HMAC 인증 방법을 구현하는 방법에 대해 알아보았습니다. HMAC을 사용하면 메시지 무결성과 사용자 신원 인증을 보장할 수 있으며, Express.js와 Node.js의 내장 모듈인 crypto를 사용하여 간단히 구현할 수 있습니다.

참고 자료