TLS 지문, 또는 JA3 지문은 TLS 핸드셰이크 과정에서 특정 데이터를 추출하여 해시값으로 변환한 고유 식별자입니다. 이 지문은 일반적인 암호화 매개변수 없이도 웹 요청을 감지하는 데 사용되며, 이를 통해 서버는 클라이언트의 특성을 분석할 수 있습니다.
1. JA3 지문의 구성 요소
JA3 지문은 다음과 같은 다섯 가지 요소로 구성됩니다: TLS 버전, 암호 스위트, 확장, 지원되는 그룹, EC 포인트 형식.
- TLS 버전: 예를 들어, TLS 1.2는 771로 표현됩니다.
- 암호 스위트: 클라이언트가 서버와 함께 사용할 수 있는 암호화 알고리즘 목록입니다.
- 확장: 추가적인 정보나 기능을 제공하는 TLS 확장 목록입니다.
- 지원되는 그룹: 사용 가능한 타원 곡선 그룹입니다.
- EC 포인트 형식: 타원 곡선 포인트의 표현 방식입니다.
2. 대응 전략
2.1 curl_cffi 활용
curl_cffi는 curl 요청을 래핑하고 브라우저의 지문 정보를 추가하여 요청을 생성하는 라이브러리입니다. 이를 통해 복잡한 지문 설정 없이 요청을 보낼 수 있습니다.
# 설치: pip install curl_cffi==0.11.3
from curl_cffi import requests
response = requests.post(
url,
headers=headers,
params=params,
data=data,
proxies=proxies,
impersonate="chrome110"
)
2.2 cycletls 사용
cycletls는 브라우저의 JA3 지문 정보를 복사하여 서버의 검사를 우회할 수 있게 합니다. 이를 위해 먼저 tls.browserleaks.com/json에서 브라우저의 지문 정보를 확인한 후, 해당 정보를 cycletls 요청에 포함시킵니다.
const initCycleTLS = require('cycletls');
async function sendRequest() {
const cycleTLS = await initCycleTLS();
const response = await cycleTLS.request({
url: url,
method: 'POST',
body: 'page=1',
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
'ja3': '771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,27-13-10-11-51-35-18-17513-45-65281-0-65037-23-5-43-16,4588-29-23-24,0'
},
cookies: [
{ name: 'a', value: 'xxxx', domain: 'xxx', path: '/', expires: 1728826553, secure: true, httpOnly: false },
{ name: '__yr_token__', value: 'xxx', domain: 'xxxxm', path: '/', secure: true, httpOnly: false }
]
});
console.log(response);
cycleTLS.exit();
}
sendRequest();