크롤링에 대한 보안 기술

halfmoon_mind·2023년 6월 12일
2

개발

목록 보기
2/3
post-thumbnail

서론

분야

요즘 크롤링과 관련된 이슈가 많이 생겨나고 있다.

사람들은 방대한 정보 속에서 살아가고 있고, 자신의 원하는 데이터들을 한 번에 모아서 정제된 형태로 보고 싶어하는 경향이 있다. 이러한 배경에서 크롤링을 통해 자신이 수집하고 싶은 데이터를 저장하고 싶어하는 욕구는 크게 늘어나고 있다.

지난 1년간 “Crawling”에 대한 구글 트랜드 결과. 하루에 평균적으로 꾸준히 90회 이상의 검색이 존재하였다.

크롤링(crawling)이란 웹사이트, 하이퍼링크, 데이터, 정보 자원을 자동화된 방법으로 수집, 분류, 저장하는 것입니다. 보통 파이썬을 이용한 Requests를 자동화 하거나 자동화된 입력을 해주는 Selenium과 같은 툴을 사용하여 데이터를 수집하거나, 스파이더 같은 프로그램을 사용하여 웹페이지에 검색에 대한 인덱싱을 수행된다.

2022년에는 여행·숙박 어플리케이션 운영사 ‘여기어때’가 경쟁업체 ‘야놀자’의 데이터를 숙박업소 정보를 무단으로 유출해가며 ‘여기어때’에게 10억원 배상을 하라는 판결이 나오기도 하였다.

동기

데이터를 실제 유저가 서비스를 이용하기 위해 데이터를 요청하는 것이 아니라 단순히 데이터를 수집하기 위한 목적, 혹은 특정한 작업을 자동화 하기 위한 수단으로 사용된다. 이러한 경우 대부분 대용량의 쿼리를 서버에 한 번에 보내게 되어 서버에 큰 부담을 주게 된다.

하지만 이를 막기 위해 많은 조건이나 제약을 걸게 되면 사용자가 불편함을 느끼거나, 이것을 처리하는 과정이 더 많은 자원이 소모될 수도 있기 때문에 사용자의 불편함을 최소화하면서 서버 부담을 줄일 수 있는 기술이 필요함을 인지하게 되었다.

목적

봇이나 크롤러가 아닌 것을 인증하는 것에 사용자의 불편함을 최소화 하면서, 서비스에서 주요한 지적 재산권을 침해당하지 않고 서비스 제공자 입장에서 봇이나 크롤러에 의해 서버에 부담이 가는 것을 최소화 할 수 있는 방법을 고안하고자 하였다.

그리고 크롤링 차단 방법을 이미 시행하고 있는 기업에 대해서 연구하여 해당 기업들이 어떠한 방식으로 자신들의 지적 재산권을 지키고 서비스를 유지하는지 연구하였다.

이를 통해 추후에 관련된 서비스를 운영하는 경우에 해당 연구를 했던 경험을 기반하여 보안 및 봇에 대한 대비를 하여 개선된 API 및 아키텍쳐를 구상할 수 있을 것이다.

연구 방법

유저들이 존재하는 서비스가 있어 실제로 어떠한 방법을 통해 주로 크롤링 해가는지 로그를 확인해보면서 알아가는 방식이 가장 유효하지만, 본 연구자는 이러한 서비스를 갖고 있지 않으며, 그러한 데이터들은 서비스 운영측의 내부 데이터로만 존재할 것으로 예상하였다.
따라서 해당 크롤링 과정을 서비스 제공자 입장이 아니라, 유저 입장에서 데이터를 수집하기에 얼마나 어려운가에 대해서 조사하기 위해 직접 관련된 사이트들을 크롤링 시도해보거나 크롤링을 해본 경험이 있는 컴퓨터 관련 전공자들의 설문을 받아 진행하였다.

설문조사 대상 - 숭실대학교 IT대학 관련 학생
설문조사 기간 - 2023.05.22. ~ 2023.06.04
설문조사 인원 - 40명

본론

크롤링이란?

크롤링(crawling)이란 웹사이트, 하이퍼링크, 데이터, 정보 자원을 자동화된 방법으로 수집, 분류, 저장하는 것을 칭한다. 보통 파이썬을 이용한 Requests를 자동화 하거나 자동화된 입력을 해주는 Selenium과 같은 툴을 사용하여 데이터를 수집하거나, 스파이더 같은 프로그램을 사용하여 인덱싱을 수행된다.
크롤링은 검색 엔진이 웹 페이지를 수집하고 색인화하여 사용자의 검색 쿼리에 가장 적합한 페이지를 찾아주는 데 사용됩니다. 이 외에도 데이터 분석, 웹 마이닝, 데이터 마이닝 등에도 크롤링이 사용된다.

robots.txt

크롤링 기술이 악용되어 정보를 무단으로 복제하게 되면 지식재산권 침해 문제가 발생할 수 있다. 이러한 경우를 사전에 방지하기 위해 웹 페이지 소유자는 웹 페이지에 로봇 배제 표준을 사용하여 접근 제한에 대한 설명을 robots.txt에 기술한다. 하지만 이러한 노력에도 robots.txt에 명시된 부분 이상으로 데이터를 수집하는 경우가 비일비재하다.

robots.txt

구글에 대한 robots.txt 문서. 어떠한 URI로 봇으로 접근이 가능하고, 아닌지를 명시하여 지적 재산권을 지킨다.

robots.txt에 대한 인식 조사를 진행하였을 때, 응답자의 31.7%(13명)가 robots.txt에 대해서 모르는 것을 확인하였다. 또한 크롤링을 해본 유저의 52.5%(21명)이 robots.txt에 명시된 수집 범위 이상으로 데이터를 수집해본 경험이 있었다.

이를 통해 크롤링을 시도한다면 많은 경우에 robots.txt에 기재된 범위 이상으로 데이터를 수집한다고 보여진다.


크롤링 하는 방식

여기서 서술하는 크롤링 방식은 기업에서 공개된 Open API(Meta의 GraphAPI, 카카오의 Kakao API 등)를 사용하는 것이 아닌, 유저가 원하는 데이터를 자동화하여 수집하는 방법을 말한다.
다음에서 소개하는 방법 이외에도 다양한 방법으로 데이터를 수집할 수 있지만, 주요하고 많이 사용하는 크롤링 방식에 대해서 소개하였다.

  • Google Bot과 같은 spider류

웹 사이트를 방문한 뒤, 데이터를 얻기 위해 다른 페이지에 대한 링크를 반복적으로 따라 들어간다. 특정 데이터를 얻기위해 필요한 대상을 크롤링하고, 페이지로부터 원하는 데이터를 추출할 수 있도록 HTML parser를 함께 사용하게 된다. 주로 검색엔진의 인덱싱을 위해 사용되는 방식이다.

  • Shell-script

Shell-script는 주로 Unix도구를 이용하여 크롤링을 시도할 때 사용된다. 주로 curl 또는 wget 명령어를 사용하여 웹 상의 데이터를 가져온다. 가져온 데이터에서 특정한 조건을 grep과 같은 텍스트 처리 도구를 사용하여 HTML을 파싱하여 정보를 가공한다. http 요청에서 추출된 데이터를 기반으로 정규식(regex)를 이용하여 원하는 데이터를 추출할 수 있다.

curl 명령을 통해 www.google.com에 요청을 보내본 예제.

  • jsoup, scrapy, Beautifulsoup 등 HTML parser

Shell-script 정규 표현식 기반으로 된 도구들과 유사하게, HTML내의 패턴을 기반으로 해서 페이지 내의 데이터를 추출할 수 있다. 파이썬의 경우 주로 Requests나 Selenium과 같은 라이브러리와 결합하여 특정한 조건의 HTML 태그 내부 정보를 수집하는 형태로 많이 사용된다.

Selenium과 BeautifulSoup을 결합하여 대학교 시간표 데이터를 가져오는 예제 코드.

  • Selenium과 같은 가상 브라우저 웹 브라우저의 자동화를 가능하게 하는 도구로 Javascript, AJAX와 같은 요소들을 실행하고, 웹 페이지로부터 원하는 텍스트를 수집하기 위해 주로 사용되고 있다.
    작동하는 방식은 페이지가 로드되고 자바스크립트가 실행된 후, 브라우저에서 HTML을 가져온 다음 BeautifulSoup과 같은 HTML 구문 분석기를 사용하여 원하는 데이터 또는 텍스트를 추출한다. 혹은 렌더링된 페이지의 스크린 샷을 만들고, OCR을 사용하여 스크린샷으로부터 원하는 텍스트를 추출하기도 한다.
    단, Selenium은 웹 브라우저 인스턴스를 실제로 실행하기 때문에 다른 HTTP 라이브러리나 웹 크롤링 라이브러리에 비해 더 많은 리소스를 사용하고 속도가 느리다.
  • 사람이 수행하는 복사와 붙여넣기 사람이 직접 웹사이트에 방문해서 서비스 내부의 컨텐츠를 복사하고 붙여 넣을 수 있다. 인건비가 싼 나라에서 이러한 방법을 사용하여 적용할 수 있을 것이다.

크롤링을 효과적으로 막았다는 조건

보고서에서 정의하는 크롤링을 효과적으로 막는다는 것은 다음과 같은 조건에 해당된다는 것으로 한다.

  • Requests만으로는 작동되지 않거나 일부 데이터만이 수집 가능하여 Selenium으로만 작동이 가능한 경우

Selenium을 사용 시 CPU와 Memory 사용량. Python의 Requests 라이브러리를 사용하는 경우 CPU나 메모리 사용량은 획기적으로 감소한다.

웹 브라우저를 띄우는 Selenium을 사용하는 방식을 사용하는 경우 높은 자원 소모와 단순한 requests보다 적게는 2~3배, 많게는 100배 이상의 속도 차이와 압도적인 메모리 사용량 때문에 Selenium을 사용하게 하는 것 자체만으로 큰 단위의 요청을 못하게 할 수 있다.

사이트들을 크롤링하기 가장 어려웠던 이유는 Selenium과 같은 브라우저를 띄워야하는 것으로 확인되었다.

  • 스크롤이 될 때마다 특정한 Javascript의 함수가 실행되어 실제 브라우저 혹은 자동화된 실행을 거부하는 경우

데이터를 지속적으로 특정 Javascript 함수가 실행되어 특정 쿠키나 헤더에 추가된 인증 요건이 추가되어야 정상적인 응답이 도착하는 경우이다.

해당 로직을 모두 알고 있어야 정보를 수집할 수 있어, 크롤링하는 측에서 이를 해결하기 위해 많은 자원을 사용해야 한다. 또한 인증과 관련된 정보를 주기적으로 변경하는 경우에는 크롤링하는 측에서도 해당 방식을 알아내기 위해 지속적인 자원을 소모해야 하는 경우에도 효과적으로 막았다고 해당할 수 있다.

  • HTML 태그나 구조가 자주 변경되어 완전한 자동화가 되지 않고, 크롤링하는 측에서도 지속적인 인적자원을 소모해야하는 경우

이러한 경우에는 지속적으로 변경되는 값을 확인하기 위해서 인원들이 크롤링 서비스를 유지보수하고 있어야하고, 아예 구조가 변경되는 경우에는 크롤링 로직을 아예 다시 짜야함으로 서비스의 지적 재산권이나 크롤링 하는 측의 막대한 분량의 요청에 대해서 요청 자체에서 빠르게 제한할 수 있다.

크롤링을 막는 방법

데이터를 사용자에게 제공하는 IT 관련 기업들은 이미 이러한 크롤러에 대한 방어를 위한 대책이 잘 되어 있다.

따라서 주요하게 크롤링을 방지하는 방법들을 소개하고, 기업들에서는 실제로 해당 기술을 어떻게 적용하고 있는지에 대해서 조사하였다.

  • 로그와 트래픽 패턴 감시를 통한 비정상적인 활동에 대한 접근 제한

비슷한거나 같은 IP 주소로부터 많은 수의 유사한 작업을 수행하는 계정 혹은 요청이 발생할 경우, 이를 크롤러를 이용한 자동화된 접근을 나타내는 비정상적인 활동으로 인지하고 접근을 차단하거나 속도를 제한할 수 있다.

Too Many Requests에 해당되는 HTTP error 429

예를 들어 특정 IP 주소 또는 사용자로부터 초당 몇번만의 검색을 허용하는 방식으로 제한할 수 있다. 이런 제한을 하는 경우 크롤러의 속도가 느려지고, 작업을 위한 효율성이 떨어지게 됩니다. 이 경우에는 실제 유저가 속도 제한이 걸리거나 접근이 제한되지 않을 정도의 상한선 조정이 필요하다.

이것을 차단하는 경우 클라우드 서비스를 사용하는 크롤러도 효과적으로 방지할 수 있다. 클라우드 서비스로 크롤링을 시도하는 경우, 다른 크롤러들이 해당 서비스에 대해서 크롤링을 이미 시도했다면 IP 주소가 유사하기 때문에 다른 크롤러의 사용을 효과적으로 차단할 수도 있을 것이다.

인스타그램

인스타그램의 경우 댓글은 약 200회, 좋아요는 약 1000회 이상의 요청을 하루 내에 보내는 경우나 계정당 1시간에 5000회의 HTTP Requests를 요청한 경우에도 나중에 다시 시도하세요 창이 뜨면서 크롤링 작업이 중지 되는 것으로 확인하였다.

Facebook이 스크래핑에 대처하는 방법
스크래핑을 보다 어렵게 만드는 첫 번째 방법은 실행 횟수와 데이터 제한입니다. 실행 횟수 제한은 주어진 시간 동안 Facebook 제품을 활용할 수 있는 횟수의 제한을 뜻하며, 데이터 제한은 저희 제품을 정상적으로 이용하는 데 필요한 양보다 더 많은 데이터를 얻지 못하도록 합니다.
스크래핑 용의자의 활동을 조사하고 파악함으로써 Facebook 시스템을 강화하며, 현재까지 데이터 오용에 대한 다양한 조치를 취했습니다. 대표적인 조치로는 중지서한 발송계정 비활성화, 악의적 목적으로 스크래핑에 가담하는 스크래퍼에 대한 소송 제기, 스크래핑된 데이터를 호스팅하는 회사에 대한 삭제 요청 등이 포함됩니다. 정부 차원에서 불법 스크래핑 행위를 조사하고 조치를 취해야 하는 이유이기도 합니다.

  • Captcha

    웹 서핑을 하다보면 한번쯤 마주치는 Captcha. 통과하기 어려워 사용자 경험을 크게 저하한다.

로봇이나 스크립트 등 자동화된 방식으로 접근하는 것을 방지하고, 인간 사용자만이 웹 사이트나 애플리케이션에 접근할 수 있도록 보안을 강화한다. 이를 통해 API를 찾아서 Request를 통해 데이터를 받아오는 것 뿐만 아니라 Selenium과 같은 가상 브라우저를 작동하여 데이터를 저장하는 크롤러에 대해서도 크게 효과적이다. 또한 OCR을 통해 이미지나 텍스트를 자동으로 읽어내는 공격을 방지하는 데 도움을 준다.

하지만 Captcha를 도입하는 것 자체가 사용자 경험을 크게 저하하게 된다. 도입 이후에 이를 통과하는 부분 또한 서비스 이용자의 경험을 크게 해칠 수 있다

  • 사용자 등록 및 로그인 요구

웹 사이트에서 계정을 생성하고, 로그인하도록 요구하는 경우, 사용자와 크롤러의 작업을 정확하게 추적할 수 있다. 이 방식의 경우 특정 계정이 크롤링에 이용되는지를 쉽게 감지하고 차단할 수 있다.
단순히 IP 주소를 이용하는 것 대신 크롤링 계정의 동작을 식별할 수 있으며, 속도 제한이나 짧은 시간동안에 수행되는 많은 수의 검색과 같은 잘못된 사용의 검출이 매우 쉬워질 수 있다.

계정으로만 유저를 구분하는 경우 여러 개의 계정을 번갈아가면서 동작하는 크롤러의 경우에는 막기 어려울 수 있다. 따라서 위에 작성한 IP 기반 요청 제한과 계정 기반 요청 제한을 같이 사용한다면 더욱 효과적으로 막을 수 있을 것이다.

또한 로그인을 강제한다면 실제 사용자가 서비스를 이용하는 부분에서 불편함이 생기거나 SEO(검색 엔진 최적화)에 나쁜 영향을 줄 수 있다.

  • Cloud-hosting 및 VPN 서비스 IP 주소 접근 차단

전문적으로 크롤링을 하거나, 동일 IP 접속을 회피하기 위해 AWS 또는 Google app-engine과 같은 웹 호스팅 서비스 또는 VPS 들에서 실행될 수 있다. 이런 종류의 서비스에서 이용하는 IP 주소에서 발생한 요청에 대해서는 웹 사이트 접속을 차단할 수 있다.
이러한 클라우드 호스팅 서비스의 경우에는 비슷한 IP 주소를 사용하는 경우가 많아, 위에서 설명했듯 비슷한 IP에 요청 제한을 둔다면 효율적으로 크롤링을 제한할 수 있다.

  • 컨텐츠의 텍스트를 이미지로 제공

서비스에서 사용하는 정보, 텍스트나 여러 데이터들을 이미지 서버 측에서 렌더링하여 이미지로 정보들을 보내준다. 이러한 경우에는 이미지 자체로 데이터를 제공하기 때문에 크롤러가 텍스트를 추출하는데 방해하거나 저해하는 방법이 될 수 있다.

하지만 제공해야하는 네트워크 비용이 훨씬 커져야 하고, 데이터를 보고 싶어 하는 실제 유저의 편의성이 크게 떨어지고, 검색엔진 최적화가 불가능한 부분이 있다. 또한 일부 크롤러들은 OCR로 우회할 수도 있습니다.

  • 제공하는 이미지를 변형

이미지 내의 순서를 변경하여 순수하기 API 요청만 보내어 이미지 데이터를 받아보는 경우에 읽기 어려운 정보를 제공할 수 있다.

만화 공유 사이트에 API 요청만 한 경우. 제대로된 정보가 보이지 않는다.

해당 이미지를 서버에서 받는 순간에는 해당 이미지가 셔플되어서 도착하기 때문에 이미지 자체를 보는 API요청 만으로는 이미지를 제대로 볼 수 없다. 하지만 해당 이미지를 프론트엔드에서 받아오면서 특정 JavaScript 함수를 실행함으로 다시 원래 이미지로 복원하는 방식을 사용할 수 있다.

  • 웹 사이트 HTML 구조를 자주 변경

해당 방법은 서버에서 작업들을 수행하여 HTML 자체를 보내주는 SSR(Server Side Rendering) 방식에서 크게 유효하게 작동할 수 있다.

웹 사이트에서 사용하는 HTML의 각 요소의 ID와 클래스가 자주 변경하거나, 혹은 자동으로 변경되도록 한다. 이 경우에는 기존의 ID나 클래스 이름으로 데이터를 찾던 크롤러가 작동하지 않고, 서비스 제공자쪽에서 데이터를 바꿀 때마다 다시 동작하도록 설정해야 한다.

숭실대학교 u-saint

같은 데이터를 요청하는 태그를 찾아도, 다른 세션 및 탭에서 이를 요청할 시에 id값이 다르게 확인되는 것을 확인할 수 있다.

  • 쿠키나 헤더를 사용해 인증 로직 추가

자바스크립트를 사용하여 쿠키를 설정하고 검색하면 자바스크립트를 실행하지 않는 크롤러는 요청과 함께 쿠키를 보낼 수 없으므로 크롤러를 차단할 수 있다. 만약 쿠키나 헤더를 추가하는 로직을 만들 수도 있지만 관련된 정보를 찾기 위해서 많은 인적 자원이 소모됩니다.
예를 들어 어느 정도 스크롤을 하거나 특정한 버튼을 누른다면 헤더나 쿠키를 추가하여 추후 데이터 요청에는 관련된 데이터가 있어야 응답하고, 아니라면 응답을 거절하는 상황이 있을 수 있다.

네이버 쇼핑

동일한 URL에 대한 요청이지만, API 요청이 일어난 URL에 GET 요청을 보낸 것과 실제 사이트의 네트워크에서 찍히는 데이터가 다르게 요청만 보낸 경우에는 401 Unauthorized 응답이 도착했다. 인증과 관련된 쿠키 정보가 있어야 정보를 받아올 수 있는 것으로 확인되었다.

  • 마크업, 스크립트로부터 네트워크 요청에 대한 난독화

네트워크 요청에서 데이터를 직접적으로 볼 수 있다면 페이지 혹은 데이터에 대한 API 명세가 전부 드러나는 형태가 된다.
따라서 네트워크 요청이 발생하더라도 서버측에서 데이터를 보내줄 때, 이를 난독화하여 클라이언트에게 전송하고, 클라이언트는 해당 데이터를 사이트 내부에 숨겨진 특정 Javascript 함수를 실행하여 이를 다시 복호화하여 유저에게 정보를 보여주는 방식을 사용할 수 있다.
크롤링하는 측에서 해당 데이터를 보고 싶다면 난독화된 데이터를 다시 복호화하는 작업을 거쳐야 크롤러가 작동할 수 있어, Javascript를 실행하지 않는 HTML 파서 기반 크롤링 방식에 대응하기 매우 효과적이다.

숭실대학교 u-Saint

유세인트의 강의시간표에서 “다음학기” 버튼을 눌렀을 때 도착한 응답. 해당 요청이 어떤 데이터를 불러오고, 새롭게 저장하는지 네트워크 도구에서 보기 어렵다.

결론

연구해본 기업들에서는 모두 하나의 크롤링 방지 기술만을 사용하는게 아니라, 다양한 방지 기술을 복합적으로 사용하는 것으로 확인되었다. 특히 인스타그램의 경우 쿠키를 통한 인증 추가, 응답 요청 수 제한, Captcha 등 다양한 방지 기술을 구현한 것으로 확인되었다.

전체 47.4%의 응답자(18명)가 인스타그램을 크롤링하는게 제일 어려웠다고 대답하였다. (중복 허용)

하나의 서비스에 대해서 완벽하게 막는 것은 불가능에 가깝다. 데이터 수집이 필수적인 상황에 놓인다면 사람을 고용하여 자동화가 안되더라도 직접 사람이 모든 요청을 브라우저에서 보내고 복사/붙여넣기를 수행하는 방법도 존재하기 때문이다.
또한 너무 많은 크롤링 방지 기술을 사용하는 경우에는 오히려 방지 기술을 유지하고 정상적인 서비스 운영하는 데에 더 큰 간접 비용(Overhead)가 발생할 것이다.

따라서 자신이 제공하고 있는 서비스에서 제공하는 정보가 얼마나 중요한가를 고려해봐야 한다. 크롤링하기 가장 어려웠던 인스타그램의 경우 자신의 서비스 내부 데이터들이 큰 자산이고, 내부 데이터로 서비스가 운영되는 부분이니 크롤링을 막는 것에 큰 노력을 기울인다고 보여진다. 만약 자신의 서비스가 봇이나 크롤러에게 수집되면 민감하거나 주요한 지적재산권이 침해된다고 생각되면 본 보고서에서 작성된 여러 크롤링 방지 대책을 사용하여 수집을 막을 수 있을 것이다.

레퍼런스

profile
Do My Best

2개의 댓글

comment-user-thumbnail
2023년 6월 12일

좋은 글 감사합니다!

1개의 답글