이 Node.js 사용자 에이전트 설정 가이드에서는 다음을 확인할 수 있습니다:
사용자 에이전트헤더 설정이 중요한 이유- Node.js에서 기본 사용자 에이전트 형식
- Fetch API를 사용하여 사용자 에이전트 설정하는 방법
- Node.js에서 사용자 에이전트 로테이션 구현 방법
자, 시작해 보겠습니다!
사용자 에이전트 설정이 중요한 이유
User-Agent 헤더는 HTTP 요청을 수행하는 클라이언트 소프트웨어를 식별하는 문자열입니다. 일반적으로 요청이 발생한 브라우저 또는 애플리케이션, 운영 체제, 시스템 아키텍처에 대한 세부 정보를 포함합니다. 이 헤더는 일반적으로 웹 브라우저, HTTP 클라이언트 또는 웹 요청을 수행하는 모든 소프트웨어에 의해 설정됩니다.
예를 들어, Chrome이 페이지를 요청할 때 설정하는 현재 사용자 에이전트는 다음과 같습니다:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36
아래는 이 사용자 에이전트 문자열의 구성 요소별 설명입니다:
Mozilla/5.0: 원래 Mozilla 브라우저와의 호환성을 나타내기 위해 사용되었으나, 현재는 호환성 목적으로 추가됩니다.Windows NT 10.0; Win64; x64:운영 체제(Windows NT 10.0), 플랫폼(Win64), 시스템 아키텍처(x64)를 나타냅니다.AppleWebKit/537.36: Chrome이 사용하는 브라우저 엔진을 나타냅니다.- (
KHTML, like Gecko): KHTML 및 Gecko 레이아웃 엔진과의 호환성을 나타냅니다. Chrome/127.0.0.0: 브라우저 이름과 버전을 지정합니다.Safari/537.36: Safari와의 호환성을 나타냅니다.
본질적으로 사용자 에이전트는 요청이 신뢰할 수 있는 브라우저에서 오는지, 아니면 다른 유형의 소프트웨어에서 오는지 여부를 드러낼 수 있습니다.
웹 스크래핑 봇과 자동화 스크립트는 종종 기본값이나 비(非) 브라우저 사용자 에이전트 문자열을 사용합니다. 이는 들어오는 요청을 면밀히 조사하여 웹 데이터를 보호하는 봇 방지 시스템에 자동화된 특성을 노출시킬 수 있습니다. User-Agent 헤더를 분석함으로써, 이러한 솔루션은 요청이 실제 사용자인지 봇인지 식별할 수 있습니다.
자세한 내용은 웹 스크래핑용 사용자 에이전트 가이드를 참조하세요.
Node.js의 기본 사용자 에이전트는 무엇인가요?
버전 18부터 Node.js는 Fetch API의 내장 구현으로 fetch() 메서드를 포함합니다. 이는 외부 종속성이 필요하지 않으므로 Node.js에서 HTTP 요청을 수행하는 권장 방법입니다. Node.js에서 Fetch API로 HTTP 요청을 수행하는 방법에 대해 자세히 알아보세요.
대부분의 다른 HTTP 클라이언트와 마찬가지로, fetch()는 요청 시 자동으로 기본 User-Agent 헤더를 설정합니다. 예를 들어, Python의 requests 라이브러리에서도 동일한 동작이 발생합니다.
특히 fetch() 가 설정하는 Node.js의 기본 사용자 에이전트는 다음과 같습니다:
node
httpbin.io/user-agent 엔드포인트에 GET 요청을 보내면 이를 확인할 수 있습니다. 이 엔드포인트는 수신 요청의 User-Agent 헤더를 반환하여 HTTP 클라이언트가 설정한 사용자 에이전트를 파악하는 데 도움을 줍니다.
Node.js 스크립트를 생성하고, 비동기 함수를 정의한 후, 원하는 HTTP 요청을 수행하기 위해 fetch() 를 사용하세요:
async function getFetchDefaultUserAgent() {
// HTTPBin 엔드포인트에 HTTP 요청을 수행하여
// 사용자 에이전트를 가져옴
const response = await fetch("https://httpbin.io/user-agent");
// 응답에서 기본 사용자 에이전트 읽기
// 출력
const data = await response.json();
console.log(data);
}
getFetchDefaultUserAgent();
위의 자바스크립트 코드를 실행하면 다음과 같은 문자열을 받게 됩니다:
{ 'user-agent': 'node' }
보시다시피 Node.js의 fetch() 가 설정하는 사용자 에이전트는 단순히 node입니다. 이 문자열은 브라우저가 사용하는 사용자 에이전트와 상당히 다르며, 이는 안티봇 시스템을 작동시킬 수 있습니다.
봇 방지 솔루션은 비정상적인 사용자 에이전트 문자열과 같은 의심스러운 패턴을 들어오는 요청에서 모니터링합니다. 탐지되면 해당 요청을 봇에서 온 것으로 표시하고 차단합니다. 따라서 기본 Node.js 사용자 에이전트 값을 변경하는 것이 플래그 지정되는 것을 피하는 핵심입니다!
Fetch API를 사용해 Node.js 사용자 에이전트 변경하는 방법
Fetch API 사양은 사용자 에이전트 변경을 위한 특정 메서드를 제공하지 않습니다. 동시에 User-Agent는 단순한 HTTP 헤더에 불과합니다. 즉, fetch() 의 header 옵션으로 그 값을 커스터마이징할 수 있습니다.
fetch()를 사용하여 Node.js에서 User-Agent 헤더를 설정하는 방법을 확인하세요!
로컬에서 사용자 에이전트 설정하기
fetch() 는 headers 옵션을 통해 헤더 사용자 지정을 지원합니다. 특정 HTTP 요청 시 User-Agent 헤더를 설정하려면 다음과 같이 사용하세요:
const response = await fetch("https://httpbin.io/user-agent", {
headers: {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
},
});
모든 것을 합치면 다음과 같습니다:
async function getFetchUserAgent() {
// HTTPBin에 HTTP 요청 전송
// 사용자 정의 사용자 에이전트 포함
const response = await fetch("https://httpbin.io/user-agent", {
headers: {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
},
});
// 응답에서 기본 사용자 에이전트 읽기
// 그리고 출력
const data = await response.json();
console.log(data);
}
getFetchUserAgent();
위 스크립트를 실행하면 이번에는 결과가 다음과 같습니다:
{
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
}
훌륭합니다! API가 반환한 사용자 에이전트가 코드에 설정된 사용자 에이전트와 일치합니다. 이제 Node.js 사용자 에이전트를 변경하는 방법을 알게 되었습니다.
전역적으로 사용자 에이전트 설정하기
요청별로 User-Agent를 설정하는 것은 간단하지만, 반복적인 보일러플레이트 코드가 발생할 수 있습니다. Node.js의 기본 사용자 에이전트를 전역적으로 변경하고 싶다면 어떻게 해야 할까요? 안타깝게도, 이 글을 작성하는 시점에서는 fetch() API가 기본 설정을 전역적으로 재정의할 수 있는 방법을 제공하지 않습니다.
대안으로 원하는 설정으로 fetch() 동작을 커스터마이징하는 래퍼 함수를 만들 수 있습니다:
function customFetch(url, options = {}) {
// 사용자 정의 헤더
const customHeaders = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
...options.headers, // options에 전달된 다른 헤더와 병합
};
const mergedOptions = {
...options,
headers: customHeaders,
};
return fetch(url, mergedOptions);
}
이제 fetch() 대신 customFetch() 를 호출하여 사용자 정의 사용자 에이전트로 HTTP 요청을 수행할 수 있습니다:
const response = await customFetch("https://httpbin.io/user-agent");
완성된 Node.js 스크립트는 다음과 같습니다:
function customFetch(url, options = {}) {
// 사용자 정의 사용자 에이전트 헤더 추가
const customHeaders = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
...options.headers, // options에 전달된 다른 헤더와 병합
};
const mergedOptions = {
...options,
headers: customHeaders,
};
return fetch(url, mergedOptions);
}
async function getFetchUserAgent() {
// HTTPBin에 HTTP 요청을 수행
// 커스텀 fetch 래퍼를 통해
const response = await customFetch("https://httpbin.io/user-agent");
// 응답에서 기본 사용자 에이전트 읽기
// 그리고 출력
const data = await response.json();
console.log(data);
}
getFetchUserAgent();
위의 Node.js 스크립트를 실행하면 다음과 같이 출력됩니다:
{
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
}
훌륭합니다! fetch()를 사용하여 Node.js에서 글로벌 사용자 에이전트를 설정하는 방법을 배웠습니다.
Node.js에서 사용자 에이전트 로테이션 구현하기
HTTP 클라이언트의 기본 User-Agent 헤더를 실제 브라우저의 헤더로 덮어쓰는 것만으로는 봇 탐지 시스템을 피하기에 충분하지 않을 수 있습니다. 동일한 IP 주소에서 동일한 사용자 에이전트로 너무 많은 요청을 보내면, 스크래핑 방지 시스템이 여전히 해당 활동을 자동화된 것으로 식별할 수 있습니다. 문제는 요청이 여전히 비인간적인 행동을 암시한다는 점입니다.
Node.js에서 봇 탐지 위험을 줄이려면 HTTP 요청에 변동성을 도입해야 합니다. 효과적인 기술 중 하나는 사용자 에이전트 로테이션으로, 각 요청마다 User-Agent 헤더를 변경하는 방식입니다. 이 접근법은 자동화된 요청이 서로 다른 브라우저에서 온 것처럼 보이게 하여 봇 방지 시스템에 의해 탐지될 가능성을 낮춥니다.
다음 섹션에서는 Node.js에서 사용자 에이전트 로테이션을 구현하는 방법을 배울 수 있습니다!
1단계: 사용자 에이전트 목록 수집
WhatIsMyBrowser.com 과 같은 사이트를 방문하여 유효한 사용자 에이전트 값 목록을 수집하세요:
const userAgents = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/126.0.2592.113",
// 기타 사용자 에이전트...
];
팁: 이 배열에 실제 사용자 에이전트 문자열이 많을수록, 봇 방지 탐지를 피하는 데 더 효과적입니다.
2단계: 사용자 에이전트 무작위 선택
목록에서 사용자 에이전트 문자열을 무작위로 선택하여 반환하는 함수를 생성합니다:
function getRandomUserAgent() {
const userAgents = [
// 간결함을 위해 사용자 에이전트 생략...
];
// 목록에서 무작위로 추출된 사용자 에이전트 반환
return userAgents[Math.floor(Math.random() * userAgents.length)];
}
이 함수에서 일어나는 일을 살펴보자:
Math.random()은 0과 1 사이의 난수를 생성합니다- 이 숫자에
userAgents배열의 길이를 곱합니다. Math.floor()는 결과 숫자를 그 이하의 가장 큰 정수로 반올림합니다.- 이전 연산으로 얻은 결과는 0부터
userAgents.length - 1까지의 범위를 가지는 무작위 생성된 인덱스에 해당합니다. - 이 인덱스를 사용하여 사용자 에이전트 배열에서 무작위 사용자 에이전트를 반환합니다.
getRandomUserAgent() 함수를 호출할 때마다 다른 사용자 에이전트를 얻을 가능성이 높습니다.
3단계: 무작위 사용자 에이전트로 HTTP 요청 수행
Node.js에서 fetch()를 사용하여 사용자 에이전트 로테이션을 구현하려면 getRandomUserAgent() 함수의 값으로 User-Agent 헤더를 설정하세요:
const response = await fetch("https://httpbin.io/user-agent", {
headers: {
"User-Agent": getRandomUserAgent(),
},
});
이제 Fetch API를 통해 수행되는 HTTP 요청은 무작위 사용자 에이전트를 가지게 됩니다.
4단계: 모든 것을 결합하기
이전 단계의 코드 조각들을 Node.js 스크립트에 추가한 후, fetch() 요청을 수행하는 로직을 async 함수로 감쌉니다.
최종 Node.js 사용자 에이전트 로테이션 스크립트는 다음과 같아야 합니다:
function getRandomUserAgent() {
const userAgents = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/126.0.2592.113",
// 기타 사용자 에이전트...
];
// 사용자 에이전트를 무작위로 반환
// 목록에서 추출
return userAgents[Math.floor(Math.random() * userAgents.length)];
}
async function getFetchUserAgent() {
// 무작위 사용자 에이전트로 HTTP 요청 생성
const response = await fetch("https://httpbin.io/user-agent", {
headers: {
"User-Agent": getRandomUserAgent(),
},
});
// 응답에서 기본 사용자 에이전트 읽기
// 그리고 출력
const data = await response.json();
console.log(data);
}
getFetchUserAgent();
스크립트를 3~4회 실행하세요. 통계적으로 아래와 같이 서로 다른 사용자 에이전트 응답을 확인하실 수 있습니다:

이는 사용자 에이전트 로테이션이 효과적으로 작동함을 보여줍니다.
자, 이제 Node.js에서 Fetch API를 사용해 사용자 에이전트를 설정하는 방법을 익히셨습니다.
결론
이 튜토리얼에서는 User-Agent 헤더를 설정해야 하는 이유와 fetch()에서 기본 Node.js 사용자 에이전트가 어떻게 보이는지 살펴보았습니다. 또한 이 값을 재정의하고 Node.js에서 사용자 에이전트 로테이션을 구현하여 기본적인 스크래핑 방지 시스템을 회피하는 방법도 알아보았습니다. 그러나 더 진보된 시스템은 여전히 자동화된 요청을 감지하고 차단할 수 있습니다. IP 차단 방지를 위해 Node.js에서 프록시를 구성할 수 있지만, 그것조차 항상 충분하지 않을 수 있습니다!
보다 강력한 해결책으로는 Web Scraper API를고려해 보세요. Node.js나 다른 기술을 사용한 자동화된 웹 요청을 간소화하는 차세대 스크래핑 서비스입니다. IP 및 사용자 에이전트 로테이션 같은 기능을 통해 안티 스크래핑 조치를 효과적으로 우회하여 웹 스크래핑을 그 어느 때보다 쉽게 만들어 줍니다.
지금 가입하여 프로젝트에 최적의 제품을 찾아보세요. 무료 체험을 시작하세요!