가상 호스트(Vritual Host)와 SNI(Server Name Indication)


웹 서버의 멋진 기능중에 하나는 가상 호스트(Virtual Host)로 이 기능을 사용하여 추가 장비없이 새로운 웹 서비스를 시작할 수 있습니다.

웹 서버는 브라우저의 HTTP Request Header 에서 Host 헤더를 통해 어떤 가상 호스트의 컨텐츠를 서비스할지 결정합니다.


즉 다음과 같이 curl 명령을 수행할 경우

$ curl -v google.com


아래와 같이 서버에 Host HTTP Header(Host: google.com) 을 보내므로 웹 서버는 정확한 가상 호스트를 결정할 수 있습니다.

GET / HTTP/1.1
Host: google.com
User-Agent: curl/7.43.0
Accept: */*


SNI 란?

하지만 SSL/TLS의 경우 HTTP보다 먼저 수행되므로 브라우저가 Host Header 를 보내기 전에 SSL handshaking이 이루어 지고 웹 서버는 첫 번째 SSL 가상 호스트에 설정된 서버 인증서를 전송합니다.

그래서 SSL/TLS 기반으로 여러 개의 가상 호스트를 설정했을 경우 브라우저에서 SSL 인증서 검증시 인증서와 HostName 이 다르다는 에러가 발생할 수 있습니다.


이런 문제를 해결하기 위해 "서버 이름 표시(SNI;Server Name Indication - RFC 4366)" 규격이 있으며 대부분의 브라우저, 웹 서버, HTTPS 구현 라이브러리가 SNI 를 지원하므로 SSL/TLS에서도 가상 호스트를 사용할 수 있습니다.

Windows XP 와 JDK 6 은 SNI 를 지원하지 않으며 전체 목록은 위키피디아의 SNI에서 확인할 수 있습니다.

같이 보기


Ref