이번 금요일에 친한 동생이랑 robots.txt 가지고 이야기 하다보니 제가 정확하게 모르고 있던 부분들이 있었더군요.

사건의 발단

그래서.. 정리도 해볼겸 블로그 글로 작성해봅니다.

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

아주 기초적인 내용이지만, 관심 가지지 않으면 쉽게 지나칠 수 있는 부분인 것 같습니다.
덕분에 좀 찾아보고 공부하게 됬네요. 하나라도 더 알고 계시면 분명 언젠가는 쓰일 수 있으니 가볍게 읽어주셨으면 합니다 :)

댓글 3개:

  1. 글 다 보시면 아실겁니다. 제 robots.txt 중

    User-agent: Mediapartners-Google
    Disallow:

    부분은 의미없다는거..

    답글삭제
  2. 안녕하세요 잘 보고 갑니다. 제가 루비로 크롤링하면서 reCaptcha v2가 있는 사이트를 크롤링해야 할 일이 생겼는데 혹시 뭔가 팁을 얻을 수 있을까요? 감사합니다

    답글삭제
    답글
    1. 특정 페이지나 기능이 아니라 사이트 접근 자체(웹 사이트 들어가자마자 페이지와 무관하게)에 reCaptcha가 있는 경우를 말씀주신건가요?
      음.. 맞다면 쉬운 방법으론 없을 것 같아요. 그나마 헤드리스 브라우저쪽이 가능성이 있긴한데, reCaptcha에 걸러지지 않고 접근할 수 있다는 것 자체가 reCaptcha에 보안적인 문제가 있다고 볼 수 있거든요.

      웹 사이트 번역 기능이나 구글 검색 캐시 처럼 이미 크롤링 성공한 서비스의 데이터를 끌어쓰는 방법도 있을 것 같네요(그냥 뇌피셜)
      고민이 좀 필요할 것 같습니닷

      삭제