대학생 A씨는 교양과목을 통해 배운 지식으로 꽤 잘 나가는 동호회 웹사이트를 직접 제작하고 운영하고 있습니다. 그러다 우연히 구글 검색에서 자기가 운영하는 동호회 회원정보 페이지가 노출된 것을 보고 경악했습니다. 나중에 알고보니 꿈에도 생각못한 로그인 설계에 문제가 있었습니다.
A씨의 웹사이트는 회원가입 후 로그인을 해야 사용할 수 있습니다. 따라서, 대문 역할을 하는 로그인 페이지를 따로 만들고 다른 모든 페이지에는 로그인 하지 않은 경우 다음과 같이 로그인 페이지로 이동하도록 프로그램했습니다.
[userinfo.html의 내용]
<html>
<script>
if (IsLoggedInUser()) {
alert("로그인이 필요합니다.") ;
window.location = "/login.html";
}
</script>
<body>
사용자 정보 수정 페이지
...
</body>
</html>
평상시에는 A씨가 생각했던 대로 동작했습니다. 로그인한 사용자는 userinfo.html의 내용이 보이고 로그인하지 않은 사용자는 /login.html로 강제로 이동됩니다.
자, 그런데 어떤 사용자가 Javascript 기능을 끄고 userinfo.html에 접근하면 어떻게 될까요? userinfo.html의 내용을 제한없이 볼 수 있습니다. 또한, userinfo.html에 다른 페이지로의 링크가 걸려있다면(예를 들어, 개인 쪽지함 같은 페이지로) 링크를 따라가면서 다른 페이지의 내용까지 볼 수 있습니다. 잘 아시는 것처럼 Javascript 기능을 꺼도 HTML파일의 정적인 내용은 웹브라우저에서 그대로 출력되니까요.
웹브라우저에서 Javascript는 기본으로 켜져있기 때문에 별 문제가 안 될거라고 생각하시나요? HTML페이지의 Javascript 코드는 클라이언트 즉, 사용자의 웹브라우저에서 실행됩니다. 그러기 위해서 웹브라우저는 먼저 userinfo.html 페이지를 먼저 전송을 받아 사용자 컴퓨터의 어딘가에 저장합니다.
[userinfo.html 파일의 동작 방식]
그림처럼 userinfo.html의 모든 내용을 클라이언트로 가져와서 자바스크립트 코드를 실행하는 것이지요. 여러분도 가끔 임시 인터넷 폴더의 내용을 삭제하실 겁니다. userinfo.html의 내용은 임시 인터넷 폴더만 뒤지면 고스란히 드러납니다.
이 포스팅의 제목을 기억하십니까? “서버의 것은 서버에게”
로그인여부를 체크하고 로그인하지 않았으면 해당 페이지를 접근하지 못하도록 하는 것은 서버에서 해야할 일입니다. 클라이언트는 모든 것이 처리된 결과를 받아야 합니다.
검색로봇은 어떨까요? 검색로봇은 쉽게 얘기해서 Javascript 실행기가 없는 클라이언트입니다. 따라서, 검색로봇은 userinfo.html와 그 안에 들어있는 링크를 따라 발견된 문서들의 내용을 색인합니다. 검색로봇이 수집하지 말아야 할 정보까지 수집하게 되는 것이지요. 서버에서 적절히 로그인 체크를 할 경우 검색로봇도 더 이상 불필요한 정보를 수집하지 않게 됩니다.
마지막으로 한번 더 정리하면, 로그인 여부 체크와 로그인 페이지 이동은 반드시 서버에서 처리해야 합니다. 절대로 클라이언트 Javascript 코드에서 처리하면 안됩니다.
웹사이트를 운영하면서 검색엔진과 관련하여 알아두어야 할 “웹마스터를 위한 검색이야기”의 다른 포스팅도 참고하세요.
겨울이 막 시작되려는 어느날 한 웹마스터분께서 사무실에 찾아오셔서 약간 격앙된 목소리로 왜 구글은 인덱스를 하지 말라고 표시한 문서까지도 검색결과에 나오게 하냐고 물으셨습니다. noindex에 대한 이야기였습니다.
여러분은 noindex 메타태그에 대해서 들어보셨나요? noindex와 관련하여 nofollow, nocache와 같은 메타태그도 있는데 잘 모르시는 분들을 위하여 간단히 설명하고, 왜 이런 메타태그가 잘 동작하지 않는 지 알려드리겠습니다.
noindex 메타태그는 검색엔진에게 어떤 페이지를 색인하지 말라는 표지입니다. noindex 메타태그가 들어있는 페이지는 검색엔진이 색인에 포함시키지 않고 따라서 검색결과에도 나오지 않습니다. nofollow는 해당 문서안에 포함된 링크들을 검색로봇이 따라가지 말라는 표지입니다. nocache는 검색결과에서 해당 페이지의 캐시(저장된 페이지)를 제공하지 않도록 합니다. noindex가 사용된 HTML페이지는 다음과 비슷할 것입니다.
서론이 좀 길었는데 구글 검색엔진이 이 메타태그를 지키지 않는다는 민원이 종종 있습니다. 이런 사례를 자세히 들여다보면 상당수는 간단한 검색엔진 동작방식에 대한 오해에서 비롯되었음을 알게됩니다.
서두에 말씀드렸던 그 웹마스터분은 자기 웹사이트의 모든 페이지에 noindex를 다 넣었고 robots.txt 로도 구글 크롤링을 막았는데 도대체 말을 안듣는다고 하소연을 하였습니다. 그 분이 하시는 말씀중에 문제의 원인이 있었는데 혹시 눈치채셨나요?
이해를 돕기 위해서 검색엔진이 동작하는 방식을 간단하게 설명하겠습니다.
자 구글 검색 로봇은 공개된 B.com에서 b1.html과 b2.html을 수집하여 그 내용을 확인하고 해당 문서들이 포함한 링크를 따라 A.com의 문서를 수집하려고 합니다. 이때 구글 검색 로봇은 A.com의 robots.txt를 먼저 읽어서 A.com의 모든 문서를 읽지 말라는 지시사항을 읽고 그것을 그대로 따릅니다. A.com의 문서를 읽지 않고 그때까지 모은 정보를 바탕으로 색인을 만들게 되는거죠. 그 색인에는 B.com의 b1.html과 b2.html의 제목, URL, 스니펫(검색결과에 나오는 문서요약) 등이 포함됩니다. 자 이제 A.com은 어떻게 될까요? 이상하게 들리겠지만 A.com의 a.html도 검색결과에 나올 수 있습니다. 어떻게요?
구글 검색 엔진은 B.com을 통해 A.com의 a.html의 존재에 대해 알게되었습니다. 그런데 A.com의 크롤링이 금지되었으므로 a.html의 내용에 들어있는 noindex 지시사항을 보지 못합니다. 따라서 실제 내용은 모르지만 B.com에서 알려준 A.com의 페이지에 대한 링크를 검색결과에 표시하게 됩니다. 아닙니다! A.com의 내용이 검색되는 것이 아니라 B.com의 내용이 검색되는 것 뿐입니다.
왜 이런일이 일어날까요?
웹 검색에서 크롤링(수집)과 색인화는 별개의 프로세스이기 때문입니다. 예를 들어, 크롤링 없이 색인을 만들 수 있을까요? 네, 그렇습니다. 초창기 야후와 같은 디렉토리 검색 사이트들은 다들 아시는 것처럼 사람이 직접 색인을 작성했습니다. 그 시대에도 웹 서퍼라는 전문가가 해당 사이트를 방문하여 분석한 후 색인을 만들었지만 사이트를 방문하지 않고도 충분히 확신할 근거가 있다면 수집/분석 없이도 색인을 만들 수 있었습니다. 이제는 웹이 엄청나게 방대해지면서 더 이상 사람이 일일이 색인을 할 수 없으므로 현대적인 검색엔진들은 자동화된 크롤링에 의지하여 정보를 수집하고 색인화를 합니다. 크롤링과 색인 생성 작업이 자동화된 이후에도 a.html이라는 페이지를 크롤하지 않고 b.html만을 기준으로 색인을 만들 수 있습니다.
그러면 색인을 하지 못하도록 하려면 어떻게 해야 할까요?
예전에는 검색회사에 직접 전화를 걸거나 이메일로 삭제요청을 해야 했습니다. 요새는 HTML표준에서 제공하는 noindex메타태그를 페이지에 넣으면 간단하게 색인을 하지 않도록 합니다. 다만, 조건이 한 가지 있습니다. 검색엔진이 noindex지시사항을 읽을 수 있도록 robots.txt로 막지 말아야 합니다.
웹 페이지를 noindex로 표시해놓고 robots.txt로 막는 것은 반드시 지켜야 할 법을 대로에 게시하고서는 그것을 보려는 사람의 눈을 가리는 것과 같습니다.
자 이제 noindex 메타태그를 사용하시려면 robots.txt 검색 로봇 지시자를 그에 맞게 꼭 수정하십시오.
구글봇(Googlebot)이라 불리는 구글 크롤러가 robots.txt에서 상충하는 명령어들을 발견했을 때 어떻게 동작하는지 아시나요? 왜 robots.txt를 사용하여 크롤러를 막아도 검색결과에는 여전히 색인되어 있는지 궁금하시지 않았나요? 길가에 피는 꽃에도 다 이름이 있듯이, 구글 크롤러에도 제대로된 자기만의 이름이 있다는 것을 아셨나요? 이런 궁금증을 풀어 줄 제대로 된 문서가 드디어 한국어로 번역되었습니다.
'크롤링 및 인덱싱 제어하기'는 웹마스터 뿐만 아니라, 보안 담당자, 웹 방화벽 제작사 등에도 도움이 될 자세한 정보를 담고 있습니다. robots.txt와 더불어 robots 메타 태그 및 X-Robots-Tag HTTP 헤더 명령어를 어떻게 사용해야 하는지에 대한 내용도 포함하고 있습니다.
오늘은 많은 웹사이트 담당자분들이 robots.txt(로봇제어파일)을 작성하면서 걱정하시는 문제를 짚어보려고 합니다. 때때로 대형 웹사이트 담당자분들이 robots.txt의 규칙과 내용을 비교적 잘 이해하고 있으면서도, 검색로봇이 접근하지 말아야 할 디렉토리의 목록을 robots.txt 에 입력하는 것이 오히려 악의적인 해커들에게 힌트를 주는 것이 아닌지 걱정을 하시거든요.
[제가 직접(!) 그려본 침입개념도입니다]
예를 들어, robots.txt 파일에 검색로봇을 차단할 디렉토리를 다음과 같이 지정한다고 가정합니다. User-agent: * Disallow: /admin Disallow: /private_db
robots.txt는 홈페이지처럼 공개되어 있는 파일이므로 악의적인 해커는 우선 robots.txt파일을 쭈욱 읽어본 다음 회심의 미소를 지으며 /admin이나 /private_db 폴더부터 우선 공격한다는 이야기지요. (로봇제어파일의 소개는 이전 포스트를 참고하세요.)
이에 대하여 완벽하지는 않지만 해결책을 알려드리겠습니다.
1. Disallow와 Allow 조합
자, 그럼 첫 번째 해결책부터 들어갑니다. 모든 파일을 Disallow한 다음 공개할 디렉토리만 선택적으로 Allow하는 방법입니다. 이 방법은 Allow로 지정해야할 디렉토리가 많지 않을 때 유용합니다. 예를 들면 다음과 같습니다.
모든 검색로봇에 대해서 해당 사이트의 모든 파일을 차단(두번째 행)한 후, /index.html 파일과 /public 디렉토리를 허용한다는 뜻입니다. /public 디렉토리라고 했지만 사실 정확히 얘기하면 /public으로 시작하는 어떤 URL 경로도 허용합니다. 예를 들어, /public_db, /public/list.html 또는 /public?q=hello 도 모두 허용됩니다.
2. 디렉토리명의 일부만 사용
두 번째로는 차단할 디렉토리명의 일부만을 사용하는 방법입니다. 위의 예에서도 보셨지만 Disallow나 Allow 항목의 디렉토리명은 사실은 URL경로의 앞쪽만 일치하면 적용됩니다. 예를 들면,
User-agent: * Disallow: /a Disallow: /p
이렇게만 적어도 /admin 디렉토리와 /private_db 디렉토리의 내용 모두 차단됩니다. 이때 주의할 것은, /public 디렉토리도 /p로 시작하므로 이럴 경우는 좀 더 자세히 적어주는 것이 좋습니다. 다음과 같이요.
Disallow: /pri
아니면, Allow: /public 을 따로 추가해주어도 되겠지요.
3. 파일 확장자로 차단
추가적으로 한가지 더 알려드리자면 파일의 확장자만을 기준으로 차단이나 허용이 가능합니다. 예를 들어, 우리 사이트의 모든 PHP프로그램은 검색로봇이 접근하지 않도록 하려면 다음과 같이 하면 됩니다.
User-agent: * Disallow: /*.php
/public/program.php, /filename.php?q=hello 등의 .php 확장자를 가진 페이지로의 접근이 차단됩니다. 와일드카드 문자 ‘*’는 그 자리에 아무 문자가 없을 수도 있고 임의의 어떤 문자열이 올 수도 있습니다.
자, 완벽하지는 않지만 그럴듯한 해결책이 되겠는지요? robots.txt의 규칙과 구글 검색로봇의 원리에 대해서 더 궁금하신 분은 이전 포스트들과 다음의 사이트를 참고하세요. Controlling Crawling and Indexing: http://code.google.com/web/controlcrawlindex (영어 문서입니다. 한국어 문서는 현재 작업 중에 있으니 조금만 기다려주세요~)
마지막으로 꼭 말씀을 드려야 할 것이 있는 데, 해커를 얕잡아 보지 마십시오. 단지 robots.txt파일에 써 있는 내용을 통해 디렉토리명을 아는 정도로 위험해질 시스템이라면 robots.txt파일과 관계없이 이미 악의적 공격자의 먹이감이 될 수 있습니다. 컴퓨터 세계에서는 방어자보다 공격자가 훨씬 유리하며 보이지 않는 악의적 해커는 단순한 힌트 한 두개가 없다고 절대로 포기하지 않거든요.
즉, robots.txt는 정상적인 검색로봇과 웹마스터가 소통하는 창구일 뿐 개인정보 보호나 시스템 보안과는 연결고리가 크지 않습니다.
다음 번에는 robots.txt로 차단하였는데 검색엔진에 색인이 되는 희한한 현상에 대해서 알려 드리겠습니다.
어제 “검색로봇 100배 활용하기(상)”을 통해서 ’은둔형 외톨이' 웹사이트의 실태를 한 가지 사례를 통해 살펴보았는데요, 사실 단순 실수이든 의도적이든 웹사이트의 검색 로봇 차단은 생각보다 많은 사이트들에서 일어나고 있습니다.
오늘은 간단한 방법으로 어떻게 검색 로봇이 웹페이지를 읽도록 허용하고 차단하는지 알아보겠습니다.
우선 검색엔진이 어떻게 동작하는지에 대해 간단히 설명해보겠습니다.
검색 엔진의 동작 방식
일반적인 검색 엔진이 웹에 존재하는 공개된 문서를 사용자에게 제공하기까지의 처리 순서는 다음과 같습니다. 아주 간략하게는 웹에 공개되어 있는 문서의 링크를 따라가며 문서를 수집(검색 용어로는 이 단계를 크롤(crawl)이라고 부름)하고, 문서에서 단어(토큰)를 추출하여 색인(인덱스)을 만든 다음 사용자가 검색어를 입력하였을 때 미리 만들어 둔 색인에서 관련된 문서를 찾아 제공하는 구조입니다. 검색 로봇이라고 불리는 웹 공개 문서 수집 소프트웨어는 검색 엔진의 첫 번째 단계에서 공개된 질 좋은 문서를 얻기 위해 웹 문서에 포함된 링크를 따라 다른 페이지를 찾아다닙니다. 그런데 웹 문서를 수집하기 전에 반드시 맨 먼저 확인하는 것이 있습니다. 바로 해당 사이트의 어떤 문서를 수집하지 말아야 하는지가 적힌 robots.txt파일입니다.
robots.txt의 내용은 검색 엔진이 지켜야 할 법적 강제 사항은 아니지만 웹 사이트를 관리하는 웹마스터와 검색엔진 사이의 약속으로 구글을 포함한 대부분의 건전한 검색엔진들은 이 약속을 이행하고 있습니다. 즉, 웹마스터가 검색 로봇을 부릴 수 있는 권리인 것입니다.
robots.txt 파일을 올바로 설정해야 하는 이유
robots.txt 파일을 올바로 설정해야 할 가장 큰 이유는 공개하지 말아야 할 문서의 범위를 검색 로봇에게 알리기 위함입니다. 초기의 웹은 정보의 공유와 홍보의 목적으로 만들어졌기 때문에 검색 엔진에 공개되어도 문제가 없는 것들이 대부분이었지만 웹이 발전하면서 실수로든 의도적으로든 웹에 공개되어서는 안될 정보들이 올라오고 이를 검색 로봇이 비의도적으로 수집을 하게 된 것입니다. robots.txt 는 검색 로봇에 수집하지 말아야 할 것을 알려주는 가장 기본적이며 간단한 약속입니다.
그러면 어떻게 robots.txt를 설정하는 것이 올바른 방법일까요? 정보 공유를 위해 홍보를 위해 정성들여 만든 문서를 문을 걸어두고 집안에만 감춰두는 ‘은둔형 외톨이’식이 좋을까요, 감춰두어야 할 비밀스러운 것까지 모두 내 보이는 ‘과다노출증’식이 좋을까요? 네, 감출 것은 적절하게 가리고 사람들에게 알려야 할 것은 적극적으로 알려야겠습니다.
robots.txt 파일에서 가장 중요한 규칙 두 가지가 User-agent와 Disallow입니다. 먼저 User-agent는 해당 규칙이 어떤 검색 로봇을 대상으로 하는 것인지 규정합니다. 참고로, 대부분의 검색 로봇은 고유의 이름을 가지고 있습니다. 예를 들어, 구글의 웹 검색 로봇의 이름은 Googlebot입니다. 그 다음으로 Disallow에는 어떤 디렉토리 또는 파일을 검색 로봇이 읽지 못하도록 할 것인지를 알려줍니다.
전세계 20개국 모임인 G20의 서울 정상회의가 성공적으로 끝났습니다. 개인적으로는 이번 정상회의를 통해 한국이 의장국으로서 전세계의 주목을 받아 한국인이라는 자부심을 느끼게 되는 계기가 되었는데요, 옥의 티같은 아쉬운 점이 있어 이야기를 해보려고 합니다.
여러분은 G20 서울 정상회의의 공식 홈페이지가 어디에 있는지 아십니까?
주요 검색 사이트에서 ”G20 서울 정상회의 공식 홈페이지"라고 검색하면 바로 찾을 수 있습니다. 한국의 이미지를 잘 살려서 정성스레 준비한 홈페이지인 http://www.seoulsummit.kr/ 이나 http://www.g20.go.kr/ 을 찾으실 수 있습니다. 실은 이들 주요 검색사이트에서 바로 나오는 "G20" 관련 사이트 검색결과는 인위적으로 만들어놓은 바로가기 사이트입니다.
그런데 한국어를 모르는 외국인이 영어로 된 공식 홈페이지를 찾으려면 어떻게 될까요? “G20 Seoul Summit official homepage”라고 주요 검색 사이트에서 검색을 하면 서울 정상회담 공식 홈페이지는 찾기가 힘듭니다. 대신 원하지 않았던 뉴스 사이트나 서울 정상회담의 공식홈페이지가 아닌 일반 G20 홈페이지 등이 검색결과로 나옵니다. 사실 영어로 된 서울 정상회담 공식 홈페이지가 홍보를 위해 정성들여 잘 준비되어 있음에도 이 공식 페이지는 검색 사이트(국내 포털에서 조차)에서 검색결과에 나오지 않습니다.
세계의 관심과 기대를 모았던 행사의 공식 홈페이지조차 검색되지 않는 이 사태를 외국인들은 어떤 시각으로 바라보았을지 얼굴이 뜨뜻해집니다.
왜 그럴까요? 이것이 G20 Summit 사이트 한 사이트만의 문제일까요? 대한민국의 많은 사이트들이 세계적으로 잘 알려진 ’검색 로봇 제어 표준'이라는 간단한 기술 표준을 잘못 사용하면서 이런 현상이 한국 웹 전체에 만연하고 있습니다. 홍보를 위해 정보 공유를 위해 정성을 들여 만들어 놓고는 정작 문을 꼭 닫고 집안에 들어앉은 ’은둔형 외톨이'가 되고 만 것입니다.
홍보를 위해 많은 투자를 하고 있지만 사실은 단순한 기술 표준만 지키면 돈을 들이지 않고도 전세계에 시간과 공간을 뛰어넘어 우리가 보여주고 싶은 것들을 원없이 알릴 수 있는 곳이 바로 인터넷입니다. 과연 그 방법이 무엇인지 궁금하지 않으세요?
자, 다음번 포스트에서는 정말 간단한 방법으로 세계인들의 주목을 받을 수 있는 방법을 소개해 드리겠습니다. 기대해 주세요.