[HTTP 완벽 가이드] 9장 웹 로봇
- 9.3 부적절하게 동작하는 로봇들
- 9.4 로봇 차단하기
9.3 부적절하게 동작하는 로봇들
폭주하는 로봇
로봇이 사람보다 훨씬 빠르게 HTTP 요청을 만들 수 있고, 주로 빠른 네트워크 연결을 갖춘 빠른 컴퓨터 위에서 동작하기 때문에, 로봇 자체에 논리적 오류가 있거나 로봇이 순환에 빠지면 웹 서버에 극심한 부하를 줄 수 있음.
오래된 URL
오래되어서 존재하지 않는 URL에 대한 요청을 많이 보낼 수 있는데, 존재하지 않는 문서에 대한 접근 요청으로 에러 로그가 채워지거나, 에러 페이지를 제공하는 부하가 발생 가능.
길고 잘못된 URL
순환이나 프로그래밍 오류로 인해 로봇이 웹사이트에 크고 의미 없는 URL을 요청할 수 있음. 근데, 그 URL이 웹 서버의 처리 능력에 영향을 줄 만큼 충분히 길다면... 접근 로그가 의미 없이 쌓이거나 심각하면 서버 터질 수 있음.
호기심이 지나친 로봇
사적인 데이터에 대한 URL을 얻어 그 데이터를 인터넷 검색엔진이나 기타 어플리케이션을 통해 쉽게 접근할 수 있도록 만들 수 있음. 그 데이터의 소유자가 그 웹페이지를 적극적으로 알리는 것을 원치 않았다면, 심각한 경우 사생활 침해로 여겨질 수 있음. 요새 같은 경우에는 더 심각하겠네
보통 이는 사적인 콘텐츠에 대한 이미 존재하는 하이퍼링크를 로봇이 따라감으로써 벌어지는 일임. 이러한 일은 매우 광적인 로봇이 명시적으로는 하이퍼링크가 존재하지도 않는 문서들을 디렉터리의 콘텐츠를 가져오는 등의 방법으로 긁어올 때 가끔씩 일어날 수 있음.
로봇 구현자 입장에서는, 사이트 관리자들이 인터넷에 공개할 의도를 갖고 있지 않았을 몇몇 특정 민감한 데이터는 로봇이 검색할 수 없도록 해야 함. 민감한 데이터는 비밀번호 파일이나 심지어 신용카드 정보를 포함할 수 있음. (이런 건 그래도 어느 정도 패턴화 되어있으니 분별이 가능하겠다.)
흠... 근데, 공통적으로 접근하면 안 되는 약간의 통념적인 그런 path들은 분명 존재하겠지만, 예를 들어 admin 이라던지! 근데, 그런 통념에서 벗어나는 path를 사용하지만 사이트 쪽에서 공개하길 원하지 않는 경우에는 잘 숨겨놓아야 하는 것 아닌가??
동적 게이트웨이 접근
로봇이 어디로 접근 중인지 스스로 다 잘 알고 있지는 않음. 로봇이 게이트웨이 애플리케이션의 콘텐츠에 대한 URL로 요청할 수도 있음. 이 경우 얻은 데이터는 아마도 특수 목적을 위한 것일 테고 처리 비용이 많이 든다. (이건 이유는 잘 모르겠네. 왜 특수 목적을 위한 것인지.)
9.4 로봇 차단하기
1994년 로봇의 접근을 적절히 관리하기 위한 표준 태동 : Robots Exclusion Standard=> 근데, 로봇의 접근을 제어하는 정보를 저장하는 파일의 이름을 따서 종종 그냥 robots.txt라고 불린다.
robots.txt의 아이디어 자체는 단순함. 웹 사이트의 루트에 robots.txt라고 이름 붙은 선택적인 파일을 제공할 수 있는데, 이 파일에는 어떤 로봇이 서버의 어떤 부분에 접근할 수 있는지에 대한 정보가 담겨있음.
9.4.1 로봇 차단 표준
로봇 차단 표준은 임시방편으로 마련된 표준임. 그런 거 치고는 엄청 광범위하게 쓰이는 거 아닌가...?
여전히 웹 사이트에 대한 로봇의 접근을 제어하는 능력은 불완전한 데가 있지만 없는 것보다는 훨씬 낫고 대부분의 주류 업체들과 검색엔진 크롤러들이 이 차단 표준을 지원함.
robots.txt도 버전이 있다. 각각 0.0, 1.0, 2.0인데, 1994년 , 1996년에 정해졌다.
9.4.2 웹 사이트와 robots.txt 파일들
웹 사이트의 URL을 방문하기 전에, 그 웹 사이트에 robots.txt 파일이 존재한다면 로봇은 반드시 그 파일을 가져와서 처리해야 함. 각 웹 사이트에는 하나의 설정 파일만 존재하며, 가상 호스팅 되는 경우, 각각의 가상 docroot에 서로 다른 robots.txt 가 있을 수 있음.
robots.txt 가져오기
robots.txt가 존재한다면 서버는 그 파일을 text/plain 본문으로 반환함.
근데, 만약 서버가 404 Not Found로 응답한다면 로봇은 그 서버는 로봇의 접근을 제한하지 않는 것으로 간주하고 어떤 파일이든 요청하게 될 것이다. (오... 없으면 그냥 무시하는 게 아니라 다 긁어가는구나!)
로봇은 사이트 관리자가 로봇의 접근을 추적할 수 있도록 From이나 User-Agent 헤더를 통해 신원 정보를 넘기고, 사이트 관리자가 로봇에 대해 문의나 불만사항이 있을 경우를 위해 연락처를 제공해야 함.
상용 웹 로봇이 보낼 수 있는 HTTP 크롤러 요청의 예시
GET /robots.txt HTTP/1.0
Host: www.joes-hardware.com
User-Agent : Slurp/2.0
Date: Sat Oct 15 11:15:48 KST 2022
응답 코드
- 2xx : 규칙에 따른다
- 404 : 없다?? 그냥 다 가져간다
- 403 : 사이트 접근이 완전히 제한되어 있다고 판단함 (Forbidden)
- 3xx : 리다이렉트를 의미하는 경우에는 리소스가 발견될 때까지 리다이렉트를 따라감.
9.4.3 robots.txt 파일 포맷
robots.txt 파일 예시
User-Agent : slurp
User-Agent : webcrawler
Disallow : /private
User-Agent : *
Disallow :
각 레코드는 특정 로봇들의 집합에 대한 차단 규칙의 집합으로 되어 있으며, 빈 줄이나 파일 끝 문자(end-of-file)로 끝난다.
레코드는 어떤 로봇이 이 레코드에 영향을 받는지 지정하는 하나 이상의 User-Agent 줄로 시작하며 뒤이어 이 로봇들이 접근할 수 있는 URL들을 말해주는 Allow 줄과 Disallow 줄이 온다.
User-Agent 줄
각 로봇의 레코드는 하나 이상의 User-Agent 줄로 시작하며 형식은 다음과 같음.
User-Agent : <robot-name>
혹은 와일드카드(*)로 표시. 와일드카드 => 전부 다!로 일단 이해하면 편함.
User-Agent : *
로봇의 이름은 로봇의 HTTP GET 요청 안의 User-Agent 헤더를 통해 보내짐.
robots.txt 파일을 처리한 로봇은 다음의 레코드에 반드시 복종해야 함.
- 로봇 이름이 자신 이름의 부분 문자열이 될 수 있는 레코드들 중 첫 번째 것.
- 로봇 이름이 '*'인 레코드들 중 첫 번째 것.
만약 로봇이 자신의 이름에 대응하는 User-Agent 줄을 찾지 못하였고 와일드카드를 사용한 'User-Agent : *'줄도 찾지 못했다면, 대응하는 레코드가 없는 것이므로, 접근에는 어떤 제한도 없다. (그냥 접근 안 하고 돌아가는 게 아니라, 로봇에게 적용되는 규칙이 없으니 아무렇게나 다 가져간다!! 이런 스탠스이군.)
로봇 이름을 대소문자를 구분하지 않는 부분 문자열과 맞춰보므로. 의도치 않게 맞는 경우에 주의해야 한다. 예를 들어, 'User-Agent: bot'은 Bot, Robot, Bottom-Feeder, Spambot, Dont-Bother-Me에 매칭 된다.
Disallow와 Allow 줄들
Disallow와 Allow는 로봇 차단 레코드의 User-Agent 바로 다음에 옴. 이 줄들은 특정 로봇에 대해 어떤 URL 경로가 명시적으로 금지되어 있는지, 명시적으로 허용되는지 기술.
로봇은 반드시 요청하려고 하는 URL을 차단 레코드의 모든 Disallow와 Allow 규칙에 순서대로 맞춰 봐야 함.
첫 번째로 맞은 것이 사용되고, 어떤 것도 맞지 않으면 그냥 그 URL은 허용됨.
URL과 맞는 하나의 Allow/Disallow 줄에 대해, 규칙 경로는 반드시 그 맞춰보고자 하는 경로의 대소문자를 구분하는 접두어여야 함. 예를 들어, 'Disallow : /tmp'라고 하면 아래 모든 URL에 대응됨.
- http://~~~/tmp
- http://~~~/tmp/
- http://~~~/tmp/xx.html
- http://~~~/tmpspc/xx.txt
Disallow/Allow 접두 매칭(prefix matching)
- Disallow, Allow 규칙이 어떤 경로에 적용되려면, 그 경로의 시작부터 규칙 경로의 길이만큼의 문자열이 규칙 경로와 같아야 함. 그리고 대소문자 차이도 없어야 함. * 의 경우, 특별한 의미는 없지만, 대신 빈 문자열을 이용해 모든 문자열에 매치되도록 할 수 있음.
- 규칙 경로나 URL 경로의 임의의 이스케이핑된 문자들(% XX)은 비교 전에 원래대로 복원됨. 단, / 를 의미하는 %2F는 예외이며, 반드시 그대로 매치되어야 함.
- 만약 어떤 규칙 경로가 빈 문자열이라면, 그 규칙은 모든 URL 경로와 매치됨.
접두 매칭 방식은 꽤 잘 동작하지만, 부족한 점이 있음. 예를 들어, 어떤 경로 밑에 있는지와 상관없이 특정 이름의 디렉토리에 대해서는 크롤링 못하게 하고 싶을 수 있는데, robotx.txt를 통해서는 이를 표현할 수 없음.
9.4.4 그 외에 알아둘 점
- robots.txt 파일은 명세가 발전함에 따라 User-Agent, Disallow, Allow 외의 다른 필드를 포함할 수 있음. 그리고 로봇은 자신이 이해하지 못하는 필드는 무시해야 함.
- 하위 호환성을 위해, 한 줄을 여러 줄로 나누어 적는 것은 허용되지 않는다.
- User-Agent : *\nDisallow:/ 이런 식이 되면 곤란하다.
- 주석은 파일의 어디에서든 허용됨.
- robots.txt 0.0 버전은 Allow 줄을 지원하지 않았음.
9.4.5 robots.txt의 캐싱과 만료
매 파일 접근마다 로봇이 robots.txt 파일을 새로 가져와야 한다면?? 비효율적이고 서버 부하도 늘어남. 대신 로봇은 robots.txt를 가져와서 캐싱하며, 캐싱된 사본이 만료될 때까지 사용됨. robots.txt 파일의 캐싱을 제어하기 위해 표준 HTTP 캐시 제어 메커니즘이 원 서버와 로봇 양쪽 모두에 의해 사용됨. 로봇은 그래서 응답의 Cache-Control과 Expires 헤더에 주의를 기울여야 함.
그리고, 많은 크롤러들이 HTTP/1.1 클라이언트가 아니다 보니, 크롤러들이 robots.txt 리소스에 적용되는 캐시 지시자를 이해하지 못할 수도 있다는 점을 주의해야 한다!
로봇 명세 초안은 Cache-Control 지시자가 존재하는 경우 7일간 캐싱하도록 하는데, 실무 입장에서 보면 너무 긴 기간! (옛날 기준으로 봐도 길다고 하는데, 지금은 더 길게 느껴진다!)
9.4.6 로봇 차단 펄 코드
robots.txt 파일과 상호작용하는 공개된 펄(Perl) 라이브러리가 몇 가지 존재함. Ex. CPAN 공개 펄 아카이브의 WWW::RobustRules 모듈.
패스!
9.4.7 HTML 로봇 제어 META 태그
robots.txt 파일의 단점 중 하나는 그 파일을 콘텐츠의 작성자 개개인이 아니라 웹 사이트 관리자가 소유한다는 것.
그래서, HTML 페이지 저자가 로봇이 개별 페이지에 접근하는 것을 제한하는 좀 더 직접적인 방법을 사용할 수 있음. 바로 HTML 문서에 직접 로봇 제어 태그를 추가하는 것. (티스토리 블로그 하다 보면 블로그의 root 경로에 있는 robots.txt 는 건드릴 수 없으니, HTML 편집을 통해 meta 태그 추가하라고 하는 내용들이 여기서 나오는 것.)
로봇 META 태그는 다른 HTML META 태그와 마찬가지로 반드시 HTML 페이지의 HEAD 섹션에 나타나야 함.
그리고 name과 content의 값은 대소문자를 구분하지 않는다.
그리고, 당연히 지시어들이 (content의 지시어들) 충돌하거나 중복되게 해서는 안 된다.
로봇 META 지시자
- NOINDEX
- 이 페이지를 처리하지 말고 무시하라고 말하는 것 (이 콘텐츠를 색인이나 데이터베이스에 포함시키지 말아라!)
- <META NAME="ROBOTS" CONTENT="NOINDEX">
- NOFOLLOW
- 로봇에게 이 페이지가 링크한 페이지를 크롤링하지 말라고 말하는 것.
- <META NAME="ROBOTS" CONTENT="NOFOLLOW">
- INDEX
- 이 페이지의 콘텐츠를 인덱싱해도 된다고 말해주기.
- <META NAME="ROBOTS" CONTENT="INDEX">
- FOLLOW
- 이 페이지가 링크한 페이지를 크롤링해도 된다고 말해주기.
- <META NAME="ROBOTS" CONTENT="FOLLOW">
- NOARCHIVE
- 이 페이지의 캐시를 위한 로컬 사본을 만들어서는 안 된다고 말해주기.
- ALL
- INDEX, FOLLOW와 같음.
- NONE
- NOINDEX, NOFOLLOW와 같음.
검색엔진 META 태그
모든 로봇 MEAT 태그는 name = "robots" 속성을 포함함.
위에 소개된 것 외에도 DESCRIPTION, KEYWORDS 같은 콘텐츠의 색인을 만드는 검색엔진 로봇들에 대해 유용함.
<meta name="revisit-after" content="2 days">
REVISIT-AFTER 같은 태그의 경우, 말 그대로 로봇에게 N 일 있다가 다시와~~ 우리 사이트 자주 바뀌니까~~ 이렇게 알려주는 태그.
'개발 > HTTP 완벽가이드' 카테고리의 다른 글
[HTTP 완벽가이드] 9장 웹 로봇 > 9.2 로봇의 HTTP (0) | 2022.10.12 |
---|---|
[HTTP 완벽가이드] 9장 웹 로봇 > 9.1 크롤러와 크롤링 [2/2] (0) | 2022.10.07 |
[HTTP 완벽가이드] 9장 웹 로봇 > 9.1 크롤러와 크롤링 [1/2] (0) | 2022.10.06 |
[HTTP 완벽가이드] 8장 통합점: 게이트웨이, 터널, 릴레이 > 8.6 릴레이 (0) | 2022.10.04 |
[HTTP 완벽가이드] 8장 통합점: 게이트웨이, 터널, 릴레이 > 8.5 터널 (2) | 2022.10.01 |