사건의 발단 |
그래서.. 정리도 해볼겸 블로그 글로 작성해봅니다.
robots.txt란?
robots.txt는 웹 크롤러들이 접근하지 못하도록 제한하는 규약입니다.물론 프로토콜이라고 하기엔 강제성을 띄진 않기 때문에(robots.txt가 있어도 크롤러가 무시하도록 개발되었다면 상관 안합니다.) 어렵고, 그냥 서로서로 지키자 정도의 규칙이죠.
보통 접근하지 말아야할 경로가 들어가게 됩니다. 일반 웹 사이트들은 검색 엔젠에 최대한 노출이 잘 되는게 목표라 중요하지 않을 것 같지만, 불필요한 페이지들은 크롤링 제한을 해주어 양질의 데이터가 검색 서비스에 노출되도록 하는게 상위 노출을 위해서 좋은 방법이기 때문에 robots.txt는 많은 사이트들이 적용하고 있는 부분입니다.
저도 비슷하죠.
$ curl -i -k https://www.hahwul.com/robots.txt
HTTP/2 200
content-type: text/plain; charset=UTF-8
expires: Sat, 06 Apr 2019 13:22:29 GMT
date: Sat, 06 Apr 2019 13:22:29 GMT
cache-control: private, max-age=86400
last-modified: Fri, 05 Apr 2019 01:08:54 GMT
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
server: GSE
accept-ranges: none
vary: Accept-Encoding
User-agent: Mediapartners-Google
Disallow:
User-agent: *
Disallow: /search
Allow: /
Sitemap: https://www.hahwul.com/sitemap.xml
(/search 잡히면 글 갯수가 어마어마해질겁니다.......)의문점과 답안
그날 이야기됬던 논점은 이렇습니다.“robots.txt 에서 User-Agent가 명시되지 않으면 모든 UA 차단인가?”
먼저 답을 드리자면, 아닙니다.
robots.txt는 최소 하나 이상의 규칙이 있어야 적용되고, 규칙은 하위 2개의 필수 규칙으로 이루어집니다.
User-agent: [차단할 UA]
Disallow: [Disallow, Allow 할 경로]
어떤 User-Agent를 걸러낼지, 어떻게 처리할지(Disallow, Allow)+경로이죠.
조건이 부족하기 때문에 비정상적인 규칙으로 판단하고, 보통의 웹 크롤러들은 이를 무시합니다.
(물론 크롤러마다 다를수도 있어요, 구글 크롤러 기준입니다)
규칙과 적용 범위
robots.txt는 Robots exclusion standard를 다릅니다. 자세한건 아래 링크 한번 읽어보시면 좋습니다.(https://en.wikipedia.org/wiki/Robots_exclusion_standard)
자 그러면 각 규칙들을 알아봅시다.
(필수) User-agent: "HTTP Request 내 걸러내야할 User-Agent 헤더를 의미합니다."
(필수) Disallow(Allow 중 하나는 필수): "User-agent가 맞을 떄 처리하는 방식입니다. 인자값? 으로 경로를 제공하죠."
(필수) Allow(Disallow 중 하나는 필수): "위와 동일"
(옵션) Sitemap: "웹 사이트의 전체 링크 구조를 가진 사이트맵을 명시합니다. 이를 기준으로 웹 크롤러가 사이트 전체 데이터를 판단합니다."
이 중 Disallow, Allow는 두번째 값으로 경로를 두어 처리하는데, 경로에 $가 붙으면 해당 문자로 끝나는 모든 경로를 차단합니다.
User-agent: ABCD
Disallow /allow-dir/*.rb$
Allow /allow-dir
위와 같은 규칙이 있다고 하면 ABCD의 UA 중 allow-dir 내 .rb 파일은 모두 차단하고, 나머지는 모두 접근 가능하도록 설정됩니다.
두번째로는 적용 범위인데, robots.txt가 위치한 도메인이나 path에 따라 적용 가능한 범위가 달라집니다.
딱 5개만 알고 가시면 됩니다.
1. 도메인은 정확하게 체크됨
+ https://www.hahwul.com 적용 시 www 도메인만 적용됨
2. 경로의 최상위 디렉토리에만 유효
+ /test/robots.txt는 적용되지 않음
3. 프로토콜(http, https ,ftp 등..)도 정확하게 따짐
+ http://www.hahwul.com으로 적용 시 https://www.hahwul.com은 적용받지 않음)
4. 포트도 정확하게 걸러냄
+ https://www.hahwul.com 적용 시 https://www.hahwul.com:8080은 무효
+ 단 80,443 같이 프로토콜의 기본 포트는 예외됨(http://hahwul.com:80 == http://hahwul.com)
5. IDN은 동일한 구간으로 봄
+ https://www.hahwül.com 시 https://www.hahwül.com , https://www.xn--hahwl-mva.com
Conclusion
아주 기초적인 내용이지만, 관심 가지지 않으면 쉽게 지나칠 수 있는 부분인 것 같습니다.덕분에 좀 찾아보고 공부하게 됬네요. 하나라도 더 알고 계시면 분명 언젠가는 쓰일 수 있으니 가볍게 읽어주셨으면 합니다 :)
HAHWULSecurity engineer, Gopher and H4cker! |
글 다 보시면 아실겁니다. 제 robots.txt 중
ReplyDeleteUser-agent: Mediapartners-Google
Disallow:
부분은 의미없다는거..
안녕하세요 잘 보고 갑니다. 제가 루비로 크롤링하면서 reCaptcha v2가 있는 사이트를 크롤링해야 할 일이 생겼는데 혹시 뭔가 팁을 얻을 수 있을까요? 감사합니다
ReplyDelete특정 페이지나 기능이 아니라 사이트 접근 자체(웹 사이트 들어가자마자 페이지와 무관하게)에 reCaptcha가 있는 경우를 말씀주신건가요?
Delete음.. 맞다면 쉬운 방법으론 없을 것 같아요. 그나마 헤드리스 브라우저쪽이 가능성이 있긴한데, reCaptcha에 걸러지지 않고 접근할 수 있다는 것 자체가 reCaptcha에 보안적인 문제가 있다고 볼 수 있거든요.
웹 사이트 번역 기능이나 구글 검색 캐시 처럼 이미 크롤링 성공한 서비스의 데이터를 끌어쓰는 방법도 있을 것 같네요(그냥 뇌피셜)
고민이 좀 필요할 것 같습니닷