SNI(Server Name Indication)는 TLS 핸드셰이크 단계에서 클라이언트가 “접속하려는 도메인 이름”을 서버에 미리 알려주는 확장 기능임.

쉽게 말해 하나의 IP(서버)가 운영중인 여러 HTTPS도메인을 구분하기 위해 인증서 선택에 필요한 도메인 정보를 TLS 시작 시점에 클라이언트가 서버에게 미리 전달하는 메커니즘.

왜 이런게 필요해졌는가?

HTTP는 요청에 애초에 HOST헤더가 있음. 서버는 요청받은 후 Host를 보고 어떤 호스트인지 알 수 있다.

그런데 HTTPS는 TLS핸드셰이크가 HTTP요청보다 먼저 일어난다. 서버는 Host를 보고 인증서를 보내야하는데 TLS시점에는 HTTP의 Host헤더를 못받아서 어떤 도메인의 인증서를 보내야하는지 알 수가 없음.

예를들어 서버 IP 1.1.1.1:443에서 a.example.com, b.example.com 도메인을 운영중이고, 각각 서로 다른 인증서를 적용해야 할때, 클라이언트가 요청한 IP:port만으로는(TCP) 도메인의 어떤 인증서를 보내야할지 알수가 없다.

SNI의 동작 원리

  1. 클라이언트가 TLS ClientHello 전송
  2. 이때 SNI 확장 필드에 접속하려는 도메인 이름 포함

server_name = [example.com](<http://example.com/>) 이런식으로 포함시킨다.

  1. 서버는 이 값을 보고:
  2. 선택한 인증서로 TLS 핸드셰이크 진행

중요한 포인트: