리뷰 서비스 개발 중, 리뷰에 관련한 써드파티 API를 사용하는데 있어서
문서의 내용 중에 구글 봇이 해당 컨텐츠를 크롤링 할 수 없도록 처리해야한다고 명시되어있었다.
크롤링을 처리하는 방법에는 여러가지 방법이 있지만 동적으로 데이터를 로드하거나 User-Agent를 판별하여 호출하는 방법 둘 중 하나를 선택하기로 하였다.
클라이언트 측에서 동적으로 데이터를 로드하도록 설정하여 접근을 방지, 혹은 클라이언트 측에서 이벤트가 발생 했을 때 데이터를 호출하여 크롤링을 방지하는 방법이있다. 하지만 최근에는 JavaScript를 해석하는 크롤러도 많아지고 있어 해당 방법은 사용하지 않았다.
User-Agent 를 판별하여 해당 User-Agent가 bot 혹은 crawl 관련이라면 api 호출을 막는 방법이 있는데, 구글 봇은 크롤링할때 User-Agent를 Googlebot으로 요청한다고 명시되어 있기에, 필자는 해당 방법을 선택하도록 하였다.
❗주의해야 할것은 어디까지나 User-Agent는 클라이언트가 서버에 요청할때, 요청헤더를 변경하여 요청할 수 있으므로 User-Agent만을 판별하여 접근을 제어하는 것은 한계가 있다는 것은 꼭! 알아두어야 한다.
필자는 정규식을 사용하여 크롤링을 방지할 요청 헤더의 User-Agent를 명시해 놓고, 해당 정규식에 포함이 된다면 API호출을 하지 않도록 구성하였다.
const AgentUtils = {
// 웹에서 크롤링이 되면 안되는 영역이 있을 경우 user agent 를 판별하여 봇인지를 판별하는 함수.
detectRobot(userAgent) {
/**
* Checks if a given userAgent string belongs to a bot or web crawler.
* @param {string} userAgent // string type
* @returns {Number} // return 값은 boolean
*/
const robots = new RegExp(
[
/bot/,
/crawl/,
/APIs-Google/,
/AdsBot/,
/Googlebot/,
]
.map((r) => r.source)
.join('|'),
'i',
);
return robots.test(userAgent);
},
};
const getReviewList = async (productIdx) => {
const isCrawlingBot = AgentUtils.detectRobot(navigator.userAgent); // User-Agent를 기반으로 봇 탐지
if (isCrawlingBot) return; // 봇인 경우 API 호출을 중지
try {
// 봇이 아닌 경우에만 리뷰 데이터 가져오기
const { data: reviewResponse } = await axios.get(`/api/reviews?productIdx=${productIdx}`);
return reviewResponse;
} catch (error) {
console.error("Failed to fetch reviews", error);
}
}