Network

SNI

창욱씨 2026. 10. 1. 19:57
반응형

SNI (Server Name Indication)

SNI는 TLS(Transport Layer Security) 프로토콜의 확장 기능으로, 클라이언트가 TLS 핸드셰이크 시작 시 접속하려는 호스트명(도메인)을 서버에 알려주는 메커니즘입니다.


왜 필요한가?

하나의 서버(하나의 IP 주소)에서 여러 도메인의 HTTPS 사이트를 호스팅하는 경우를 생각해 보세요:

IP 주소 호스팅 도메인
203.0.113.1 example.com, shop.example.com, blog.example.com

TLS 핸드셰이크는 HTTP 요청보다 먼저 일어나기 때문에, 서버는 HTTP의 Host 헤더를 보기 전에 어떤 인증서를 제시해야 할지 알 수 없습니다. SNI가 없으면 서버는 올바른 인증서를 선택할 방법이 없습니다.


동작 원리

클라이언트                                     서버
   │                                            │
   │──── ClientHello ──────────────────────────▶│
   │     (SNI: "shop.example.com")              │
   │                                            │  ← SNI 값을 보고
   │                                            │     해당 도메인의 인증서 선택
   │◀──── ServerHello + Certificate ────────────│
   │      (shop.example.com 인증서)              │
   │                                            │
   │        ... TLS 핸드셰이크 완료 ...           │
   │                                            │
   │──── 암호화된 HTTP 요청 ──────────────────▶│
  1. 클라이언트가 ClientHello 메시지에 접속하려는 호스트명을 평문으로 포함시킵니다.
  2. 서버는 해당 호스트명에 맞는 SSL/TLS 인증서를 선택하여 응답합니다.
  3. 이후 정상적인 TLS 핸드셰이크가 진행됩니다.

주요 특징

항목 설명
정의 RFC 6066에 정의된 TLS 확장
위치 TLS ClientHello 메시지 내
암호화 여부 ❌ 평문 (암호화되지 않음)
지원 거의 모든 최신 브라우저 및 서버에서 지원

보안 이슈: SNI는 평문

SNI 필드는 암호화되지 않기 때문에, 네트워크 중간에서 사용자가 어떤 도메인에 접속하는지 엿볼 수 있습니다. 이를 이용한 것이 SNI 기반 차단(SNI Filtering)입니다.

대응 기술: ECH (Encrypted Client Hello)

이전에 ESNI(Encrypted SNI)로 불리던 기술이 발전하여 현재는 ECH라는 이름으로 표준화가 진행 중입니다.

  • ClientHello 전체를 암호화하여 SNI를 포함한 메타데이터를 보호
  • DNS의 HTTPS 레코드를 통해 서버의 공개키를 배포
  • TLS 1.3 기반으로 동작

실무에서의 활용

  • 웹 호스팅: 하나의 IP로 수백 개의 HTTPS 사이트 운영 가능
  • CDN: Cloudflare, AWS CloudFront 등에서 SNI를 활용해 인증서 라우팅
  • 로드밸런서: SNI 값을 기반으로 트래픽을 적절한 백엔드로 분배
  • 네트워크 필터링: 일부 국가/기관에서 SNI 값을 검사하여 특정 사이트 차단
반응형

'Network' 카테고리의 다른 글

HTTP2 멀티플렉스 스트림  (0) 2025.08.24
Http3  (0) 2023.01.12
API Gateway  (0) 2021.04.20
GSLB  (1) 2021.04.09
CDN  (0) 2021.04.08