less than 1 minute read

나는 지금까지 SNI(server name indicator) 에 대해 어렴풋하게나마 알고 있는줄 알았다. 그런데 aws를 사용하다 보니, 내가 sni에 대해 잘못 이해하고 있었다는 사실을 깨달았다.

우선 sni란, ‘하나의 서버에 여러 도메인의 서비스를 올려놨을 때, http request를 서버 안에서 특정 도메인과 연결시키기 위해 사용하는 정보’ 라고 알고 있었다.

이건 틀린 말은 아니지만 부족하다. 특히 나는 내가 다루는 기술 중, 어느 시점에서 어떻게 SNI를 설정하는지에 대해서는 모르고 있었다. 막연히 http request header의 host인가보다 라고 생각했다.

하지만 알고보니 SNI는 http request 단계에서는 쓰이지 않았다. TLS handshake 단계에서 사용되는 것이었다.

예를 들어 AWS cloudfront 에서 ALB의 ingress로 HTTPS 통신을 시작할 때, 우선 TLS handshake 를 맺어야 한다. 이때 SNI가 ‘이 tls handshake 는 어느 도메인의 인증서를 사용하라’는 표지판 역할을 한다. ALB는 SNI를 확인하여 필요한 도메인의 TLS 인증서를 사용한다. 그 후에 http 통신을 시작한다.

그러니 SNI는 OSI 레이어 중 5단계 세션 레이어에 속하는 것이다. 암호화와 엮여있으니 6단계 프레젠테이션 레이어와도 엮여 있다.

이제 SNI가 언제 쓰이는지는 알았다. 그러면 SNI는 무엇을 가지고 만들어지는가? 이건 간단하다. url의 hostname이 곧 SNI가 된다.

url의 hostname은 DNS에도 쓰이고, SNI에도 쓰이고, HTTP request header에도 쓰인다. 쓰이는 곳이 많다.

EOD

20260701

Tags:

Categories:

Updated:

Leave a comment