TrotVote
[IT 심층 분석]

HTTPS 서비스의 TLS 핸드쉐이크 지연이 초래하는 초기 연결 지연과 세션 재개로 시간 극복하기

김민준 · IT 시스템 엔지니어|
성능 최적화 프로젝트를 진행하던 중 프론트엔드 팀이 Lighthouse 점수가 도무지 95점을 넘지 못한다는 의견을 제기했습니다. 네트워크 워터폴 차트를 상세히 분석하자 CSS와 자바스크립트 파일의 다운로드 자체는 빠른데 연결을 시작하는 초기 단계 즉 TLS Negotiation 항목에서만 요청마다 200~300ms 이상의 시간이 소비되고 있었음이 눈에 들어왔습니다. 최초의 HTTPS 연결을 맺기 위한 TLS 1.3 핸드쉐이크 과정에서 클라이언트와 서버 사이를 오가는 왕복 통신이 너무 많은 시간을 잡아먹고 있었던 것입니다. TLS 핸드쉐이크는 단순한 TCP 연결 이상의 복잡한 암호화 협상 과정을 포함합니다. 서버 인증서를 교환하고 대칭 키를 안전하게 합의하는 이 과정은 물리적인 왕복 시간(RTT)에 매우 직접적으로 영향을 받습니다. 사용자가 지리적으로 서버와 멀리 떨어져 있을수록, 또 CDN 설정이 없을수록 이 지연은 더욱 심해집니다. 나아가 매번 새로운 페이지 자원을 요청할 때마다 처음부터 핸드쉐이크를 다시 하고 있다는 것도 문제였습니다. 첫 번째 개선 조치는 TLS 세션 재개(Session Resumption) 기능을 서버에 올바르게 활성화하는 것이었습니다. TLS 1.3에서 지원하는 0-RTT 방식과 세션 티켓(Session Ticket) 메커니즘을 nginx 설정에서 활성화하면 한 번 핸드쉐이크에 성공한 클라이언트는 이후 재접속 시 저장된 세션 정보를 제시하여 핸드쉐이크 왕복 횟수를 획기적으로 줄일 수 있습니다. 두 번째로는 OCSP Stapling을 설정했습니다. 브라우저는 서버 인증서의 유효성을 즉시 확인하기 위해 인증기관에 별도로 쿼리를 날리는데 이 시간도 무시할 수 없는 지연입니다. OCSP Stapling을 활성화하면 서버가 미리 인증기관으로부터 유효성 확인 응답을 받아두었다가 핸드쉐이크 시 함께 전달하여 브라우저의 별도 조회 왕복 시간을 제거할 수 있습니다. 세 번째로 서버 앞단에 Cloudflare를 도입하여 전 세계 거점의 PoP(Point of Presence)에서 TLS 종단을 처리하게 함으로써 물리적인 RTT 자체를 한층 줄였습니다. 세 가지 설정을 조합한 결과 평균 TLS 협상 지연은 300ms 수준에서 30ms 이하로 10배 이상 감소했습니다.