SNI란? TLS 서버 이름 표시의 작동 방식

서버 이름 표시(SNI)는 TLS 암호화 프로토콜에 추가된 기능으로, 클라이언트 장치가 TLS 핸드셰이크의 첫 단계에서 연결하려는 도메인 이름을 지정할 수 있도록 하여 일반적인 이름 불일치 오류를 방지합니다.

학습 목표

이 글을 읽은 후에 다음을 할 수 있습니다:

  • 가상 호스트 이름이 무엇인지 설명
  • 서버에서 잘못된 SSL 인증서가 제공될 수 있는 이유 이해
  • SNI로 이 문제가 해결되는 방법 알아보기

관련 콘텐츠


계속 알아보시겠어요?

인터넷에서 가장 인기 있는 인사이트를 한 달에 한 번 정리하는 Cloudflare의 월간 요약본 theNET를 구독하세요!

Cloudflare가 개인 데이터를 수집하고 처리하는 방법은 Cloudflare의 개인정보 취급방침을 참조하세요.

글 링크 복사

Cloudflare의 무료 SSL/TLS를 사용하여 보안 및 신뢰도 향상

서버 이름 표시(SNI)란?

SNI는 주택이 아닌 아파트 건물로 소포를 우송하는 것과 비슷합니다. 다른 사람의 집으로 우편물을 보낼 때는 주소만 알면 원하는 사람에게 소포를 전달할 수 있습니다. 하지만 아파트 건물로 택배를 보낼 때는 주소 외에 아파트 동호수가 필요하며, 그렇지 않으면 택배가 올바른 사람에게 전달되지 않거나 아예 배달되지 않을 수 있습니다.

많은 웹 서버는 집이라기보다는 아파트 건물과 비슷합니다. 여러 도메인 이름을 호스팅하므로 IP 주소만으로는 사용자가 어느 도메인에 접속하려고 하는지 알 수 없습니다. 이로 인해 서버에서 잘못된 SSL 인증서를 표시하여 HTTPS 연결이 차단되거나 종료될 수 있습니다(올바른 사람이 서명하지 않으면 소포를 주소로 배송할 수 없는 것과 마찬가지로).

여러 웹 사이트가 하나의 서버에서 호스팅되고 단일 IP 주소를 공유하며 각 웹 사이트에 고유한 SSL 인증서가 있는 경우, 클라이언트 장치에서 웹 사이트 중 하나에 안전하게 연결하려고 할 때 서버가 어떤 SSL 인증서를 표시할지 모를 수 있습니다. 이는 클라이언트 장치가 연결 중인 웹 사이트를 HTTP를 통해 표시하기 전에 SSL/TLS 핸드셰이크가 발생하기 때문입니다.

서버 이름 표시(SNI)는 이 문제를 해결하기 위해 고안되었습니다.SNI는 HTTPS에서 사용되는 TLS 프로토콜(이전에는 SSL 프로토콜이라고 불렀음)의 확장입니다.SNI는 클라이언트 장치가 접속하려는 웹 사이트에 대한 올바른 SSL 인증서를 확인할 수 있도록 하기 위해 TLS/SSL 핸드셰이크 프로세스에 포함되어 있습니다.이 확장을 사용하면 핸드셰이크 후 HTTP 연결이 될 때가 아니라 TLS 핸드셰이크 중에 웹 사이트의 호스트 이름(도메인 이름)을 지정할 수 있습니다.

간단히 말해서 SNI는 웹사이트가 https://www.something, https://www.another-website.com, https://www.example.io와 동일한 위치(동일한 IP 주소)에서 호스팅되는 경우에도 사용자 장치가 https://www.example.com과의 보안 연결을 열 수 있도록 합니다.

SNI는 클라이언트(사용자) 장치가 웹 사이트의 올바른 IP 주소에 도달했지만, SSL 인증서의 이름이 웹 사이트의 이름과 일치하지 않을 때 발생하는 오류인 "일반 이름 불일치 오류"를 방지합니다. 이러한 종류의 오류로 인해 사용자 브라우저에 "연결이 비공개가 아닙니다" 오류 메시지가 표시되는 경우가 많습니다.

SNI는 원래 프로토콜의 일부가 아니었으며 2003년에 TLS/SSL의 확장 기능으로 추가되었습니다. 아직 사용 중인 일부 가장 오래된 브라우저와 운영 체제를 제외한 거의 모든 브라우저, 운영 체제, 웹 서버에서 SNI를 지원합니다.

서버 이름이란?

SNI는 서버 이름 표시(Server Name Indication)의 약자이지만, SNI가 실제로 "표시하는" 것은 웹 사이트의 호스트 이름 또는 도메인 이름으로, 실제로 도메인을 호스팅하는 웹 서버의 이름과는 별개일 수 있습니다. 실제로 하나의 서버에서 여러 도메인을 호스팅하는 것이 일반적이며, 이 경우 가상 호스트 네임이라고 합니다.

서버 이름은 단순히 컴퓨터의 이름입니다. 웹 서버의 경우 서버가 하나의 도메인만 호스팅하고 서버 이름이 도메인 이름에 해당되는 경우가 아니면 이 이름은 일반적으로 최종 사용자에게 표시되지 않습니다.

TLS SNI 확장은 어떤 기능을 할까요?

웹 서버가 여러 호스트 이름 또는 도메인 이름(사람이 읽을 수 있는 웹 사이트 이름)을 담당하는 경우가 많습니다. 웹 사이트에서 HTTPS를 사용하는 경우 각 호스트 이름에는 자체 SSL 인증서가 있습니다.

문제는 한 서버에 있는 이 모든 호스트 이름이 동일한 IP 주소에 있다는 것입니다.TCP 연결이 열리자마자 클라이언트가 HTTP 요청에 어떤 웹 사이트에 연결하려고 하는지 표시하므로, 이는 HTTP에서는 문제가 되지 않습니다.

하지만 HTTPS에서는 HTTP 대화가 시작되기 전에 TLS 핸드셰이크가 먼저 이루어집니다(HTTPS는 여전히 HTTP를 사용하며, 단지 HTTP 메시지를 암호화할 뿐입니다). SNI가 없으면 클라이언트가 서버에 어떤 호스트 이름과 대화 중인지 표시할 수 있는 방법이 없습니다. 그 결과로 서버에서 잘못된 호스트 이름에 대한 SSL 인증서를 생성할 수 있습니다. SSL 인증서의 이름이 클라이언트가 연결하려는 이름과 일치하지 않으면 클라이언트 브라우저는 오류를 반환하고 일반적으로 연결을 종료합니다.

SNI는 도메인 이름을 TLS 핸드셰이크 프로세스에 추가하여 TLS 프로세스가 올바른 도메인 이름에 도달하고 올바른 SSL 인증서를 수신하므로, 나머지 TLS 핸드셰이크가 정상적으로 진행될 수 있습니다.

특히 SNI는 클라이언트 Hello 메시지 또는 TLS 핸드셰이크의 첫 번째 단계에 호스트 이름을 포함합니다.

호스트 이름이란? 가상 호스트 이름이란?

호스트 이름은 네트워크에 연결되는 장치의 이름입니다. 인터넷에서 도메인 이름 또는 웹 사이트 이름은 호스트 이름의 한 유형입니다. 둘 다 도메인 이름과 연결된 IP 주소와는 별개입니다.

가상 호스트 이름은 자체 IP 주소가 없고 다른 호스트 이름과 함께 서버에서 호스팅되는 호스트 이름입니다. 가상 현실이 물리적 세계가 아닌 디지털로만 존재하는 것처럼 가상 호스트 이름은 전용 물리적 서버가 없다는 점에서 "가상" 입니다.

암호화된 SNI(ESNI)란?

암호화된 SNI(ESNI)는 클라이언트 헬로(Client Hello)의 SNI 부분을 암호화하여 SNI 확장에 추가합니다.이렇게 하면 클라이언트와 서버 사이를 스누핑하는 사람이 클라이언트가 어떤 인증서를 요청하는지 알 수 없으므로 클라이언트를 더 잘 보호하고 보안을 유지할 수 있습니다.Cloudflare와 Mozilla Firefox에서는 2018년에 ESNI에 대한 지원을 시작했습니다.

사용자의 브라우저에서 SNI를 지원하지 않는 경우 어떻게 될까요?

이처럼 드문 경우, 사용자는 특정 웹 사이트에 접속할 수 없을 가능성이 있고, 사용자의 브라우저에 "연결이 비공개가 아닙니다"와 같은 오류 메시지가 표시될 수 있습니다.

대부분의 브라우저와 운영 체제에서는 SNI가 지원됩니다. 아주 오래된 버전의 Internet Explorer, 오래된 버전의 BlackBerry 운영 체제, 기타 오래된 소프트웨어 버전에서만 SNI가 지원되지 않습니다.

TLS/SSL 프로토콜, SSL 인증서, HTTPS 작동 방식에 대해 자세히 알아보려면 SSL 인증서란?을 참조하세요