NGINX를 사용한 SSL/TLS 오프로딩
NGINX 및 NGINX Plus는 대부분의 SSL/TLS 요구 사항을 처리할 수 있는 다양한 기능을 제공합니다. OpenSSL과 표준 프로세서 칩의 성능을 사용하여 비용 효율적인 SSL/TLS 성능을 제공합니다. 표준 프로세서 칩의 성능이 계속해서 증가하고 칩 공급업체가 암호화 가속 지원을 추가함에 따라 특수 SSL/TLS 칩보다 표준 프로세서 칩을 사용하는 비용 이점도 계속해서 확대되고 있습니다.

SSL/TLS를 사용하는 NGINX 및 NGINX Plus에는 세 가지 주요 사용 사례가 있습니다.
목차
1. SSL/TLS 오프로딩
2. Origin 서버에 대한 SSL/TLS 암호화
3. End-to-End 암호화
4. 클라이언트 인증서
5. 추가 보안 기능
6. 예시
1. SSL/TLS 오프로딩
NGINX를 프록시로 사용하면 백엔드 서버에서 SSL 암호 해독 처리를 오프로드할 수 있습니다. 프록시에서 암호 해독을 수행하면 여러 가지 이점이 있습니다.
- 향상된 성능 – SSL 암호 해독을 수행할 때 가장 큰 성능 저하가 초기 핸드셰이크(Handshake)입니다. 성능 향상을 위해 암호 해독을 수행하는 서버는 SSL Session ID를 캐시하고 TLS Session 티켓을 관리합니다. 이 작업이 프록시에서 수행되면 동일한 클라이언트의 모든 요청이 캐시된 값을 사용할 수 있습니다. 백엔드 서버에서 수행되는 경우 클라이언트의 요청이 다른 서버로 이동할 때마다 클라이언트는 다시 인증해야 합니다. TLS 티켓을 사용하면 이 문제를 완화하는 데 도움이 될 수 있지만 모든 클라이언트에서 지원되는 것은 아니며 구성 및 관리가 어려울 수 있습니다.
- 백엔드 서버의 활용도 향상 – SSL/TLS 처리는 CPU를 많이 사용하며 Key 크기가 증가함에 따라 점점 더 집약적이 되고 있습니다. 백엔드 서버에서 이 작업을 제거하면 가장 효율적인 콘텐츠 전달에 집중할 수 있습니다.
- 지능형 라우팅 – 프록시는 트래픽을 해독하여 헤더, URI 등과 같은 요청 콘텐츠에 액세스할 수 있으며 이 데이터를 사용하여 요청을 라우팅할 수 있습니다.
- 인증서 관리 – 모든 백엔드 서버가 아닌 프록시 서버에서만 인증서를 구매하고 설치하면 됩니다. 이렇게 하면 시간과 비용이 모두 절약됩니다.
- 보안 패치 – SSL/TLS 스택에 취약점이 발생하면 적절한 패치를 프록시 서버에만 적용하면 됩니다.
2. Origin 서버에 대한 SSL/TLS 암호화
백엔드 서버로 보내는 트래픽을 암호화하기 위해 NGINX가 필요할 수 있습니다. 이러한 요청은 라우팅 결정을 내리기 위해 NGINX가 해독해야 하는 암호화된 트래픽 또는 일반 텍스트로 NGINX 서버에 도착할 수 있습니다. 백엔드 서버에 대한 keepalive 연결 풀을 사용하면 SSL/TLS 핸드셰이크 수가 최소화되므로 SSL/TLS 성능이 최대화됩니다. 이것은 이미 암호화되지 않은 트래픽을 자동으로 암호화한 후 “https”에 프록시하도록 NGINX를 구성하여 매우 간단하게 달성됩니다.
3. End-to-End 암호화
NGINX는 복호화와 암호화를 모두 수행할 수 있으므로 NGINX가 여전히 Layer 7 라우팅 결정을 내리면서 모든 요청의 End-to-End 암호화를 달성할 수 있습니다. 이 경우 클라이언트는 HTTPS를 통해 NGINX와 통신하고 요청을 해독한 다음 백엔드 서버로 보내기 전에 다시 암호화합니다. 이는 프록시 서버가 백엔드 서버와 함께 데이터 센터에 배치되지 않은 경우 바람직할 수 있습니다. 점점 더 많은 서버가 클라우드로 이동함에 따라 프록시와 백엔드 서버 사이에 HTTPS를 사용해야 하는 필요성이 높아지고 있습니다.
4. 클라이언트 인증서
NGINX는 SSL/TLS 클라이언트 인증서를 처리할 수 있으며 선택 사항 또는 필수 항목이 되도록 구성할 수 있습니다.
클라이언트 인증서는 암호를 요구하지 않고 시스템에 대한 액세스를 사전 승인된 클라이언트로만 제한하는 방법이며, NGINX가 클라이언트 인증서가 유효한지 여부를 확인하는 CRL(인증서 해지 목록)에 해지된 인증서를 추가하여 인증서를 제어할 수 있습니다.
5. 추가 보안 기능
다음을 포함하되 이에 국한되지 않는 이러한 사용 사례를 지원하는 데 도움이 되는 여러 다른 기능이 있습니다.
- 여러 인증서 – 단일 NGINX 인스턴스는 서로 다른 도메인에 대한 많은 인증서를 지원할 수 있으며 수십만 개의 인증서를 지원하도록 확장할 수 있습니다. 자체 인증서가 필요한 각 도메인과 함께 많은 IP 주소 및 도메인을 제공하는 NGINX 인스턴스를 갖는 것이 일반적인 사용 사례입니다.
- OCSP 스테이플링 – 이 기능이 활성화되면 NGINX는 클라이언트가 서버의 인증서를 확인하는 데 사용할 수 있는 인증 기관에서 서명한 타임스탬프가 있는 OCSP 응답을 포함하여 OCSP 서버에 직접 연결하여 성능이 저하되는 것을 방지합니다.
- SSL/TLS 암호 – 활성화할 암호를 지정할 수 있습니다.
- SSL/TLS 프로토콜 – SSLv2, SSLv3, TLSv1, TLSv1.1 및 TLSv1.2를 포함하여 활성화할 프로토콜을 지정할 수 있습니다.
- 체인 인증서 – NGINX는 웹사이트의 인증서가 CA(인증 기관)의 루트 인증서가 아닌 일련의 중간 인증서에 의해 직접 서명될 때 사용되는 인증서 체인을 지원합니다. 웹 서버는 중간 인증서가 포함된 ‘인증서 체인’을 제공하므로 웹 클라이언트는 웹사이트 인증서를 신뢰할 수 있는 루트 인증서에 연결하는 신뢰 체인을 확인할 수 있습니다.
- HTTPS 서버 최적화 – NGINX는 Worker 프로세스 수를 구성하고 keepalive 연결을 사용하며 SSL/TLS 세션 캐시를 사용하여 SSL/TLS 성능을 최대화하도록 조정할 수 있습니다.
자세한 내용은 다음 리소스를 확인하세요.
- nginx.org에서 HTTPS 서버 구성
- nginx.org의 ngx_http_ssl_module 참조 문서
6. 예시
다음은 NGINX의 보안 기능에 대한 몇 가지 예입니다. 이 예제에서는 NGINX 구성에 대한 기본적인 이해가 있다고 가정합니다.
다음 구성은 http://www.example.com에 대한 HTTP 트래픽을 처리하고 이를 업스트림 그룹에 프록시합니다.
upstream backends {
server 192.168.100.100:80;
server 192.168.100.101:80;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backends;
}
}
이제 HTTPS 지원을 추가하여 NGINX가 인증서와 Private Key를 사용하여 트래픽을 해독하고 HTTP를 통해 백엔드 서버와 통신하도록 합니다.
upstream backends {
server 192.168.100.100:80;
server 192.168.100.101:80;
}
server {
listen 80;
listen 443 ssl; # 'ssl' parameter tells NGINX to decrypt the traffic
server_name www.example.com;
ssl_certificate www.example.com.crt; # The certificate file
ssl_certificate_key www.example.com.key; # The private key file
location / {
proxy_pass http://backends;
}
}
또는 HTTP를 통해 트래픽을 수신하고 HTTPS를 통해 백엔드 서버로 보내는 경우:
upstream backends {
server 192.168.100.100:443;
server 192.168.100.101:443;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass https://backends; # 'https' prefix tells NGINX to encrypt the traffic
}
}
프로덕션급의 NGINX Plus를 사용해 보려면 지금 무료 30일 평가판을 시작하거나 당사에 연락하여 사용 사례에 대해 논의하십시오.
사용 사례에 대해 최신 소식을 빠르게 전달받고 싶으시면 아래 뉴스레터를 구독하세요.
댓글을 달려면 로그인해야 합니다.