SNI(Server Name Indication)는 TLS(Transport Layer Security) 프로토콜의 확장 기능으로, 클라이언트가 서버에 연결할 때 어떤 호스트에 접속하려는지를 미리 서버에 알려주는 역할을 합니다.
1. 문제: 여러 도메인을 하나의 IP 주소에서 호스팅할 때
하나의 서버 (12.34.56.78 서버라고 가정하겠습니다)에서 여러 도메인(예: example.com, example.org)을 동일한 IP 주소 (12.34.56.78) 로 호스팅할 수 있습니다. 이 경우, HTTP에서는 Host 헤더를 이용해 클라이언트가 어느 도메인에 접속하려고 하는지 서버에 알릴 수 있기 때문에 문제가 없었습니다.
그러나 HTTPS에서는 클라이언트와 서버가 SSL/TLS 연결을 설정할 때, 암호화된 통신이 먼저 이루어지고 그 후에 클라이언트 요청이 진행됩니다.
따라서, 서버는 클라이언트가 어느 도메인에 접근하려고 하는지 알기 전에 인증서를 제시해야 했습니다.
2. 기존 방식의 한계
TLS를 설정할 때, 서버는 특정 도메인에 대한 SSL/TLS 인증서를 클라이언트에게 제공해야 합니다.
문제는 하나의 IP 주소(12.34.56.78) 에 여러 도메인을 호스팅하는 경우, 서버가 클라이언트가 어느 도메인에 연결하려고 하는지 알 수 없다는 점입니다.
결과적으로 서버는 하나의 인증서만 제공할 수 있고, 이로 인해 여러 도메인에 대해 올바른 인증서를 제공하기 어려웠습니다.
예시 순서
1. 서버는 example.com과 example.org를 동일한 IP에서 호스팅합니다.
2. 클라이언트가 HTTPS로 example.org에 접속하려고 하지만, 서버는 클라이언트가 어느 도메인에 연결하려는지 알 수 없으므로 example.com의 인증서를 제시합니다.
3. 클라이언트는 인증서가 일치하지 않는다고 인식해 경고를 출력하거나 연결을 차단합니다.
3. SNI의 등장
SNI는 이 문제를 해결하기 위해 도입되었습니다. SNI를 사용하면 클라이언트가 SSL/TLS 핸드셰이크 과정에서 서버에 연결 요청을 보낼 때, 접속하려는 도메인의 이름(호스트네임)을 함께 전송합니다. 서버는 이 정보를 기반으로 적절한 인증서를 선택하여 클라이언트에게 제공할 수 있게 됩니다.
4. SNI의 동작 과정
- 클라이언트가 서버에 TLS 연결을 요청합니다.
- 클라이언트는 SNI 확장을 통해 연결하려는 호스트네임(예: example.org)을 서버에 보냅니다.
- 서버는 클라이언트가 요청한 호스트네임을 확인하고, 해당 도메인에 적합한 인증서를 클라이언트에게 반환합니다.
- TLS 핸드셰이크가 완료되고, 클라이언트는 암호화된 연결을 통해 안전하게 통신을 시작합니다.
5. SNI가 필요한 이유 요약
- 다중 도메인 지원: 하나의 서버에서 여러 도메인을 호스팅할 때, SNI를 통해 적절한 인증서를 제공할 수 있습니다.
- 호스팅 비용 절감: SNI가 없으면 각 도메인마다 별도의 IP 주소를 사용해야 했습니다. SNI 덕분에 여러 도메인이 하나의 IP로 호스팅 가능해졌습니다. (Public IP를 할당 받으려면 비용이 드니까요)
- HTTPS 확산 기여: 다중 도메인 인증서 발급과 관리를 간소화하여 HTTPS 사용을 촉진했습니다.
6. SNI가 없는 경우의 문제
만약 SNI를 지원하지 않는 클라이언트가 HTTPS 서버에 접속하려 하면, 서버는 기본 인증서를 제공할 수밖에 없습니다. 이 경우 클라이언트는 예상하지 못한 도메인의 인증서를 받아들여, 브라우저는 "인증서 불일치 경고"를 출력할 수 있습니다
7. SNI의 사용 케이스
대부분의 웹 서버나 프록시에서 사용됩니다. (nginx, HAProxy, IIS 등)
HAProxy의 SNI 실제 예시
1. 3개의 secure website를 맥 머신에서 무료로 호스팅할 수 있습니다.
2. 내 라우터를 Port forward할 수 있습니다.
3. HAProxy with SNI / ALPN / Http2 / TLS 1.3
위와 같은 구성으로 쉽게 구성할 수 있습니다.
아래의 유튜브 영상을 참고하면 어떻게 구성했는지 확인 가능합니다.
8. SNI, ESNI의 한계
- SNI는 hostname을 보안되지 않은 실제 텍스트로 보냅니다.
- 따라서, Privacy가 없습니다.
- 그래서 ESNI는 이를 encrypt 해서 나온 개념입니다.
- 다만, ESNI는 DoH/DoT에서만 사용할 수 있습니다.
'CS 지식 > 네트워크 기본 다지기' 카테고리의 다른 글
UDP와 DNS (1) | 2024.09.30 |
---|---|
TLS 1.2, 1.3 (4) | 2024.09.30 |
Layer 4 vs Layer 7 Load balancing (0) | 2024.09.29 |
TCP Flow Control & Congestion Control (4) | 2024.09.23 |
TCP Segment 구조 (0) | 2024.09.23 |
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.