🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

SSL TLS 보안 베스트 프랙티스 - 슬라이드 1/13
A

AI Generated

2025. 11. 3. · 22 Views

SSL TLS 보안 베스트 프랙티스

웹 애플리케이션의 보안을 강화하는 SSL/TLS 구현 방법을 학습합니다. 인증서 검증, 안전한 암호화 설정, 보안 헤더 등 실무에 필요한 핵심 내용을 다룹니다.


카테고리:JavaScript
언어:JavaScript
메인 태그:#JavaScript
서브 태그:
#SSL#TLS#HTTPS#Security

들어가며

이 글에서는 SSL TLS 보안 베스트 프랙티스에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. Node.js_HTTPS_서버_기본_설정
  2. 인증서_유효성_검증
  3. HSTS_보안_헤더_설정
  4. 안전한_쿠키_설정
  5. TLS_버전_및_약한_암호화_비활성화
  6. 인증서_핀_검증
  7. Content_Security_Policy_설정
  8. 인증서_만료_모니터링
  9. Perfect_Forward_Secrecy_설정
  10. OCSP_Stapling_활성화
  11. Axios_HTTPS_요청_보안_설정
  12. 자체_서명_인증서_개발_환경_설정

1. Node.js HTTPS 서버 기본 설정

개요

Node.js에서 HTTPS 서버를 안전하게 구성하는 방법입니다. TLS 1.2 이상을 사용하고 안전한 암호화 스위트를 설정합니다.

코드 예제

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

const options = {
  key: fs.readFileSync('private-key.pem'),
  cert: fs.readFileSync('certificate.pem'),
  minVersion: 'TLSv1.2',
  ciphers: 'ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5'
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('Secure connection established');
}).listen(443);

설명

개인키와 인증서를 로드하고, 최소 TLS 버전을 1.2로 설정하며, 안전한 암호화 알고리즘만 허용하여 보안을 강화합니다.


2. 인증서 유효성 검증

개요

클라이언트에서 서버 인증서를 검증하여 중간자 공격을 방지합니다. rejectUnauthorized 옵션으로 유효하지 않은 인증서를 거부합니다.

코드 예제

const https = require('https');

const options = {
  hostname: 'api.example.com',
  port: 443,
  path: '/data',
  method: 'GET',
  rejectUnauthorized: true,
  ca: fs.readFileSync('ca-certificate.pem')
};

https.request(options, (res) => {
  console.log('Verified secure connection');
}).end();

설명

rejectUnauthorized를 true로 설정하고 CA 인증서를 제공하여 서버 인증서가 신뢰할 수 있는 기관에서 발급되었는지 확인합니다.


3. HSTS 보안 헤더 설정

개요

HTTP Strict Transport Security 헤더를 설정하여 브라우저가 항상 HTTPS를 사용하도록 강제합니다.

코드 예제

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

app.use(helmet.hsts({
  maxAge: 31536000,
  includeSubDomains: true,
  preload: true
}));

app.get('/', (req, res) => {
  res.send('Secure site');
});

설명

HSTS 헤더를 1년(31536000초) 동안 유지하고 모든 서브도메인에 적용하여, HTTP로의 다운그레이드 공격을 방지합니다.


4. 안전한 쿠키 설정

개요

HTTPS 환경에서 쿠키의 보안 속성을 올바르게 설정하여 쿠키 탈취를 방지합니다.

코드 예제

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

app.use(session({
  secret: 'your-secret-key',
  cookie: {
    secure: true,
    httpOnly: true,
    sameSite: 'strict',
    maxAge: 3600000
  }
}));

설명

secure 속성으로 HTTPS에서만 쿠키 전송, httpOnly로 JavaScript 접근 차단, sameSite로 CSRF 공격을 방지합니다.


5. TLS 버전 및 약한 암호화 비활성화

개요

취약한 TLS 버전과 암호화 알고리즘을 비활성화하여 보안을 강화합니다.

코드 예제

const tls = require('tls');

const secureOptions =
  tls.SSL_OP_NO_SSLv2 |
  tls.SSL_OP_NO_SSLv3 |
  tls.SSL_OP_NO_TLSv1 |
  tls.SSL_OP_NO_TLSv1_1;

const server = https.createServer({
  secureOptions: secureOptions,
  honorCipherOrder: true
});

설명

SSL 2.0, 3.0, TLS 1.0, 1.1과 같은 취약한 프로토콜을 명시적으로 비활성화하고, 서버의 암호화 우선순위를 적용합니다.


6. 인증서 핀 검증

개요

특정 인증서나 공개키를 고정하여 인증서 체인 공격을 방지합니다.

코드 예제

const https = require('https');
const crypto = require('crypto');

const expectedFingerprint = 'AA:BB:CC:DD...';

const req = https.request(options, (res) => {
  const cert = res.socket.getPeerCertificate();
  const fingerprint = cert.fingerprint256;

  if (fingerprint !== expectedFingerprint) {
    throw new Error('Certificate pinning failed');
  }
});

설명

서버 인증서의 지문(fingerprint)을 미리 저장된 값과 비교하여, 예상된 인증서만 신뢰하도록 검증합니다.


7. Content Security Policy 설정

개요

CSP 헤더를 설정하여 HTTPS를 통한 리소스만 로드하고 혼합 콘텐츠를 방지합니다.

코드 예제

const helmet = require('helmet');

app.use(helmet.contentSecurityPolicy({
  directives: {
    defaultSrc: ["'self'", 'https:'],
    upgradeInsecureRequests: [],
    blockAllMixedContent: []
  }
}));

app.listen(443);

설명

모든 리소스를 HTTPS로만 로드하고, HTTP 요청은 자동으로 HTTPS로 업그레이드하며, 혼합 콘텐츠를 차단합니다.


8. 인증서 만료 모니터링

개요

인증서 만료일을 확인하여 갱신이 필요한 시점을 미리 감지합니다.

코드 예제

const tls = require('tls');

const socket = tls.connect(443, 'example.com', () => {
  const cert = socket.getPeerCertificate();
  const expiryDate = new Date(cert.valid_to);
  const daysLeft = (expiryDate - Date.now()) / (1000*60*60*24);

  console.log(`Certificate expires in ${daysLeft} days`);
  socket.end();
});

설명

서버 인증서의 만료일을 조회하여 남은 일수를 계산하고, 30일 이전에 알림을 설정할 수 있습니다.


9. Perfect Forward Secrecy 설정

개요

PFS를 지원하는 암호화 스위트를 우선 사용하여 과거 통신의 보안을 보장합니다.

코드 예제

const https = require('https');

const options = {
  key: privateKey,
  cert: certificate,
  ciphers: [
    'ECDHE-ECDSA-AES128-GCM-SHA256',
    'ECDHE-RSA-AES128-GCM-SHA256',
    'ECDHE-ECDSA-AES256-GCM-SHA384'
  ].join(':'),
  honorCipherOrder: true
};

설명

ECDHE 기반 암호화 스위트를 사용하여 각 세션마다 새로운 키를 생성하고, 개인키가 유출되어도 과거 통신을 복호화할 수 없게 합니다.


10. OCSP Stapling 활성화

개요

OCSP 스테이플링으로 인증서 폐기 상태를 효율적으로 확인합니다.

코드 예제

const https = require('https');
const ocsp = require('ocsp');

const options = {
  key: privateKey,
  cert: certificate,
  requestOCSP: true
};

const server = https.createServer(options);
server.on('OCSPRequest', (cert, issuer, cb) => {
  ocsp.getOCSPURI(cert, (err, uri) => {
    // OCSP 응답 처리
  });
});

설명

서버가 OCSP 응답을 미리 가져와서 클라이언트에 제공하여, 인증서 폐기 확인 시간을 단축하고 프라이버시를 향상시킵니다.


11. Axios HTTPS 요청 보안 설정

개요

Axios 클라이언트에서 HTTPS 요청 시 인증서 검증과 타임아웃을 설정합니다.

코드 예제

const axios = require('axios');
const https = require('https');

const httpsAgent = new https.Agent({
  rejectUnauthorized: true,
  minVersion: 'TLSv1.2'
});

axios.get('https://api.example.com/data', {
  httpsAgent,
  timeout: 5000
}).then(response => console.log(response.data));

설명

HTTPS 에이전트를 생성하여 인증서 검증을 활성화하고 최소 TLS 버전을 지정하며, 타임아웃으로 느린 연결을 방지합니다.


12. 자체 서명 인증서 개발 환경 설정

개요

개발 환경에서 자체 서명 인증서를 안전하게 사용하는 방법입니다. 프로덕션에서는 절대 사용하지 않습니다.

코드 예제

const https = require('https');

const isDevelopment = process.env.NODE_ENV === 'development';

const options = {
  hostname: 'localhost',
  port: 443,
  rejectUnauthorized: !isDevelopment
};

if (isDevelopment) {
  console.warn('⚠️ Certificate validation disabled');
}

https.request(options, callback).end();

설명

환경 변수로 개발/프로덕션을 구분하고, 개발 환경에서만 인증서 검증을 비활성화하며 경고 메시지를 출력합니다.


마치며

이번 글에서는 SSL TLS 보안 베스트 프랙티스에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#JavaScript #SSL #TLS #HTTPS #Security

#JavaScript#SSL#TLS#HTTPS#Security

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.