SNI
1. 개요
1. 개요
SNI(Server Name Indication)는 TLS 및 SSL 암호화 프로토콜의 확장 기능이다. 이 기술은 하나의 IP 주소를 공유하는 여러 도메인에 대해 서로 다른 SSL 인증서를 사용할 수 있도록 해준다. 기본적으로 클라이언트가 TLS 핸드셰이크를 시작할 때 접속하려는 서버의 호스트명을 명시적으로 전송하는 방식을 채택한다.
SNI가 등장하기 전에는 하나의 IP 주소당 하나의 SSL 인증서만 사용할 수 있었다. 이는 가상 호스팅 환경에서 암호화 연결을 제공하는 데 큰 제약이 되었다. SNI는 이 문제를 해결함으로써, 서버 운영자가 물리적 서버나 IP 주소를 추가하지 않고도 여러 보안 웹사이트를 효율적으로 호스팅할 수 있는 기반을 마련했다.
이 기술은 HTTP를 비롯한 HTTPS, SMTP, FTP 등 TLS 암호화가 적용되는 다양한 상위 레이어 프로토콜에서 활용된다. 현대적인 웹 호스팅과 클라우드 컴퓨팅 인프라에서 필수적인 구성 요소로 자리 잡았다.
2. SNI의 등장 배경
2. SNI의 등장 배경
SNI(Server Name Indication)는 TLS(Transport Layer Security) 및 그 전신인 SSL(Secure Sockets Layer) 프로토콜의 확장 기능으로, 하나의 IP 주소와 포트 번호를 공유하는 여러 SSL 인증서 또는 도메인 이름을 지원하기 위해 고안되었다. 이 기술이 등장하기 전에는 가상 호스팅 환경에서 HTTPS를 구현하는 데 근본적인 제약이 존재했다.
초기 SSL 및 TLS 1.0 프로토콜에서는 TLS 핸드셰이크가 시작되는 시점, 즉 클라이언트와 서버가 암호화된 연결을 협상하는 과정에서 클라이언트가 접속하려는 호스트명(도메인)을 서버에 알릴 수 있는 방법이 없었다. 서버는 연결이 수립된 IP 주소와 포트만을 알 수 있었고, 이로 인해 서버는 해당 IP 주소에 대응하는 '유일한' 올바른 SSL 인증서를 클라이언트에 제공해야 했다. 따라서 하나의 서버(동일 IP 주소)에서 여러 개의 서로 다른 도메인을 HTTPS로 서비스하는 것이 불가능했다.
이러한 제한은 웹 호스팅 산업과 인터넷 인프라에 실질적인 문제를 야기했다. 호스팅 업체들은 각 가상 호스트마다 별도의 IP 주소를 할당해야 했으며, 이는 IPv4 주소의 고갈을 가속화하는 요인 중 하나가 되었다. 또한 관리 비용과 복잡성이 증가하는 결과를 초래했다. 이러한 배경에서, TLS 확장 표준인 RFC 6066에 정의된 SNI가 2003년 경 제안되어 TLS 프로토콜에 공식적으로 도입되었다.
SNI의 핵심 아이디어는 간단하다. 클라이언트가 TLS 핸드셰이크의 첫 번째 메시지인 ClientHello에 접속하려는 서버의 도메인 이름을 평문으로 포함시켜 보내는 것이다. 이를 수신한 서버는 해당 도메인 이름을 확인하고, 그에 맞는 SSL 인증서를 선택하여 핸드셰이크를 계속 진행한다. 이로 인해 기술적 장벽이 해소되어, 단일 서버에서 여러 안전한 웹사이트를 효율적으로 호스팅하는 것이 가능해졌다.
3. 작동 원리
3. 작동 원리
SNI(Server Name Indication)는 TLS 핸드셰이크 과정 초기에, 클라이언트가 접속하려는 서버의 호스트명을 평문으로 서버에 알려주는 확장 기능이다. 이를 통해 하나의 IP 주소와 포트를 공유하는 여러 SSL/TLS 인증서 기반의 가상 호스트 서버가 정상적으로 작동할 수 있다. 핵심은 클라이언트가 서버와 암호화된 연결을 수립하기 전에, 어떤 도메인으로 접속하려는지 먼저 밝히는 것이다.
### TLS 핸드셰이크 과정에서의 SNI
표준 TLS 핸드셰이크에서 ClientHello 메시지는 협상에 사용할 TLS 버전, 지원하는 암호 스위트 등을 포함한다. SNI가 활성화된 경우, 이 ClientHello 메시지 내부의 확장(Extension) 필드에 server_name 타입으로 접속하려는 호스트명(예: www.example.com)이 추가된다. 이 정보는 핸드셰이크의 매우 초기 단계에서 교환되며, 아직 암호화되지 않은 상태(평문)로 전송된다는 점이 특징이다.
서버는 이 SNI 정보를 받아, 클라이언트가 요청한 특정 호스트명에 맞는 적절한 SSL 인증서를 선택하여 응답한다. SNI가 없다면 서버는 기본으로 설정된 인증서 하나만을 제공할 수밖에 없으며, 이로 인해 다른 도메인으로 접속하는 클라이언트에게 인증서 불일치 경고가 발생할 수 있다.
### 클라이언트와 서버 간의 통신 흐름
SNI를 포함한 일반적인 연결 설정 흐름은 다음과 같이 요약할 수 있다.
단계 | 주체 | 동작 | 비고 |
|---|---|---|---|
1 | 클라이언트 | 접속할 서버의 도메인 네임(호스트명)을 SNI 확장 필드에 담아 | 평문 전송 |
2 | 서버 | 수신한 SNI 값을 확인, 해당 호스트명에 매핑된 올바른 SSL 인증서를 선택 | |
3 | 서버 | 선택한 인증서를 | |
4 | 클라이언트 | 제공받은 인증서의 주체 대체 이름(SAN) 등을 검증, 요청한 도메인과 일치하면 연결 계속 진행 |
이 과정을 통해 단일 서버 인스턴스는 호스트명별로 서로 다른 인증서를 사용하는 여러 웹사이트(예: 가상 호스팅)를 안전하게 서비스할 수 있다.
3.1. TLS 핸드셰이크 과정에서의 SNI
3.1. TLS 핸드셰이크 과정에서의 SNI
TLS 핸드셰이크는 클라이언트와 서버가 보안 연결을 설정하기 위해 수행하는 일련의 협상 과정이다. SNI는 이 핸드셰이크의 초기 단계인 ClientHello 메시지에 포함되어 전송된다. 클라이언트는 아직 암호화되지 않은 평문 상태로 접속하려는 서버의 도메인 이름을 이 확장 필드에 명시한다.
서버는 ClientHello 메시지를 수신하면 내부에 포함된 SNI 확장을 확인한다. 이를 통해 단일 IP 주소와 단일 포트를 공유하는 여러 개의 서로 다른 SSL/TLS 인증서 중에서 어떤 인증서를 사용하여 핸드셰이크를 진행해야 하는지 식별한다. 올바른 인증서를 선택한 서버는 해당 인증서를 ServerHello 메시지에 담아 클라이언트에게 응답하며, 이후의 핸드셰이크는 선택된 인증서를 기반으로 계속된다.
아래 표는 SNI가 포함된 기본적인 TLS 핸드셰이크 흐름을 요약한다.
단계 | 발신자 | 주요 동작 및 SNI의 역할 |
|---|---|---|
1 | 클라이언트 |
|
2 | 서버 |
|
3 | 서버 |
|
4 | 이후 | 클라이언트/서버 |
만약 클라이언트가 SNI 확장을 보내지 않거나, 서버가 요청된 SNI 호스트명에 대한 서비스를 구성하지 않은 경우, 서버는 일반적으로 기본으로 설정된 인증서를 보내거나 핸드셰이크 실패 오류를 발생시킬 수 있다. 이 메커니즘은 HTTP/2나 HTTP/3와 같은 최신 프로토콜에서도 동일하게 적용된다.
3.2. 클라이언트와 서버 간의 통신 흐름
3.2. 클라이언트와 서버 간의 통신 흐름
클라이언트가 TLS 암호화 연결을 시작할 때, 서버는 클라이언트가 어떤 도메인 이름에 접속하려는지 알지 못합니다. 이는 하나의 IP 주소와 포트가 여러 개의 서로 다른 웹사이트(예: example.com과 example.net)를 호스팅하는 가상 호스팅 환경에서 문제가 됩니다. 서버는 클라이언트가 요청한 정확한 도메인에 맞는 인증서를 제공해야 하기 때문입니다.
SNI는 이 문제를 해결하기 위해 TLS 핸드셰이크의 초기 단계인 ClientHello 메시지에 접속하려는 서버의 도메인 이름을 평문으로 포함시킵니다. 구체적인 통신 흐름은 다음과 같습니다.
1. 클라이언트(예: 웹 브라우저)는 서버의 IP 주소로 연결을 시도합니다.
2. ClientHello 메시지를 생성할 때, extension 필드에 server_name 항목을 추가하고 여기에 접속하려는 호스트명(예: www.example.com)을 기록합니다.
3. 이 메시지를 서버로 보냅니다.
4. 서버는 ClientHello 메시지를 수신하고 server_name 확장 필드를 확인하여 클라이언트가 요청한 도메인 이름을 알아냅니다.
5. 서버는 확인된 도메인 이름에 해당하는 SSL/TLS 인증서를 선택하여 ServerHello 메시지와 함께 클라이언트에게 응답합니다.
6. 이후 핸드셰이크는 일반적인 절차대로 진행되어 암호화된 연결이 수립됩니다.
아래 표는 SNI를 사용한 일반적인 통신 단계를 요약한 것입니다.
단계 | 주체 | 동작 | 비고 |
|---|---|---|---|
1 | 클라이언트 | 서버 IP로 연결 시작 | |
2 | 클라이언트 |
| SNI 정보 포함 |
3 | 클라이언트 → 서버 |
| |
4 | 서버 |
| |
5 | 서버 | 확인된 도메인에 맞는 인증서 선택 | |
6 | 서버 → 클라이언트 |
| |
7 | 양측 | 나머지 TLS 핸드셰이크 완료 | 암호화 연결 수립 |
이 과정 덕분에 서버는 연결 초기에 올바른 인증서를 제공할 수 있으며, 클라이언트는 정상적으로 암호화된 세션을 시작할 수 있습니다. 그러나 SNI 정보가 암호화되지 않은 평문으로 전송되기 때문에, 중간에서 관찰하는 제3자는 사용자가 접속하려는 웹사이트의 도메인 이름을 알 수 있다는 보안상의 문제가 제기되었습니다. 이 문제를 해결하기 위해 ESNI나 ECH 같은 SNI 암호화 확장 표준이 개발되고 있습니다.
4. 주요 용도 및 활용
4. 주요 용도 및 활용
SNI의 주요 용도는 단일 IP 주소와 포트를 공유하는 여러 SSL/TLS 웹사이트를 호스팅하는 가상 호스팅을 가능하게 하는 것이다. SNI가 등장하기 전에는, 서버가 클라이언트의 TLS 핸드셰이크 요청을 받았을 때, 어떤 SSL 인증서를 제공해야 할지 알 수 없었다. 이는 각 사이트마다 고유한 IP 주소가 필요하게 만들어 자원을 비효율적으로 사용하게 했다. SNI는 클라이언트가 연결 초기 단계에서 접속하려는 호스트명을 평문으로 서버에 알려줌으로써, 서버가 해당 도메인에 맞는 올바른 인증서를 선택하여 핸드셰이크를 완료할 수 있게 한다.
가장 일반적인 활용 사례는 웹 호스팅 서비스다. 호스팅 업체는 수백 개의 서로 다른 고객 웹사이트를 단일 웹 서버(예: Apache 또는 Nginx)의 동일한 IP 주소에서 운영할 수 있다. 각 사이트는 자신의 도메인 이름(예: www.example.com)과 인증서를 가지며, SNI를 통해 클라이언트의 요청에 따라 적절한 사이트로 연결된다. 이는 IPv4 주소 고갈 문제를 완화하고 서버 인프라 관리 비용을 절감하는 데 기여한다.
또 다른 중요한 활용 분야는 콘텐츠 전송 네트워크 및 로드 밸런서와의 연동이다. CDN 제공업체는 전 세계에 분산된 엣지 서버 하나에 수천 개의 고객 도메인을 매핑한다. 사용자의 요청이 가장 가까운 CDN 서버에 도달하면, SNI 확장자를 확인하여 어떤 고객의 콘텐츠를 제공해야 하는지 식별하고, 해당 고객의 인증서로 TLS 연결을 설정한다. 마찬가지로 로드 밸런서는 단일 VIP(Virtual IP) 뒤에 여러 백엔드 서비스를 배치하고, 들어오는 TLS 연결의 SNI 정보를 기반으로 적절한 백엔드 서버 풀로 트래픽을 라우팅한다.
SNI는 HTTP/2 및 HTTP/3와 같은 현대 프로토콜의 다중화 기능과도 잘 동작한다. 단일 TLS 연결 내에서 여러 스트림이 병렬로 전송될 수 있지만, 연결 자체의 초기 설정은 SNI에 의해 특정 호스트에 맞춰진다. 이는 클라우드 환경과 마이크로서비스 아키텍처에서 특히 유용하며, 여러 서비스가 공통 게이트웨이를 통해 안전하게 노출될 수 있도록 지원한다.
4.1. 가상 호스팅 (Virtual Hosting)
4.1. 가상 호스팅 (Virtual Hosting)
가상 호스팅은 단일 서버와 하나의 IP 주소를 사용하여 여러 개의 독립적인 웹사이트나 도메인을 호스팅하는 기술이다. SNI는 특히 HTTPS 연결을 사용하는 가상 호스팅 환경에서 필수적인 역할을 수행한다. SSL/TLS 암호화가 적용되기 전에는, HTTP 프로토콜에서 클라이언트가 보내는 Host 헤더를 통해 서버가 요청된 사이트를 구분할 수 있었다. 그러나 TLS 핸드셰이크는 암호화 협상이 먼저 이루어지기 때문에, 서버는 클라이언트가 어떤 사이트에 접속하려는지 알기 전에 올바른 인증서를 제시해야 하는 문제에 직면했다.
이 문제를 해결하기 위해 SNI가 도입되었다. 클라이언트는 TLS 핸드셰이크의 초기 단계인 ClientHello 메시지에 접속하려는 서버의 도메인 이름을 평문으로 포함시킨다. 이를 수신한 웹 서버는 SNI 확장 필드에 명시된 도메인 이름을 확인하고, 해당 도메인에 맞는 SSL 인증서를 선택하여 핸드셰이크를 진행한다. 이 메커니즘 덕분에 서버 관리자는 다음과 같은 이점을 얻는다.
* 자원 효율성 향상: 여러 웹사이트를 위한 별도의 IP 주소와 물리적 서버를 구축할 필요가 없어져, 하드웨어 및 IPv4 주소 자원을 절약할 수 있다.
* 관리 편의성 증대: 하나의 서버 인스턴스에서 여러 도메인의 설정과 인증서를 통합 관리할 수
4.2. CDN 및 로드 밸런서 연동
4.2. CDN 및 로드 밸런서 연동
SNI는 콘텐츠 전송 네트워크 및 로드 밸런서가 효율적으로 작동하는 데 핵심적인 역할을 한다. 특히 하나의 IP 주소 뒤에 여러 개의 서로 다른 웹사이트나 서비스가 호스팅되는 환경에서, 들어오는 TLS 암호화 연결 요청을 올바른 백엔드 서버로 라우팅하기 위해 필요하다. SNI 확장이 없으면, 로드 밀런서나 CDN 에지 서버는 클라이언트가 암호화 핸드셰이크를 시작하기 전에 어느 사이트에 접속하려는지 알 수 없다.
CDN 제공업체는 전 세계에 분산된 수많은 에지 서버를 운영하며, 이 서버들은 종종 하나의 IP 주소를 공유하여 수천 개의 고객 도메인을 처리한다. 클라이언트가 연결을 시도하면, TLS 핸드셰이크의 첫 번째 메시지인 ClientHello에 포함된 SNI 필드를 통해 목표 도메인 이름을 확인한다. 이를 기반으로 CDN 시스템은 해당 도메인에 맞는 SSL/TLS 인증서를 선택하고, 캐시 정책 및 원본 서버 라우팅 규칙을 적용한다. 이 과정은 사용자에게 투명하게 이루어지며, 지리적으로 가까운 에지 서버에서 최적화된 콘텐츠를 빠르게 제공할 수 있게 한다.
로드 밸런서에서의 활용도 유사하다. 하나의 로드 밸런서 VIP 뒤에 여러 웹 서버 풀이 존재할 때, SNI 정보는 트래픽을 적절한 백엔드 풀로 전달하는 결정적 기준이 된다. 예를 들어, app1.example.com과 app2.example.com이 동일한 로드 밸런서를 통해 서비스된다면, 로드 밸런서는 SNI 값을 확인하여 각 도메인에 매핑된 서버 그룹으로 연결을 포워딩한다. 이는 7계층 로드 밸런싱의 기초를 이루며, 호스트 기반 라우팅을 가능하게 한다.
구성 요소 | SNI 활용 역할 |
|---|---|
CDN 에지 서버 | 클라이언트의 SNI를 확인하여 해당 도메인의 캐시된 콘텐츠 제공 및 정책 적용 |
로드 밸런서 | SNI 값을 기반으로 트래픽을 상이한 백엔드 서버 풀로 라우팅 (호스트 기반 라우팅) |
원본 서버 | 로드 밸런서나 CDN으로부터 전달된 연결을 수신 (SNI 정보는 종종 |
이러한 연동은 현대적인 클라우드 네이티브 아키텍처와 마이크로서비스 환경에서 필수적이다. 다만, SNI 정보가 암호화되지 않은 채 전송된다는 점은 ESNI나 ECH 같은 암호화 기술 발전의 동기가 되었다.
5. 보안 고려사항
5. 보안 고려사항
SNI 확장은 TLS 핸드셰이크 초기 단계에서 평문으로 전송됩니다. 이는 암호화가 시작되기 전에 클라이언트가 접속하려는 호스트명을 서버에 알려야 하기 때문입니다. 결과적으로, 네트워크 경로상의 관찰자(예: ISP, 공공 와이파이 운영자)는 사용자가 접속하는 웹사이트의 도메인 이름을 확인할 수 있습니다. 이는 통신 내용 자체는 암호화되어 있지만, 메타데이터가 노출되는 정보 유출 문제로 이어집니다.
이러한 감시 가능성은 특히 검열이 심한 국가에서 문제가 될 수 있습니다. 관찰자는 SNI 필드를 분석하여 특정 사이트나 서비스에 대한 접속을 차단할 수 있습니다. 또한, 사용자의 브라우징 습관을 프로파일링하는 데에도 활용될 수 있습니다.
이러한 보안 및 프라이버시 취약점을 해결하기 위해 SNI 정보의 암호화 기술이 개발되었습니다. ESNI(Encrypted Server Name Indication)는 초
5.1. SNI 정보의 암호화 (ESNI, ECH)
5.1. SNI 정보의 암호화 (ESNI, ECH)
TLS 핸드셰이크의 초기 단계에서 전송되는 SNI 확장은 평문으로 전송됩니다. 이는 클라이언트가 접속하려는 서버의 도메인 이름을 서버가 알 수 있도록 하기 위한 필수 과정이지만, 동시에 네트워크 관찰자가 사용자가 방문하는 사이트의 도메인을 쉽게 식별할 수 있게 만드는 정보 유출 문제를 야기합니다. 이 문제를 해결하기 위해 SNI 정보를 암호화하는 표준이 개발되었으며, 그 진화 과정은 ESNI에서 ECH로 이어집니다.
초기 대응책인 ESNI는 TLS 1.3을 기반으로 하여, 클라이언트가 공개 DNS 레코드(TXT 레코드)를 통해 사전에 획득한 서버의 공개키로 SNI 값을 암호화하는 방식을 사용했습니다. 이로 인해 핸드셰이크 과정에서 외부 관찰자는 암호화된 SNI 값만을 볼 수 있게 되었습니다. 그러나 ESNI는 몇 가지 실용적인 한계가 있었습니다. 가장 큰 문제는 암호화된 SNI를 사용하려면 반드시 TLS 1.3과 공개 DNS 조회가 선행되어야 한다는 점이었으며, 프록시나 중간 네트워크 장비가 정상적인 핸드셰이크를 관찰해야 하는 경우 등에서 호환성 문제가 발생할 수 있었습니다.
이러한 한계를 극복하고 더 강력한 프라이버시 보호를 제공하기 위해 개발된 최종 표준이 ECH입니다. ECH는 핸드셰이크 과정 자체를 재설계하여 SNI 암호화를 더 깊이 통합합니다. ECH에서는 클라이언트가 두 개의 연결 시도를 하나의 암호화된 패키지로 합칩니다. 하나는 공개적으로 알려진 '외관' 도메인(예: CDN 제공자의 도메인)으로의 연결 시도이고, 다른 하나는 실제 목적지인 '내부' 도메인에 대한 암호화된 연결 시도입니다. 서버는 이 패키지를 해독하여 실제 의도된 연결을 성립시킵니다. 이 방식은 네트워크 관찰자에게는 사용자가 단지 '외관' 도메인에 연결하는 것처럼만 보이게 만들어, 실제 방문 사이트를 더 효과적으로 숨깁니다. ECH는 TLS 표준의 일부로 통합되어 보다 광범위한 지원과 적용이 기대됩니다.
5.2. 정보 유출 및 감시 가능성
5.2. 정보 유출 및 감시 가능성
SNI 확장은 암호화되지 않은 평문으로 전송되기 때문에, 제3자가 네트워크 트래픽을 관찰(감청)할 경우 사용자가 접속하려는 웹사이트의 도메인 이름을 식별할 수 있다. 이는 TLS 핸드셰이크의 주요 목적인 통신 내용의 기밀성과는 별개로, 메타데이터가 노출되는 문제를 일으킨다.
감시 가능성은 몇 가지 측면에서 문제가 된다. 첫째, 정부나 인터넷 서비스 제공업체(ISP)가 특정 도메인에 대한 접속을 차단(예: 국가별 인터넷 검열)하거나 모니터링하는 데 SNI 정보를 활용할 수 있다. 둘째, 네트워크 관리자가 특정 서비스(예: 스트리밍, 소셜 미디어)의 트래픽을 식별하여 대역폭을 제한하거나 차별할 수 있는 가능성이 있다. 셋째, 공격자가 사용자의 웹 서핑 패턴을 추적하여 개인적인 관심사나 행동 프로필을 구성하는 데 이 정보를 이용할 수 있다.
이러한 정보 유출 문제를 완화하기 위해 암호화된 SNI(ESNI) 및 그 후속인 TLS 암호화 클라이언트 헬로(ECH) 표준이 개발되었다. 이 기술들은 SNI 필드 자체를 암호화하여, 오직 목표 서버만이 클라이언트가 요청한 호스트명을 알 수 있도록 한다. 그러나 이들의 광범위한 채택에는 DNS over HTTPS(DoH) 같은 지원 인프라의 배포와 클라이언트 및 서버 양측의 구현이 필요하다.
6. 구현 및 지원 현황
6. 구현 및 지원 현황
SNI의 구현은 주로 웹 서버 소프트웨어에서 이루어지며, 클라이언트 측의 지원도 필수적이다. 대부분의 현대 웹 서버와 클라이언트는 SNI를 광범위하게 지원한다.
주요 웹 서버의 설정 방식은 다음과 같다.
* Apache HTTP Server: httpd.conf 또는 가상 호스트 설정 파일에서 ServerName 지시어와 함께, 각 가상 호스트 블록(<VirtualHost>) 내에 해당 호스트명의 SSL/TLS 인증서를 지정하여 구성한다.
* Nginx: server 블록 내에 server_name 지시어로 도메인을 정의하고, ssl_certificate 및 ssl_certificate_key 지시어를 사용하여 해당 도메인의 인증서와 키를 연결한다.
* 기타 서버: Microsoft IIS, Caddy 등도 관리 콘솔이나 설정 파일을 통해 유사한 방식으로 다중 도메인에 대한 SSL/TLS 인증서를 SNI를 활용해 구성한다.
클라이언트 측 지원은 운영 체제와 웹 브라우저, 라이브러리에 달려 있다. 초기 TLS 1.0 및 TLS 1.1을 지원하는 구형 클라이언트 중에는 SNI를 지원하지 않는 경우가 존재했으나, 현재는 대부분의 환경에서 지원이 완료되었다. TLS 1.2와 TLS 1.3을 지원하는 모든 최신 브라우저(Chrome, Firefox, Safari, Edge 등)와 모바일 플랫폼은 SNI를 표준으로 포함한다. 그러나 매우 오래된 브라우저나 특정 임베디드 시스템의 클라이언트 라이브러리를 사용할 경우 호환성 문제가 발생할 수 있다.
6.1. 웹 서버 (Apache, Nginx 등) 설정
6.1. 웹 서버 (Apache, Nginx 등) 설정
SNI를 지원하는 웹 서버에서는 하나의 IP 주소와 포트로 여러 개의 SSL/TLS 인증서를 호스팅할 수 있다. 이를 위해서는 서버 소프트웨어의 설정 파일에서 가상 호스트(Virtual Host) 블록 내에 각 도메인에 대한 인증서 경로를 명시해야 한다.
아래는 주요 웹 서버에서의 기본적인 설정 방법이다.
웹 서버 | 설정 파일 예시 (가상 호스트 블록 내) | 주요 지시어 |
|---|---|---|
Apache |
|
|
Nginx |
|
|
Microsoft IIS | IIS 관리자 콘솔 또는 | 바인딩(Binding) 설정 시 호스트 이름 지정 |
Apache의 경우, mod_ssl 모듈이 로드되어 있어야 하며, 설정은 일반적으로 다음과 유사하다.
```
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
SSLCertificateFile /path/to/www.example.com.crt
SSLCertificateKeyFile /path/to/www.example.com.key
</VirtualHost>
<VirtualHost *:443>
ServerName www.another-example.com
SSLEngine on
SSLCertificateFile /path/to/www.another-example.com.crt
SSLCertificateKeyFile /path/to/www.another-example.com.key
</VirtualHost>
```
Nginx에서는 ssl 지시어와 함께 server_name으로 구분한다.
```
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /path/to/www.example.com.crt;
ssl_certificate_key /path/to/www.example.com.key;
...
}
server {
listen 443 ssl;
server_name www.another-example.com;
ssl_certificate /path/to/www.another-example.com.crt;
ssl_certificate_key /path/to/www.another-example.com.key;
...
}
```
모든 설정을 마친 후에는 웹 서버를 재시작하여 변경 사항을 적용해야 한다. 서버는 클라이언트가 TLS 핸드셰이크 초기에 보내는 SNI 확장 필드의 호스트 이름을 확인하고, 일치하는 가상 호스트 블록의 인증서를 사용하여 암호화 연결을 완성한다. 이 설정을 통해 물리적 서버 자원을 효율적으로 활용할 수 있다.
6.2. 클라이언트 (브라우저, 운영체제) 지원
6.2. 클라이언트 (브라우저, 운영체제) 지원
대부분의 현대 웹 브라우저와 주요 운영체제는 SNI 확장을 지원한다. 초기 지원은 TLS 1.0과 함께 도입되었으며, 시간이 지남에 따라 광범위하게 채택되었다.
주요 데스크톱 및 모바일 브라우저의 지원 현황은 다음과 같다.
브라우저 | 최소 지원 버전 (대략적) | 비고 |
|---|---|---|
6.0 (2010) | 모든 플랫폼에서 오래전부터 완전 지원 | |
2.0 (2006) | 초기 버전부터 지원 | |
3.0 (OS X 10.5.7) | ||
모든 버전 | 레거시 Internet Explorer는 버전 7 이상에서 Windows Vista 이상에서 부분 지원[3] | |
[[오페라 (웹 브라우저) | 오페라]] | 10.0 (2009) |
운영체제 측면에서는, 리눅스, macOS, Windows의 최신 버전들이 내장된 TLS 라이브러리(OpenSSL, Secure Transport, Schannel 등)를 통해 SNI를 지원한다. 안드로이드의 경우 2.3 진저브레드 이후의 버전에서 대부분의 브라우저와 앱이 지원한다. 그러나 매우 오래된 운영체제나 임베디드 시스템, 또는 사용자 정의 펌웨어를 사용하는 일부 장치에서는 SNI 지원이 누락되어 가상 호스팅 환경의 최신 SSL/TLS 사이트에 접근하지 못하는 문제가 발생할 수 있다.
7. 관련 기술 및 표준
7. 관련 기술 및 표준
SNI는 TLS 및 SSL 프로토콜의 확장 기능으로, 그 자체로 동작하기보다는 다른 핵심 프로토콜 및 표준과 긴밀하게 연관되어 작동합니다. 가장 근본적으로는 인터넷 프로토콜 스위트(TCP/IP)의 응용 계층 프로토콜인 HTTP와 HTTPS의 환경에서 필수적으로 활용됩니다. SNI는 전송 계층 보안 프로토콜, 특히 그 핵심 규격을 정의하는 RFC 문서군의 일부로 표준화되었습니다.
SNI의 초기 표준은 RFC 3546("Transport Layer Security (TLS) Extensions")에서 처음 소개되었으며, 이후 RFC 6066("Transport Layer Security (TLS) Extensions: Extension Definitions")을 통해 공식적으로 정의되고 개정되었습니다. 이 표준은 TLS 1.0 이후의 버전에서 지원되도록 설계되었습니다. SNI와 직접적으로 경쟁하거나 대체하는 역사적인 기술은 없지만, SNI가 해결한 문제인 "단일 IP 주소에서 다중 SSL 인증서 호스팅"을 위해 이전에는 각 도메인에 전용 IP 주소를 할당하거나, 와일드카드 인증서를 사용하거나, 서버 이름 표시 없이 모든 도메인을 포함하는 서버 인증서를 사용하는 방법 등이 존재했습니다.
SNI의 보안 취약점을 해결하기 위해 등장한 관련 표준으로는 ESNI(Encrypted Server Name Indication)와 그 후속인 ECH(Encrypted Client Hello)가 있습니다. ESNI는 RFC 8446(TLS 1.3)의 환경에서 DNS over HTTPS(DoH)를 통해 공개키를 배포하는 방식을 제안했으며[4], ECH는 이를 더 포괄적으로 발전시켜 전체 Client Hello 메시지를 암호화하는 방안으로 IETF에서 표준화 작업이 진행 중입니다. 또한, HTTP/3이 QUIC 프로토콜 위에서 구현될 때에도 동등한 기능을 제공하기 위한 메커니즘이 논의되고 있습니다.
관련 표준/기술 | RFC 번호 또는 설명 | SNI와의 관계 |
|---|---|---|
TLS/SSL | RFC 2246 (TLS 1.0), RFC 8446 (TLS 1.3) 등 | SNI가 동작하는 프로토콜 계층 |
SNI | RFC 6066, Section 3 | 본 표준 |
ESNI | 초안(draft-ietf-tls-esni) | SNI 필드 암호화 확장 |
ECH | 초안(draft-ietf-tls-esni) 이후 발전 | Client Hello 암호화를 통한 SNI 정보 보호 |
HTTP/HTTPS | RFC 9110 (HTTP/1.1), RFC 9112 (HTTP/2) | SNI가 주로 서비스되는 응용 프로토콜 |
가상 호스팅 | - | SNI가 가능하게 한 주요 활용 시나리오 |
