개발

자바 스크립트로 에이전트 봇 검증하기

웹사이트는 일반 유저도 접근하는 곳이지만 봇도 접근하는 페이지이다.
원래 크게 문제가 없다면 굳이 유저와 봇의 페이지 차이를 줄 필요는 없긴하다만 상대적으로 유저 인터랙션이 많은 스크립트 페이지의 경우에는 스크립트 처리과정 자체가 봇에게는 의미가 없을수도있다.

특히 스크립트로 백단 api를 요청해 사용자에게 뭔가 정보를 보여주는 경우에는 이런 작업이 봇에게 필요가 없는 경우도 발생한다.
나같은 경우엔 페이지 조회수 1을 올리는 경우에 해당한다.

그럼 간단하게 접속자의 유저 에이전트를 조사해서 스크립트의 실행을 조건문으로 넣어두면 될것이다.
그 방법이 아래와 같다.

function isBot() {
    return /bot|crawl|spider|slurp|archive|preview/i.test(navigator.userAgent) || navigator.webdriver === true;
}Copy

겁나 간단하다.
자바스크립트단에선 navigator.userAgent 라는 객체 접근으로 쉽게 요청자의 유저 에이전트값을 가져올 수 있다.
이를 이용해 정규식을 사용해 특정 단어가 들어간 에이전트를 제외시키면 되는것이다.

더불어 사용자의 요청이아닌 프로그램에 의한 요청이면 navigator.webdriver 값이 true가 반환되는 경우도 발생하는데, 이 경우도 봇과 동급으로 취급할수도있다.


실제로 위 코드는 아래와 같이 응용할 수 있다.

window.addEventListener('load', function () {
    if(!isBot()) {
        hitPost(window.postId, window.isLoggedIn);
        initTOCEvent();

        onUserInteraction(() => {
            initComment();
            initPostVoyager(window.postId);
        });
    }
});Copy

이 코드는 내 포스팅 뷰 페이지의 온로드 스크립트인데 위 코드 자체가 사용자가 페이지를 볼때 조회수를 1올리고 목차 영역에 인터렉션을 추가하고 코멘트와 연관글을 가져오는 기능을한다.

이런 모든 작업이 굳이 사람이 아니면 진행할 필요가 없기때문에 위와같이 if문으로 감싸서 봇이 아닐경우에만 작동시키는 방식으로 처리할 수 있다.


이렇게 하면 앞단에서 쓸데없는 스크립트의 실행을 쉽게 막을 수 있어 페이지 랜더링 속도가 봇의경우 유의미하게 증가해 페이지 스피드 체크나 봇입장에서의 서버 부하를 극단적으로 줄일 수 있다.


#JavaScript
0 개의 댓글
×