API 서버에 HTTPS 적용하기(feat. Let's Encrypt)

sickbirdd·2023년 12월 6일
0

개요

현재 진행하고 있는 부스트캠프 그룹 프로젝트에서 API 서버의 루트 도메인으로 app을 사용하고 있습니다. 그런데 app 루트 도메인은 모든 연결에 HTTPS를 요구한다고 합니다. HTTPS를 사용하게 되면 보안이 강화되기 때문에 API 서버에 HTTPS를 적용해봤습니다!

HTTPS란?

HTTPS(이미지 출처)

  • HTTP over TLS, HTTP over SSL, HTTP Secure
  • HTTP의 보안이 강화된 버전
  • SSL이나 TLS 프로토콜을 활용하여 데이터를 암호화
  • 기본 TCP/IP 포트는 443
  • HTTPS를 사용하기 위해서는 인증 기관(CA)에서 인증서를 발급받아야 함.

Let's Encrypt란?

  • 무료로 X.509 인증서를 발급해주는 인증 기관(CA)
  • 자동으로 X.509 인증서를 발급 받아주는 ACME 프로토콜 활용
  • DV 인증서만 발급
  • 인증서의 유효 기간은 90일

인증서 발급 (with certbot)

우선 Let's Encrypt에서도 권장하고 있는 certbot을 사용해서 X.509 인증서를 발급받았습니다. 서버 환경은 Ubuntu 20.04 입니다. 또한 DV 인증서만 발급해주기 때문에 도메인을 하나 소유하고 있어야 합니다.

1. certbot 설치 및 커맨드 설정

sudo snap install --classic certbot 
sudo ln -s /snap/bin/certbot /usr/bin/certbot

2.1. 인증서 발급 (nginx)

sudo certbot --nginx

웹 서버로 Nginx를 사용하고 있다면 nginx 옵션을 적용해서 인증서를 발급받으면 됩니다.

2.2. 인증서 발급 (standalone)

sudo certbot certonly --standalone

웹 서버를 사용하지 않는다면, 인증서를 발급받기 위해서는 standalone 옵션을 사용해야 합니다. 또한 standalone 옵션은 80번 포트로 가상의 웹 서버를 띄워서 인증서를 발급 받습니다. 따라서 80번 포트를 사용하고 있는 서버가 있다면 종료해야 합니다.

예제 코드(출처)

// curl -k https://localhost:8000/
const https = require('node:https');
const fs = require('node:fs');

const options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'),
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('hello world\n');
}).listen(8000);

위와 같이 Node.js 환경에서 https 모듈을 활용해서 어플리케이션 서버에서도 직접 HTTPS를 적용할 수 있습니다.

Nginx, Standalone 방식 외에도 다양한 방식들을 지원하니 궁금하신 분들은 Certbot 홈페이지를 참고하시면 좋을 것 같습니다.

3. 약관 동의 및 도메인 입력

이제 약관들이 나오면 이에 동의하시고, 본인이 현재 소유 중인 도메인 이름을 입력하면 됩니다. 정상적으로 발급이 되었다면 /etc/letsencrypt/live/[도메인 이름] 경로에 cert.pem, chain.pem, fullchain.pem, privkey.pem 파일이 생성된 것을 확인할 수 있습니다.

  • nginx 옵션을 적용하셨다면 nginx 설정 파일에 자동으로 SSL 관련 설정이 되어있을 것입니다.
  • standalone 옵션을 적용하신 분들은 위의 예제 코드를 참고하셔서 적용하시면 됩니다.

0개의 댓글