Node.js · 2026-03-09

Node.js HTTPS와 Let's Encrypt 자동 갱신 설정

Node.js 환경에서 HTTPS와 TLS를 단계별로 설정하고, Let's Encrypt로 인증서를 발급받아 Certbot과 자동 갱신을 연동하는 절차와 예제 코드

작성일 : 2026-03-09 ㆍ 작성자 : 관리자
post
목차

개요

웹 서비스는 HTTPS로 제공되어야 한다. HTTPS는 TLS 위에 동작하며, 브라우저와 서버 간 트래픽을 암호화한다. 이 글은 Node.js 환경에서 HTTPS와 TLS를 적용하고, Let's Encrypt 인증서를 발급받아 자동 갱신까지 연결하는 과정을 다룬다. 초보자도 이해할 수 있도록 단계와 코드 예제를 포함한다.

왜 HTTPS와 TLS인가

HTTPS는 데이터 무결성과 기밀성을 보장한다. 검색 엔진과 브라우저는 HTTPS를 선호한다. 또한 API와 인증에 필수적이다. 따라서 서버에 TLS를 올바르게 설정하고, 인증서를 주기적으로 갱신하는 체계를 마련해야 한다.

기본 개념 정리

TLS와 인증서

TLS는 전송 계층 보안 프로토콜이다. 인증서는 도메인 소유를 증명하며 공개키를 담고 있다. Let's Encrypt는 무료로 도메인 인증서를 발급해 주는 CA다.

자동 갱신의 필요성

Let's Encrypt 인증서는 기본 만료 기간이 짧다. 수동 갱신은 실수로 만료시 다운타임을 초래한다. 자동 갱신을 도입하면 인증서 갱신과 서비스 재적용을 안정적으로 수행할 수 있다.

사전 준비

  • 도메인과 DNS가 준비되어 있어야 한다.
  • 서버에 root 또는 sudo 권한이 필요하다.
  • Node.js와 npm 설치.
  • 기본적인 Express 앱 구조 이해.

Certbot으로 인증서 발급

가장 보편적인 방법은 Certbot을 이용하는 것이다. 웹서버가 nginx 또는 apache라면 플러그인을 사용해 자동으로 인증을 완료할 수 있다. 또는 standalone 방식으로 포트 80을 열어 인증을 진행한다.

sudo apt update
sudo apt install certbot
# nginx 사용 시
sudo certbot --nginx -d example.com -d www.example.com
# standalone 사용 예
sudo certbot certonly --standalone -d example.com

발급된 인증서는 보통 /etc/letsencrypt/live/example.com/ 아래에 위치한다. 파일명은 fullchain.pem(인증서 체인)과 privkey.pem(개인키)이다.

Express TLS 설정 예제

이 섹션에서는 Express 앱에 TLS를 적용하는 기본 예제를 보여준다. 파일 경로는 Certbot이 발급한 경로를 사용한다. 이 예제는 Node.js 자체 HTTPS 서버를 만든다.

const fs = require('fs')
const https = require('https')
const express = require('express')

const app = express()
app.get('/', (req, res) => {
  res.send('Hello HTTPS')
})

const options = {
  key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'),
  cert: fs.readFileSync('/etc/letsencrypt/live/example.com/fullchain.pem')
}

const server = https.createServer(options, app)
server.listen(443, () => {
  console.log('HTTPS server running on port 443')
})

위 코드는 기본 동작을 설명한다. 실제 배포 시 80 포트에서 443으로 리디렉션하는 로직을 추가하거나, 리버스 프록시(예: nginx)를 앞단에 두는 구성을 권장한다.

인증서 자동 갱신과 서비스 적용

Certbot은 자체적으로 갱신 cron 작업을 등록한다. 그러나 인증서가 갱신된 뒤 Node 프로세스에 새 인증서를 적용해야 한다. 방법은 두 가지다.

1) 프로세스 재시작

가장 단순한 방법은 certbot renew 후 서비스 재시작이다. deploy-hook을 이용하면 갱신 시 자동으로 명령을 실행할 수 있다.

sudo certbot renew --deploy-hook "systemctl restart my-node-app.service"

systemd 서비스가 있다면 위 방식으로 안전하게 재시작할 수 있다.

2) 무중단 인증서 재로딩 (핫리로드)

Node.js에서는 https 서버의 setSecureContext를 사용해 새로운 자격증명을 적용할 수 있다. 이 방법은 연결을 끊지 않고 인증서를 교체할 수 있다. 간단한 감시(watch) 스크립트 예시는 다음과 같다.

const fs = require('fs')
const https = require('https')
// 기존 server 생성 코드 생략

function reloadCredentials(server) {
  const key = fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem')
  const cert = fs.readFileSync('/etc/letsencrypt/live/example.com/fullchain.pem')
  server.setSecureContext({ key, cert })
  console.log('TLS credentials reloaded')
}

fs.watch('/etc/letsencrypt/live/example.com/', (eventType, filename) => {
  if (filename && (filename.includes('privkey.pem') || filename.includes('fullchain.pem'))) {
    try { reloadCredentials(server) } catch (e) { console.error(e) }
  }
})

이 방법은 프로덕션 환경에서 주의해서 테스트해야 한다. Node 버전과 API 호환성을 확인한다.

운영 고려사항

  • 로그와 모니터링을 설정해 갱신 실패를 빠르게 감지한다.
  • 리버스 프록시를 사용하는 경우 프록시에서 TLS를 종단하고 Node는 내부에서 HTTP로 동작할 수 있다.
  • 보안 권장사항: 개인키 파일 권한을 제한하고 백업을 안전하게 관리한다.

맺음말

이 글은 Node.js HTTPS 설정과 Let's Encrypt를 이용한 자동 갱신 연결 방법을 다루었다. 실제 배포 환경에서는 리버스 프록시 구성, 방화벽 정책, 모니터링을 함께 고려해야 한다. 예제 코드를 참고해 단계적으로 적용하면 안정적인 TLS 운영이 가능하다.

Node.js HTTPS 설정 Let’s Encrypt Express TLS 설정 예제 SSL 자동 갱신 Node.js Certbot 자동 갱신 Let's Encrypt 발급 HTTPS 보안 TLS 인증서 관리 Node.js 배포