가상 호스트와 SNI

    들어가기 전

    istio를 사용할 때 VHOST와 SNI 키워드가 많이 나왔었다. 그런데 내가 이것들에 대해서 정확히 잘 모르고 있어서, 이 부분을 조금 보충해보고 싶어 글을 작성한다.

     


    가상 호스트 (Virtual Host)

    가상 호스트는 하나의 서버를 이용해 여러 서비스를 제공하고자 사용하는 개념이다. 이 때 서버는 Physical Machine 1대가 될 수도 있고, Pod 1개가 될 수도 있고, 컨테이너 1개가 될 수도 있다. 

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    SNI(Server Name Indicator)

    SNI는 서버 이름을 알려주는 TLS 프로토콜의 Extention이다. 그런데 왜 SNI는 필요한 것일까? 다음 경우를 가정해보자.

    1. 한 서버가 여러 도메인에 대해 서비스를 하고 있다. (https://a.com, https://b.com)
    2. 각 도메인에 대한 인증서가 2개 존재한다. (a.com / b.com)

    이런 경우가 있을 때, 클라이언트가 https://a.com으로 요청을 보낸다고 가정해보자. 이 때 한 가지 문제점이 발생할 수 있다. 

    1. https://a.com 으로 요청을 보냈을 때, TLS 핸드쉐이크를 해야한다. 
    2. TLS 핸드쉐이크를 할 때, 서버의 어떤 인증서를 사용해야 할지 알 수 없다. (이 때 인증서 알 수 없음 에러가 발생할 수 있음) 

    왜 이런 문제가 발생할까? 어떤 도메인에 대한 요청인지는 7 계층에서 Host 헤더를 이용해서 알 수 있는데, TLS Handshake는 5~6 Layer에서 이루어지기 때문에 Host 헤더를 이용할 수 없다. 이 때는 IP / Port 정보 밖에 없기 때문에 어떤 도메인으로 들어온 요청인지 알 수 없고, 따라서 어떤 인증서를 이용해야 할지 알 수 없다. 

    SNI는 이 문제를 해결하기 위해 도입된 것이다. SNI는 도메인 이름을 TLS 핸드쉐이크 프로세스 추가한다. 이 덕분에 TLS 핸드쉐이크를 하는 시점에 어떤 도메인으로 온 요청인지 알 수 있고, 따라서 적합한 인증서를 이용해 TLS Hnadshake를 할 수 있게 된다. SNI는 TLS Handshake에서 클라이언트가 서버에 처음 Hello 요청을 보낼 때 포함된다. 


    참고

    'etc > 진짜 잡다' 카테고리의 다른 글

    DNS : CNAME vs A record  (0) 2024.01.31
    TLS / mTLS란?  (0) 2024.01.31

    댓글

    Designed by JB FACTORY