개요
웹 서비스를 한다면 크롤링을 알 수밖에 없을 것입니다.
자체적으로 API를 통해 공개하는 데이터 이외에도 아무 데이터나 긁어가 버리니 귀찮은 존재죠.
Captch나 자체적으로 로그를 쌓아서 이를 체크해서 막는 방법 등 각자의 노하우로 여러 가지가 있을 겁니다.
물론 막는 법을 잘 아는 게 중요하지만 공격 쪽 입장에서의 생각도 알면 더 좋겠다는 생각으로 정리해 봤습니다.
번외로 요즘은 합법적으로 토렌트처럼 분산 요청을 통해 Captch도 뚫어버리는 서비스도 있는데 참 신기합니다
1. User Agent
가장 쉽고 편하게 해 볼 수 있는 방법입니다.
Python + Selenium 기준으로 아래처럼 헤더라 User Agent를 추가하면 됩니다.
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch, br",
"Accept-Language": "en-US,en;q=0.8",
"User-Agent": "아래 링크서 정보 가져오기",
}
chrome_options = Options()
for key, value in headers.items():
chrome_options.add_argument(f"--{key}={value}")
# 브라우저 생성
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.naver.com/")
User Agent 값은 아래서 가져올 수 있습니다.
https://www.useragentstring.com/
빨간색으로 체크해 둔 부분의 문자열을 User-Agent에 넣으면 됩니다.
물론 이 값을 추가한다고 한 IP에서 많은 데이터 요청을 한다면 당연히 IP 차단을 당하게 됩니다.
2. 시간 조절
최대한 봇처럼 보이지 않게 딜레이를 추가하는 방법입니다.
랜덤 한 시간만큼 기다리는 코드를 추가하는 것이죠
3. Proxy
IP 차단을 당하지 않기 위해 자주 쓰는 방법 중하나입니다.
이전에는 인터넷 속도 향상이지만 요즘은 IP이 변경하는 도구로 자주 쓰입니다.
프로세스는 아래와 같습니다
- 사용자는 특정 주소로 Request 요청 (ex: seung.tistory.com을 주소창에 입력)
- 요청은 프록시 서버로 전달
- 프록시 서버는 해당 페이지를 가지고 있는지 검사
- 가지고 있다면 최신 버전인지 체크 후 갱신
- 가지고 있지 않다면 외부 회선을 통해 가져옴
- 프록시 서버는 사용자에게 Response로 반환
즉 처음에는 본인의 느린 회선 대신 속도가 빠른 프록시의 회선을 사용하고자 해던 게 목적이었지만
이론적으로는 빠르지만 프록시 서버를 거쳐야 하므로 속도가 오히려 느려진 상황이 발생했습니다.
지금은 CDN이 이 부분을 해결해 주기에 사용자들은 IP 세탁 용도로만 사용하고 있습니다.
종류
크게는 아래 두 종류로 나눌 수 있습니다.
포워드 프록시(Forwad Proxy)
주로 사용자들이 사용하는 걸로 일반적인 프록시 개념입니다.
사용자와 서버 사이에 위치하여 요청과 응답을 Proxy Server가 중재하는 것이죠.
이때 사용자를 가려주는 역할도 수행합니다
리버스, 프록시( Reverse Proxy)
포워드와 다르게 Proxy -> Internet이 아닌 Internet -> Proxy 구조로 서버들이 내부방으로 구성되어 있습니다.
서버는 오직 Proxy를 통해서만 연결할 수 있기에 기업에서 주로 사용하며 이를 통해 서버를 감추는 효과가 있습니다.
동작 방식에 따른 유형
아래 표를 보면 알 수 있듯이 안전하게 크롤링하려면 High Annoymity Proxy를 사용해하는 데 이는 곧 돈을 써야 합니다
이름 | 동작 방식 |
Transparent Proxy | HTTP 헤더의 HTTP_VIA, HTTP_X_FORWARD_FOR 영역에 원래 IP를 기입 |
Simple Annonymous Proxy | HTTP 헤더의 HTTP_VIA, HTTP_X_FORWARD_FOR 영역에 자신의 IP를 박아서 자신이 프록시임을 알림, 원래 IP는 제공하지 않음 |
Distorting Proxy | HTTP 헤더의 HTTP_VIA 영역에는 자신의 IP, HTTP_X_FORWARD_FOR 영역에는 랜덤 값을 기입해서 프록심을 알림, 원래 IP는 제공하지 않음 |
High Annoymity Proxy(Elite) | 사람과 동일하게 동작, 원래 IP 제공을 안함 (대부분 유료) |
추가적으로 프록시 판매 사이트를 가면 Residential, Data Center, ISP 등 여러가지 이름으로 판매하는데
각각의 특징은 다음과 같습니다.
- Residentail : 거주 IP로 실제 인터넷 회사(ISP)가 공급해주는 IP로 사람같지만 ISP나 DaterCenter보다 느리며 다른 사람과 공유 됨
- Data Center : 인터넷 회사(ISP)가 공급해주는 게 아니기에 막는 사이트가 많음
- ISP : 인터넷 공급 회사에서 제공하는고정 IP이기에 빠르지만 비싼 가격
4. VPN
Proxy와 더불어 IP 차단을 당하지 않기 위해 사용하는 방법으로
가설사설망이라는 이름처럼 외부에서 사내망에 접근하도록 가상으로 구성하는 것이기에 기술 자체는 익명성과 프라이버시가 목적이 아니기에 Proxy 보다는 크롤링에 맞지 않다고 볼 수 있습니다.
대신 VPN을 사용함으로써 실제 단말기의 IP를 숨길 수 있지만 다른 정보는 숨겨지지 않음
- 하드웨어 정보
- 쿠키
- 브라우저 핑거프린팅
- 계정정보
즉 VPN으로 IP 정보만 숨길 수 있지만 다른 정보들은 별도로 제어해야 합니다.
VPN은 단순히 아래 기능만 한다고 보는 게 좋습니다.
- 사용자 기준으로 사설망을 통해 VPN 서버와 터널링 되면 이를 오가는 패킷을 인터넷 제공 업체에서 볼 수 없음
- 인터넷 제공 업체는 사용자가 패킷을 VPN 서버로 보냈는 지만 알 수 있음
- IP 정보를 숨겨줌