설명
클라이언트가 TLS 연결을 열면, 가장 첫 번째 바이트는 클라이언트가 지원하는 암호화 스위트, TLS 버전, 확장 기능, 타원 곡선, ALPN 값을 설명하는 ClientHello 패킷입니다. 이러한 속성의 정확한 목록과 순서는 구현에 따라 다릅니다. Chrome의 ClientHello는 Firefox의 것과 다르고, Firefox의 것은 curl의 것과 다르며, curl의 것은 Python의 `requests` 라이브러리의 것과 다릅니다.
JA3(및 그 후속 버전인 JA4)는 ClientHello의 구조를 짧은 식별자로 변환하는 해시 형식입니다. 안티봇 벤더는 들어오는 모든 TLS 연결에 대해 이 해시를 계산하고 알려진 시그니처와 대조합니다. 스크레이퍼가 Python `requests`를 사용하는 경우, TLS 지문이 OpenSSL 기본값과 일치하여 단 하나의 HTTP 바이트도 보내기 전에 '실제 브라우저가 아님'으로 즉시 식별됩니다.
이것이 IP와 User-Agent가 올바르게 보이더라도 많은 스크레이퍼가 Cloudflare, Akamai 및 유사한 스택에서 실패하는 이유입니다. TLS 계층은 요청이 Chrome에서 온 것이 아님을 드러냅니다. 최신 스텔스 라이브러리(`curl_cffi`, `tls-client`, 적절한 실행 플래그를 사용한 Playwright 등)는 이를 피하기 위해 실제 브라우저의 TLS 지문을 모방합니다.
작동 방식
JA3는 ClientHello의 다섯 가지 필드, 즉 TLS 버전, 지원되는 암호 스위트, 지원되는 확장, 지원되는 타원 곡선, 지원되는 타원 곡선 점 형식으로 지문을 구성합니다. 이를 결합하여 MD5 해시를 생성하고 32자 시그니처를 만듭니다.
JA4(현대적 대체 방식)는 여기에 ALPN, 버전, SNI 존재 여부, GREASE 처리 방식을 추가하고, 무작위화에 강한 안정적인 방식으로 확장을 정렬합니다. JA4에는 QUIC(JA4Q), HTTP(JA4H), SSL 세션(JA4S)용 변형도 있습니다. 서버는 지문을 계산하여 허용/차단 목록과 대조하거나 다른 신호와 함께 위험 점수 모델에 입력합니다.