Node.js · 2026-04-30

인증서 유효성 검사 및 HTTPS 리다이렉션 설정

Express와 Node.js 환경에서 SSL 인증서 유효성 검사부터 HTTPS 리다이렉션 강제화까지 단계별 설정과 코드 예제를 정리한 개발자 참고자료

작성일 : 2026-04-30 ㆍ 작성자 : 관리자
post
목차

소개

웹 서비스의 보안은 SSL/TLS 인증서와 HTTPS 강제화로 시작한다. 인증서가 올바르게 설치되고 만료되지 않았는지 확인하는 절차와, 사용자가 항상 HTTPS로 접속하도록 리다이렉션을 적용하는 방법을 정리한다. 설명은 처음 접하는 개발자도 이해할 수 있도록 단계와 예제를 중심으로 구성한다.

기본 개념

HTTPS는 HTTP 위에서 TLS 암호화를 적용한 프로토콜이다. 인증서는 도메인 소유권과 공개키를 연결하여 브라우저가 서버를 신뢰하도록 돕는다. 인증서가 만료되거나 잘못된 경우 경고가 발생하며 연결이 차단될 수 있다. 따라서 인증서 유효성 검사와 HTTPS 강제화는 서비스 가용성과 신뢰성에 필수적이다.

인증서 유효성 검사 개요

검사는 크게 두 가지로 나눌 수 있다. 첫째는 서버에 설치된 인증서의 만료일과 체인 상태를 확인하는 내부 검사. 둘째는 원격 호스트의 인증서를 검사하여 발급자, 유효기간, 도메인 매칭을 검증하는 외부 검사다. Node.js 환경에서는 tls 모듈을 활용한 원격 검사와 파일 기반 검사가 대표적이다.

원격 인증서 유효성 검사 예제

아래 코드는 Node.js에서 원격 호스트의 인증서를 받아오고 만료일을 확인하는 간단한 예제다. HTTPS 요청 대신 tls.connect를 사용하면 직접 인증서 정보를 얻을 수 있다.

const tls = require('tls');
const options = { host: 'example.com', port: 443, servername: 'example.com' };

const socket = tls.connect(options, () => {
  const cert = socket.getPeerCertificate();
  if (!cert || Object.keys(cert).length === 0) {
    console.error('인증서를 가져오지 못함');
    socket.end();
    return;
  }
  console.log('발급자:', cert.issuer);
  console.log('주체 CN:', cert.subject.CN);
  console.log('유효 시작:', cert.valid_from);
  console.log('유효 종료:', cert.valid_to);
  const expireDate = new Date(cert.valid_to);
  const remaining = Math.ceil((expireDate - new Date()) / (1000 * 60 * 60 * 24));
  console.log('남은 일수:', remaining);
  socket.end();
});

이 코드는 원격 인증서의 만료일을 확인해 사전 갱신 알림을 구현하는 데 유용하다. 운영 환경에서는 자동화된 검사 스케줄을 등록해 만료 전 알림을 받도록 한다.

Express에서 HTTPS 강제화

Express 앱에서는 요청이 HTTP로 들어오는 경우 HTTPS로 리다이렉트하는 미들웨어를 추가한다. 단, 프록시(예: Nginx, ELB) 뒤에서 동작할 때는 X-Forwarded-Proto 헤더를 신뢰하도록 설정해야 한다.

프록시 환경용 리다이렉트 미들웨어

다음 예제는 프록시를 통해 전달된 요청을 감안해서 HTTPS로 강제 리다이렉트하는 미들웨어다. 이 코드에서 Express 앱은 behind proxy 모드로 설정되어야 한다.

const express = require('express');
const app = express();

// 프록시를 사용하는 경우 필요
app.set('trust proxy', true);

// HTTPS 리다이렉트 미들웨어
function forceHttps(req, res, next) {
  const proto = req.headers['x-forwarded-proto'] || req.protocol;
  if (proto === 'https') return next();
  const host = req.headers.host;
  res.redirect(301, 'https://' + host + req.originalUrl);
}

app.use(forceHttps);

app.get('/', (req, res) => res.send('Secure connection'));

app.listen(80, () => console.log('HTTP 서버 실행'));

이 미들웨어는 HTTP 요청을 영구 리다이렉트(301)로 HTTPS로 전환한다. 리다이렉트 코드를 302로 바꿀 수도 있지만, SEO와 캐싱을 고려하면 301을 권장한다.

HTTPS 서버 직접 구성

Express를 https.createServer와 함께 직접 실행하면 프록시가 없는 환경에서 HTTPS를 직접 처리할 수 있다. 인증서 파일(.key, .crt 또는 .pem)을 옵션으로 전달한다.

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

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

const options = {
  key: fs.readFileSync('/path/to/privkey.pem'),
  cert: fs.readFileSync('/path/to/fullchain.pem')
};

https.createServer(options, app).listen(443, () => console.log('HTTPS 서버 실행'));

운영 환경에서는 포트 80에서 443으로 리다이렉트만 처리하고 실제 SSL 종단은 로드밸런서나 리버스 프록시에 맡기는 경우가 많다.

테스트 방법과 체크리스트

  • 브라우저에서 도메인 접속 시 보안 정보 확인
  • openssl s_client -connect 도메인:443로 체인과 만료일 검사
  • 자동 갱신 도구(certbot 등) 설정 확인
  • 프록시 사용 시 X-Forwarded-Proto가 정상 전달되는지 확인
  • 리다이렉트가 무한 루프를 일으키지 않는지 검증

배포 시 주의점

인증서 갱신 자동화가 중요하다. 갱신 후에는 서버 또는 프록시의 인증서 재로딩이 필요하다. 또한 HSTS를 적용하면 HTTPS만 허용되지만 초기 적용 시 주의가 필요하다. 적용 전 테스트 도메인에서 충분히 검증한다.

결론

Express HTTPS 리다이렉트 설정과 SSL 인증서 검증 Node.js 환경에서의 구현은 비교적 간단하다. 핵심은 인증서 유효성 검사와 리다이렉션 로직을 운영 절차에 맞춰 자동화하는 것이다. 위 예제와 체크리스트를 통해 HTTPS 강제화 Node 구현과 인증서 관리를 체계적으로 적용할 수 있다.

Express HTTPS 리다이렉트 설정 SSL 인증서 검증 Node.js HTTPS 강제화 Node Node.js HTTPS 설정 Express 보안 TLS 인증서 확인 HTTP to HTTPS 리다이렉션 인증서 갱신 자동화