hardwareConcurrency

navigator.hardwareConcurrency를 이용하여 사용자의 논리 코어를 알아낼수 있습니다.

console.log(navigator.hardwareConcurrency)

만약 사용자가 aws, gcp와 같은 클라우드 서비스를 사용한다면 cpu 코어수가 1개와 같이 너무 작거나 비성장적인 코드수를 반환해준다.

userAgentData

navigator.userAgentData를 통해서 사용자의 CPU 아키텍처를 확인할 수 있음.

if (navigator.userAgentData) {
  navigator.userAgentData.getHighEntropyValues(["architecture"])
    .then(ua => {
      console.log(ua.architecture); // 출력 예시: "x86" 또는 "arm"
    });
}

plugins

navigator.plugins를 통해서 사용자 브라우져의 사용되고 있는 플러그인을 확인할 수 있음.

console.log(navigator.plugins())

akamai의 경우 사용자의 plugins 데이터 또한 점수 측정 요소중 1개로 사용한다. 만약 사용자가 아무 plugin도 없다면 봇으로 판단할 확률이 높아진다. 이 이유 때문에 secret 모드에서 접속하면 봇으로 판정받는다.

platform

navigator.userAgentData.platform는 위에서 설명했던 userAgent에 속한 데이터로 이를 통해서 해당 운영체제가 어떤 운영체제인지 알수 있다.

console.log(nagivator.userAgentData.platform)

language

navigator.language를 통해서 사용자의 브라우저 설정 언어를 확인할 수 있습니다.

consol.log(navigator.language)

akamai의 경우 해당 값이 fingerprint로 넘어오지 않을 경우 http 봇으로 판단하고, 차단합니다.

WebGL

Fonts

화면에 보이지 않는 <span>을 이용해서 기본 폰트와 현재 사용자가 사용하고 있는 글자 폰트의 크기를 특정한 다음 타켓하고 싶은 폰트로 적용해서 픽셀의 변화를 통해서 특정 운영체제에 맞지 않는 글자 폰트가 반환됐을때 봇으로 판정하고 탐지할수 있습니다.

function isFontInstalled(fontName) {
  const container = document.createElement('body');
  const text = "abcdefghijklmnopqrstuvwxyz0123456789";
  const fontSize = "72px";
  
  // 1. 기준이 되는 기본 폰트 (대부분의 환경에서 공통된 크기를 가짐)
  const baseFont = "sans-serif";
  
  // 2. 임시 element 생성
  const span = document.createElement("span");
  span.style.fontSize = fontSize;
  span.innerHTML = text;
  
  // 기본 폰트의 크기 측정
  span.style.fontFamily = baseFont;
  document.body.appendChild(span);
  const baseWidth = span.offsetWidth;
  const baseHeight = span.offsetHeight;
  document.body.removeChild(span);
  
  // 3. 테스트할 폰트를 기본 폰트 뒤에 결합 (예: "Arial, sans-serif")
  // 폰트가 없으면 기본 폰트로 그려지므로 크기가 변하지 않음
  span.style.fontFamily = `'${fontName}', ${baseFont}`;
  document.body.appendChild(span);
  const testWidth = span.offsetWidth;
  const testHeight = span.offsetHeight;
  document.body.removeChild(span);
  
  // 크기가 달라졌다면 해당 폰트가 100% 설치되어 있는 것임
  return testWidth !== baseWidth || testHeight !== baseHeight;
}
 
// 윈도우, 맥, 봇 환경 테스트
console.log("Arial 설치 여부:", isFontInstalled("Arial"));
console.log("Helvetica 설치 여부:", isFontInstalled("Helvetica"));
console.log("맑은 고딕 설치 여부:", isFontInstalled("Malgun Gothic"));

akamai, cloudflare에서는 글자 폰트의 차이를 바탕으로 봇 서버를 구별하기도 합니다.

TLS

MIME Type