본문 바로가기

HTTP 완벽 가이드 책 정리

9장. 웹 로봇

웹 로봇

사람과의 상호작용 없이 연속된 웹 트랜잭션들을 자동으로 수행하는 SW 프로그램

웹 사이트들을 떠돌아다니며 컨텐츠를 가져오거나, 하이퍼링크 따라가고, 데이터를 처리하는 등의 기능을 수행

👉 방식에 따라 '크롤러' '스파이더', '웜', '봇' 등으로 불림

9.1 크롤러와 크롤링

웹 크롤러: 웹 페이지를 한 개 가져오고, 그 다음 페이지가 가리키는 모든 웹 페이지를 가져오는 일을 재귀적으로 수행하는 로봇

👉 한마디로 크롤러는 웹 링크를 재귀적으로 따라가는 로봇

💡 crawl: 기어가다

인터넷 검색엔진은 크롤러를 통해 문서를 수집해 이를 검색 가능한 데이터베이스로 만든다.

👉 특정 단어를 포함한 문서를 찾을 수 있게 해줌

9.1.1 어디에서 시작하는가: '루트 집합'

루트 집합(root set): 크롤러가 방문을 시작하는 URL들의 초기 집합

루트 집합은 모든 웹페이지를 방문할 수 있도록 짜여져야 한다.

일반적으로 좋은 루트 집합은 인기 있는 웹 사이트, 새로 생성된 페이지들의 목록, 자주 링크되지 않는 잘 알려져 있지 않은 페이지들의 목록으로 구성

루트 집합은 시간이 지남에 따라 변경되며 새로운 크롤링을 위한 시드 목록이 된다

9.1.2 링크 추출과 상대 링크 정상화

크롤러는 웹을 돌아다니며 HTML 문서를 검색하고 검색한 페이지 내의 URL 링크들을 파싱해 크롤링할 페이지 목록에 추가한다. 페이지 목록은 급속히 커지게 되고 크롤러들은 HTML 파싱을 간단하게 하기 위해 URL 링크의 상대 링크를 절대 링크로 변환할 필요가 있다

9.1.3 순환 피하기

로보시 크롤링 과정에서 무한루프에 빠지는 과정

  1. 로봇은 페이지 A를 가져와 B가 A에 링크되어 있는 것을 보고 B를 가져옴
  2. 로봇은 페이지 B를 가져와 C가 B에 링크되어 있는 것을 보고 C를 가져옴
  3. 페이지 C를 가져와 A가 C에 링크돼 있는 것을 봄. 여기서 로봇이 A를 가져오게 되면 A, B, C,...를 계속 가져오게 됨

로봇들은 무한루프를 피하기 위해 어디를 방문했는지 알아야 함

👉 DFS, BFS에서 visited 사용하는 것과 같은 개념

9.1.4 루프와 중복

무한루프의 문제점

  1. 크롤러가 무한루프에 빠지면 다음 동작이 진행되지 않는다.
  2. 크롤러가 같은 페이지를 반복해서 가져오면 웹 서버에 부하가 온다.
  3. 무한루프 자체가 문제가 되지 않더라도, 크롤러는 많은 수의 중복 페이지를 가져온다.

9.1.5. 빵 부스러기의 흔적 

규모가 큰 웹 컨텐츠를 크롤링하기 위해선 많은 양의 URL을 방문해야 하며 방문 정보를 모두 저장하는 것은 쉽지 않다. 대규모 웹 크롤러가 방문한 URL을 관리하기 위해 사용하는 기법에 대해서 알아보자.

 

트리와 해시 테이블

방문 URL을 빠르게 추적하기 위해 자료 구조로 검색 트리나 해시 테이블이 사용됨

 

느슨한 존재 비트맵

공간 사용을 최소화하기 위해 몇몇 대규모 크롤러들은 비트 배열(presence bit array) 자료 구조를 사용. 

각 URL은 해시 함수에 의해 고정된 크기의 숫자로 변환되고 배열 안에 대응하는 '존재 비트(presence bit)'를 갖는다.

URL이 크롤링 되면 존재 비트가 만들어지는데, 이미 존재 비트가 있으면 크롤러는 그 URL은 이미 크롤링 됐다고 간주함

 

체크포인트

로봇 프로그램이 갑자기 중단될 경우를 대비해 방문한 URL의 목록이 디스크에 저장됐는지 확인한다

 

파티셔닝

웹이 커지면서 로봇은 서로 커뮤니케이션을 하며 동작하게 됨. 각 로봇에 URL들의 특정 '한 부분'이 할당돼 그에 대한 책임을 지는 형태. 로봇들은 URL을 넘겨주거나, 오동작하는 동료를 도와주거나 하며 커뮤니케이션을 통해 유기적으로 연결됨

9.1.6 별칭(alias)과 로봇 순환

한 URL이 다른 URL에 대한 별칭이라면 둘의 형태는 달라보여도 같은 리소스를 가리키고 있을 수도 있다

9.1.7 URL 정규화하기

웹 로봇은 URL을 표준 형식으로 정규화해 다른 URL과 같은 리소스를 가리키는 것들을 제거한다

 

URL 정규화 형식 변환 과정

  1. 포트 번호가 명시되지 않았다면 호스트 명에 ':80' 추가
  2. 모든 %xx 이스케이핑된 문자들을 대응되는 문자로 변환
  3. # 태그 제거

URL 중복을 피하기 위해 추가로 웹 로봇이 알아야 할 정보

  1. 웹 서버의 대소문자 구분 여부를 알아야 한다
  2. 디렉터리에 대한 웹 서버의 색인 페이지 설정을 알아야 한다
  3. 확인하려는 두개의 URL이 있을 때, 첫번째 URL의 호스트명과 두번째 URL의 IP 주소가 같은 물리적 컴퓨터를 참조하는지, 웹 서버가 가상 호스팅을 하도록 설정돼있는지 알아야 함

URL 정규화를 통해 모든 문법의 별칭을 제거할 수 있는 것은 아니다

9.1.8 파일 시스템 링크 순환

파일 시스템의 심벌릭 링크는 끝없이 깊어지는 디렉터리 계층을 만들 수 있다.

👉 교묘한 종류의 순환이 유발됨

 

심벌릭 링크 사이클의 예시

웹 크롤러가 a의 파일 시스템을 사용해 동작하는 과정

  1. GET http://www.foo.com/index.html 👉 /index.html을 가져와 subdir/index.html로 이어지는 링크 발견
  2. GET http://www.foo.com/subdir/index.html 👉 subdir/index.html을 가져와 subdir/logo.gif로 이어지는 링크 발견
  3. GET http://www.foo.com/subdir/logo.gif 👉 subdir/logo.gif를 가져오고 더 이상 링크가 없으므로 여기서 완료 

웹 크롤러가 b의 파일 시스템을 사용해 동작하는 과정

  1. GET http://www.foo.com/index.html 👉 index.html을 가져와 subdir/index.html로 이어지는 링크 발견
  2. GET http://www.foo.com/subdir/index.html 👉 subdir/index.html을 가져왔지만 같은 index.html로 되돌아감
  3. GET http://www.foo.com/subdir/subdir/index.html 👉 subdir/subdir/index.html을 가져옴
  4. GET http://www.foo.com/subdir/subdir/subdir/index.html 👉 subdir/subdir/subdir/index.html을 가져옴

🔥 subdir/이 /로 링크되기에 루프에 빠지게 됨, URL은 달라 보이기 때문에 로봇은 URL만으로 문서가 같다는 것을 알아챌 수 없음

9.1.9 동적 가상 웹 공간

악의적인 웹 마스터가 의도적으로 복잡한 크롤러 루프를 만들어 낼 수도 있다.

이 예시로 평범한 파일처럼 보이는 게이트웨이 애플리케이션인 URL을 만들어 내는 것이다.

게이트웨이는 다음 페이지를 가리키는 가짜 웹페이지를 동적으로 무한히 생성해 로봇이 무한루프에 빠지게 한다.

또한, 웹 마스터가 자신도 모르게 심벌릭 링크나 동적 컨텐츠를 통한 크롤러 함정을 만드는 경우도 있다.

9.1.10 루프와 중복 피하기

웹에서 로봇이 올바르게 동작하기 위한 기법

  1. URL 정규화
    • URL을 표준 형태로 변환해 같은 리소스를 가리키는 중복된 URL이 생기는 것을 방지한다
  2. 너비 우선 크롤링 
    • 방문할 URL들을 너비 우선으로 스케줄링해 순환의 영향을 최소화한다
    • 만일, 함정을 건드리게 되더라도 무한루프에 들어가기 전에 이미 스케줄링 돼 있는 웹 사이트들에서 페이지들을 많이 받아올 수 있다
  3. 스로틀링
    • 로봇이 웹 사이트에서 일정 시간 동안 가져올 수 있는 페이지의 숫자를 제한한다
  4. URL 크기 제한
    • 로봇은 일정 길이를 넘는 URL의 크롤링을 거부할 수 있음
    • 해당 기법이 적용되면 정상 컨텐츠를 가져오지 못하는 경우도 생김
    • 요청 URL이 특정 크기에 도달할 때마다 에러 로그를 남긴다
  5. URL/사이트 블랙리스트
    • 로봇 순환을 만들거나 함정인 사이트와 URL 목록을 만들어 관리
    • 블랙리스트는 크롤링 되는 것을 싫어하는 특정 사이트를 피하기 위해 사용될 수 있음
  6. 패턴 발견
    • 파일 시스템의 심벌릭 링크를 통한 순환과 비슷한 오설정들은 일정 패턴을 따르는 경향이 있다
    • 로봇은 다른 주기의 반복 패턴을 감지함으로써 크롤링을 거절할 수 있다
  7. 콘텐츠 지문
    • 콘텐츠 지문을 사용하는 로봇들은 페이지의 콘텐츠에서 몇 바이트를 얻어내 체크섬을 계산
    • 체크섬은 해당 페이지 내용의 간략한 표현임
    • 로봇이 이전에 봤던 체크섬을 가진 페이지를 가져오면 해당 페이지의 링크는 크롤링하지 않음
    • 어떤 웹 서버는 동적으로 페이지를 수정하기에 로봇들은 특정 부분을 체크섬 계산에서 빠뜨림
    • 서버 측의 동적인 동작은 중복 감지를 방해하게 됨
  8. 사람의 모니터링
    • 결국 로봇 스스로 문제를 해결할 수 없을 때에는 사람이 모니터링함

9.2 로봇의 HTTP

9.2.1 요청 헤더 식별하기

로봇 대부분은 신원 식별 헤더(특히 User-Agent HTTP 헤더)를 구현하고 전송함.

보통 로봇의 능력, 신원, 출신을 알려주는 헤더를 사이트에게 전송

👉 이는 잘못된 크롤러의 소유자를 찾을 때, 서버에게 로봇이 어떤 컨텐츠를 다룰 수 있는지 알려줄 때 유용한 정보

 

기본 신원 식별 헤더

  1. User-Agent: 서버에게 요청을 만든 로봇의 이름을 말해줌
  2. From: 로봇의 사용자/관리자의 이메일 주소 제공
  3. Accept: 서버에게 어떤 미디어 타입을 보내도 되는지 알려줌
  4. Referer: 현재의 요청 URL을 포함한 문서의 URL을 제공

9.2.2 가상 호스팅

가상 호스팅이 널리 쓰이기 때문에 로봇의 요청에는 Host 헤더를 포함해야 함

👉 로봇이 URL에 대해 잘못된 컨텐츠를 찾을지도 모르기 때문

Host 헤더를 포함하지 않은 크롤러가 두 개의 사이트를 운영하는 서버에 요청을 보낼 경우 요청하지 않은 다른 사이트를응답 결과로 받을 수 있다

9.2.3 조건부 요청

로봇은 받아오는 컨텐츠 양을 최소화하기 위해 시간이나 엔터티 태그를 비교해 업데이트된 데이터만 받아올 수 있도록 조건부 HTTP 요청을 구현한다. 

9.2.4. 응답 다루기

대다수의 로봇들은 GET 메서드로 컨텐츠를 요청해서 가져오는 역할만 하기에 응답을 다룰 일이 없지만 HTTP의 특정 몇몇 기능을 사용할 경우에는 HTTP 응답을 다룰 줄 알아야 한다.

 

  1. 상태 코드
    • 로봇들은 일반적인 HTTP 상태 코드를 이해해야 함
    • 명시적으로 이해할 수 없는 코드는 상태 코드가 속한 부류에 근거해 다뤄야 한다
  2. 엔터티
    • HTTP 헤더에 임베딩된 정보를 따라 로봇들은 엔터티 자체의 정보를 찾을 수 있음

9.2.5 User-Agent 타기팅

웹 관리자들은 로봇의 요청이 들어올 것을 예상하고 그에 대응해 개발을 진행해야 한다.

다양한 클라이언트에 대응하는 유연한 페이지를 만들어야 한다.

9.3 부적절하게 동작하는 로봇들

  1. 폭주하는 로봇
    • 로봇은 빠르게 HTTP 요청을 생성할 수 있다
    • 만일, 무한 루프에 빠지게 된다면 웹 서버에 극심한 부하를 가져오게 됨
    • 로봇 관리자들은 폭주 방지를 위한 보호 장치를 신경쓰며 설계해야 함
  2. 오래된 URL
    • 몇몇 로봇은 미리 저장해놓은 URL 목록을 방문한다
    • 해당 목록은 오래되어 URL이 존재하지 않을 수도 있음
    • 에러 처리로 인해 웹 서버의 생산성이 떨어질 수 있음
  3. 길고 잘못된 URL
    • URL이 너무 길면 웹 서버 처리 능력에 영향을 줌
    • 웹 서버의 접근 로그를 어지럽게 채우고 서버를 고장낼 수도 있음
  4. 호기심이 지나친 로봇
    • 로봇이 사적인 데이터에 대한 URL을 얻어 접근하는 경우가 있을 수 있음
    • 이는 로봇이 명시적으로 하이퍼링크가 존재하지 않는 문서들을 디렉터리의 컨텐츠를 가져오는 방법으로 긁어올 경우 발생
    • 이런 사적인 컨텐츠를 무시하는 매커니즘이 매우 중요
  5. 동적 게이트웨이 접근
    • 로봇은 게이트웨이 애플리케이션에 URL로 컨텐츠를 요청할 수도 있음
    • 해당 요청은 보통 처리 비용이 많이 듬

9.4 로봇 차단하기

Robots Exclusion Standard: 로봇이 그들에게 맞지 않는 장소에 들어오지 않도록 하고 웹 마스터에게 로봇의 동작을 잘 제어할 수 있는 매커니즘을 제공하는 기법

👉 현재는 단순하게 robots.txt라고 불림

로봇은 대상 파일을 크롤링하기 전에 robots.txt 파일을 검사해 해당 파일에 접근해도 되는지 먼저 확인한다.

9.4.1 로봇 차단 표준

버전 이름과 설명 날짜
0.0 로봇 배제 표준-Disallow 지시자를 지원하는 마틴 코스터의 오리지널 robors.txt 매커니즘 1994년 6월
1.0 웹 로봇 제어 방법-Allow 지시자의 지원이 추가된 마틴 코스터의 IETF 초안 1996년 11월
2.0 로봇 차단을 위한 확장 표준-정규식과 타이밍 정보를 포함한 숀 코너의 확장. 널리 지원되지는 않음 1996년 11월

일반적으로 v0.0이나 v1.0 표준이 채택되고 있음

9.4.2 웹 사이트와 robots.txt 파일들

웹사이트에 robots.txt 파일이 존재한다면 로봇은 URL에 방문하기 전에 반드시 그 파일을 가져와 처리해야 함

보통 하나의 웹 사이트에 대해 robots.txt 파일은 하나만 존재하지만 웹 사이트가 가상 호스팅되면 각각의 가상 docroot에 다른 robots.txt가 존재할 수 있음

 

robots.txt 가져오기

로봇은 웹 서버에 robots.txt가 존재한다면 해당 파일을 text/plain 본문으로 반환함. 만약 서버가 404 Not Found HTTP로 응답하면 로봇은 해당 서버가 자신의 접근을 제한하지 않는 것으로 보고 파일 요청. 로봇은 사이트 관리자가 로봇의 접근을 추적할 수 있도록 From이나 User-Agent헤더를 통해 신원 정보를 남기고 사이트 관리자가 로봇에 대해 문의나 불만사항이 있을 경우를 위해 연락처를 제공한다

 

응답 코드

로봇은 robots.txt의 검색 결과에 따라 다음과 같이 동작

  1. 서버가 성공(2xx)으로 응답
    • 응답 컨텐츠를 파싱해 차단 규칙 얻음
    • 사이트에서 데이터를 가져올 때 규칙 적용해야 함
  2. 서버가 리소스 존재하지 않는다고(404) 응답
    • 로봇은 활성화된 차단 규칙이 존재하지 않는다고 가정
    • robots.txt의 제약 없이 사이트에 접근
  3. 서버가 접근 제한(401 or 403)으로 응답
    • 로봇은 해당 사이트로의 접근은 제한됐다고 가정
  4. 요청 시도 일시적으로 실패(503)
    • 로봇은 그 사이트의 리소스를 검색하는 것을 미뤄야 함
  5. 리다이렉션(3xx)으로 응답
    • 로봇은 리소스가 발견될 때까지 리다이렉트 따라가야 함

9.4.3 robots.txt 파일 포맷

robots.txt 파일의 각 줄은 빈 줄, 주석 줄, 규칙 줄로 이뤄짐

 

규칙 줄 예시

User-Agent: slurp
User-Agent: webcrawler
Disallow: /private

User-Agent: *
Disallow:

User-Agent 줄

User-Agent: <robot-name>

로봇의 이름은 로봇의 HTTP GET 요청 안의 User-Agent 헤더 통해 보내짐

로봇은 다음의 레코드에 복종해야 한다

  1. 로봇 이름이 자신 이름의 부분 문자열이 될 수 있는 레코드들 중 첫 번째 것
  2. 로봇 이름이 '*'인 레코드들 중 첫 번째 것

만일 로봇이 자신의 이름에 대응하는 User-Agent 줄을 찾지 못했다면 대응하는 레코드가 없는 것이므로 접근에는 어떤 제한도 없음

 

Disallow와 Allow 줄들

Disallow와 Allow 줄들은 특정 로봇에 대해 어떤 URL 경로가 명시적으로 금지돼 있고 명시적으로 허용되는지 기술.

로봇은 반드시 요청하려고 하는 URL을 차단 레코드의 모든 Disallow와 Allow 규칙에 순서대로 맞춰봐야 함.

규칙 경로는 맞춰보고자 하는 경로의 대소문자를 구분하는 접두어야 함.

예로, 'Disallow: /tmp'는 다음의 모든 URL에 대응됨

http://www.joes-hardware.com/tmp
http://www.joes-hardware.com/tmp/
http://www.joes-hardware.com/tmp/pliers.html
http://www.joes-hardware.com/tmpspc/stuff.txt

Disallow/Allow 접두 매칭(prefix matching)

  1. Disallow나 Allow 규칙이 어떤 경로에 적용되려면, 경로의 시작부터 규칙 경로의 길이만큼의 문자열이 규칙 경로와 같아야 함. 
  2. 규치 경로나 URL 경로의 임의의 '이스케이핑된' 문자들(%XX)은 비교 전에 원래대로 복원됨(빗금(/)을 의미하는 %2F는 그대로 매치돼야 함)
  3. 규칙 경로가 빈 문자열이면 모든 경로에 대해 매치된다. 
규칙 경로 URL 경로 매치여부 부연 설명
/tmp /tmp O 규칙 경로 == URL 경로
/tmp /tmpfile.html O 규칙 경로가 URL 경로의 접두어
/tmp /tmp/a.html O 규칙 경로가 URL 경로의 접두어
/tmp/ /tmp X /tmp/는 /tmp의 접두어가 아님
  README.TXT O 빈 문자열은 모든 것에 매치
/~fred/hi.html %7Efred/hi.html O %7E는 ~과 같은 것으로 취급 
/%7Efred/hi.html /~fred/hi.html O %7E는 ~과 같은 것으로 취급
/%7efred/hi.html /%7Efred/hi.html O 이스케이핑된 문자는 대소문자를 구분하지 않음
/~fred/hi.html ~fred%2Fhi.html X %2F는 빗금(/)이 맞지만, 빗금은 특별히 정확하게 매치되어야 함

9.4.4 그 외에 알아둘 점

robots.txt 파일 파싱할 때 지켜야 할 규칙

  1. 로봇은 robots.txt 파일 내에 자신이 이해하지 못하는 필드는 무시해야 함
  2. 하위 호환성을 위해, 한 줄을 여러 줄로 나누어 적는 것은 허용되지 않음
  3. 주석은 파일의 어디에서든 허용. 주석은 선택적인 공백 문자와 뒤이은 주석 문자(#)로 시작해 줄바꿈 문자가 나올 때까지 이어지는 주석 내용으로 이루어짐
  4. 로봇 차단 표준 버전 0.0은 Allow 줄을 지원하지 않음

9.4.5 robots.txt의 캐싱과 만료

효율성을 위해 로봇은 캐시된 robots.txt 파일을 사용. robots.txt 파일의 캐싱을 제어하기 위해 표준 HTTP 캐시 제어 매커니즘이 원 서버와 로봇 양쪽 모두에 의해 사용됨. 로봇은 HTTP 응답의 Cache-Control과 Expires 헤더에 주의를 기울여야 함.

또한, 웹 마스터들은 크롤러들이 robots.txt 리소스에 적용되는 캐시 지시자를 이해하지 못할 수도 있다는 점을 알고 있어야 함. 

9.4.6 로봇 차단 펄 코드

WWW::RobustRules 모듈은 robots.txt 파일과 상호작용하는 펄(Perl) 라이브러리

WWW::RobotsRules 객체는 파싱된 robots.txt파일을 가지고 있고 주어진 URL에 대한 접근이 금지되어 있는지 확인할 수 있는 메서드를 제공한다. 같은 WWW::RobotRules 객체로 여러 robots.txt 파일을 파싱할 수 있다.

 

WWW::RobustRules API의 주요 메서드

  1. RobotRules 객체 만들기
    • $rules = WWW::RobustRules->new($robot_name);
  2. robots.txt 파일 로드하기
    • $rules->parse($url, $content, $fresh_until);
  3. 사이트 URL을 가져올 수 있는지 검사하기
    • $can_fetch = $rules->allowed($url);

9.4.7 HTML 로봇 제어 META 태그

robots.txt 파일은 웹 사이트 관리자가 소유한다.

HTML 페이지 저자는 HTML 태그를 사용해 로봇이 개별 페이지에 접근하는 것을 제한할 수 있음.

 

로봇 META 지시자

  1. NOINDEX
    • 로봇에게 이 페이지를 처리하지 말고 무시하라고 말해줌
    • <META NAME="ROBOTS" CONTENT="NOINDEX">
  2. NOFOLLOW
    • 로봇에게 이 페이지가 링크한 페이지를 크롤링하지 말라고 말해줌
    • <META NAME="ROBOTS" CONTENT="NOFOLLOW">
  3. INDEX
    • 로봇에게 이 페이지의 컨텐츠를 인덱싱해도 된다고 말해줌
  4. FOLLOW
    • 로봇에게 이 페이지가 링크한 페이지를 크롤링해도 된다고 말해줌
  5. NOARCHIVE
    • 로봇에게 이 페이지의 캐시를 위한 로컬 사본을 만들어서는 안 된다고 말해줌
  6. ALL
    • INDEX, FOLLOW와 같음
  7. NONE
    • NOINDEX, NOFOLLOW와 같음

로봇 META 태그는 HTML 페이지의 HEAD 섹션에 나타나야 하며 name과 content의 값은 대소문자를 구분하지 않는다

 

검색엔진 META 태그

 

 

 

 

'HTTP 완벽 가이드 책 정리' 카테고리의 다른 글

8장. 통합점: 게이트웨이, 터널, 릴레이  (0) 2021.07.04
7장. 캐시  (0) 2021.07.04
6장. 프락시  (0) 2021.07.02