← 모두의 툴

SSL 체커는 실제로 서버에 접속하지 않는다 — Certificate Transparency 로그의 원리

가이드 · 2026-08-19 최종 확인

"이 도메인 SSL 인증서 언제 만료돼?"를 브라우저에서 바로 확인해주는 도구를 쓰다 보면 한 가지 궁금증이 생깁니다. 브라우저 자바스크립트가 임의의 제3자 서버에 직접 접속해서 인증서를 확인하는 게 정말 가능한가요? 답은 "아니오"입니다. 이 가이드는 브라우저 기반 SSL 체커가 실제로 어떻게 동작하는지, 그리고 그 방식이 갖는 근본적인 한계를 설명합니다.

1. 브라우저는 임의 서버에 TLS 핸드셰이크를 걸 수 없다

서버 터미널에서 openssl s_client -connect example.com:443curl -vI https://example.com을 실행하면 실제로 대상 서버와 TLS 핸드셰이크를 주고받아 인증서를 즉석에서 받아올 수 있습니다. 하지만 브라우저에서 실행되는 자바스크립트에는 이런 저수준 TCP 소켓 API가 애초에 존재하지 않습니다. 이는 버그가 아니라 의도된 보안 설계입니다 — 웹페이지가 임의의 포트로 임의의 서버에 raw 소켓을 열 수 있다면 심각한 보안 문제(내부망 스캐닝, 프로토콜 스머글링 등)로 이어지기 때문입니다. 그래서 브라우저에서 동작하는 "SSL 체커" 류의 도구는 다른 방식으로 인증서 정보를 가져와야 합니다.

2. 대안: Certificate Transparency(CT) 로그 조회

구글이 2013년경부터 주도해 확산시킨 Certificate Transparency(인증서 투명성) 제도는, 공인 인증기관(CA)이 발급하는 모든 인증서를 공개적이고 검증 가능한 append-only 로그에 반드시 제출하도록 요구합니다. 현재는 사실상 모든 주요 브라우저가 CT 로그에 등록되지 않은 인증서를 신뢰하지 않기 때문에, 사실상 강제 조항이나 다름없습니다. crt.sh(Sectigo가 운영)는 이 CT 로그 전체를 색인화해서 검색 가능한 형태로 제공하는 공개 서비스입니다. 도메인 이름만 넣으면 그 도메인에 발급된 모든 인증서 이력을 대상 서버에 단 한 번도 접속하지 않고 조회할 수 있습니다.

3. 이 도구가 실제로 하는 일

실제로 소스 코드를 확인해보면, SSL 체커는 fetch('https://crt.sh/?q=도메인&output=json') 형태로 crt.sh의 JSON API를 호출합니다. 서버에 직접 접속해 실시간 핸드셰이크를 수행하는 대신, 이미 발급 이력이 기록된 CT 로그에서 가장 최근 인증서 정보(만료일·발급자·SAN 도메인 목록)를 가져와 보여주는 방식입니다. 참고로 crt.sh가 반환하는 날짜 문자열은 타임존 표기가 없지만 실제로는 UTC 기준이라, 도구는 이를 브라우저 로컬 시간대로 잘못 해석하지 않도록 명시적으로 UTC 변환 처리를 거칩니다.

정리: CT 로그 조회 = "이 도메인에 어떤 인증서가 발급된 적 있는가"를 확인하는 방식. 실시간 핸드셰이크 = "지금 이 순간 서버가 실제로 무슨 인증서를 제시하고 있는가"를 확인하는 방식. 둘은 답하는 질문 자체가 다릅니다.

4. CT 로그 조회 방식의 한계

CT 로그는 "발급 이력"을 보여줄 뿐, 서버가 지금 이 순간 실제로 제시하고 있는 인증서와 반드시 일치한다는 보장은 없습니다. 예를 들어 서버 설정 실수로 만료된 구 인증서를 여전히 제공하고 있거나, 여러 인증서 중 의도와 다른 것을 로드하고 있는 경우 CT 로그만으로는 알 수 없습니다. 또한 실시간 핸드셰이크가 알려주는 정보 — 지원하는 TLS 프로토콜 버전, 실제로 협상되는 암호 스위트(cipher suite), 클라이언트 관점에서의 체인 검증 결과, 인증서가 폐기(revoke)됐는지에 대한 OCSP/CRL 응답 여부 — 는 CT 로그 조회로는 전혀 알 수 없습니다. 이 둘은 상호보완적인 서로 다른 확인 방법입니다.

5. 실무에서 어떻게 나눠 써야 하나

자주 묻는 질문

Q. 이 도구는 왜 서버에 직접 접속하지 않나요?

A. 브라우저 자바스크립트에는 임의의 서버에 raw TCP 소켓을 열어 TLS 핸드셰이크를 수행할 수 있는 API가 존재하지 않습니다. 이는 웹 보안 모델상 의도적으로 막혀 있는 기능입니다.

Q. crt.sh는 무엇인가요?

A. Sectigo가 운영하는 무료 공개 서비스로, 모든 공인 CA가 의무적으로 제출하는 Certificate Transparency 로그를 검색 가능한 형태로 인덱싱해 제공합니다.

Q. CT 로그 조회 결과가 실제 서버 상태와 다를 수도 있나요?

A. 네. CT 로그는 "발급된 적 있는 인증서" 이력을 보여줄 뿐, 서버가 지금 실제로 그 인증서를 제시하고 있는지는 보장하지 않습니다. 실시간 확인이 필요하면 서버 사이드 핸드셰이크 도구를 별도로 사용해야 합니다.

Q. crt.sh 조회가 가끔 실패하거나 느린 이유는?

A. crt.sh는 무료 공개 서비스라 접속량이 많은 도메인에서는 JSON 응답이 지연되거나 일시적으로 실패할 수 있습니다. 잠시 후 재시도하면 대부분 해결됩니다.