클로킹 & 콘텐츠 생성

초보자를 위한 클로킹(Cloaking) 사용법 설명

2017-07-19
6

클로킹은 정말 오래된 바이럴리(바이럴리) 방법 중 하나예요. 기본 아이디어는 간단한데, 사용자에게는 SEO에 최적화된 랜딩 페이지를 보여주고 봇에게는 마르코프 텍스트나 키워드가 가득 찬 SEO 최적화 콘텐츠를 보여주는 거죠. 이걸 구현하는 방법은 여러 가지가 있지만, 가장 흔한 방법들을 알려드릴게요.

**사용자 에이전트(User Agent) 클로킹:**

웹사이트를 방문할 때마다 브라우저는 사용자가 어떤 브라우저를 쓰는지 알려주는 '사용자 에이전트' 문자열을 보내요. 그래서 웹사이트들이 특정 브랜드에 맞춰 최적화할 수 있게 하죠. (어떤 브라우저는 특별한 처리가 필요할 때가 있거든요.) 보통 그냥 UA라고 줄여 부르니, 다음에 들으시면 이 뜻인 줄 아시면 돼요.

하여튼 파이어폭스(Firefox)의 경우는 대략 이렇게 생겼어요:

```

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0

```

모든 브라우저는 각자 다른 UA를 가지고 있고, 봇들도 마찬가지예요. 예를 들어 구글봇(Googlebot)의 사용자 에이전트는 이렇게 생겼어요:

```

Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

```

이제 간단한 패턴 매칭을 통해 클로킹 스크립트가 사용자 에이전트를 확인해서 실제 웹사이트 버전을 보여줄지, 아니면 클로킹된 버전을 보여줄지 결정해요. 이 방법은 PHP나 CGI처럼 HTML이 렌더링되기 전에 코드가 먼저 실행될 때 가장 잘 작동하지만, 자바스크립트로도 구현할 수 있답니다.

**리퍼러(Referrer) 클로킹:**

이 방법은 사용자 에이전트 클로킹이랑 비슷한데, 이번에는 링크를 클릭했을 때 브라우저가 보내는 '리퍼러' 문자열을 확인해요. 여기에는 접속해 온 도메인 정보가 담겨 있거든요. 참고로 'referer'가 원래 철자인데, 브라우저는 'referrer' 대신 'referer'를 보내요. 이건 원래 RFC(Request For Comments) 문서에 오타가 있어서 프로토콜 명세에 그렇게 정의된 바람에 모두가 틀린 철자를 쓰게 된 거랍니다. 이게 뭔지 모르신다면, 컴퓨팅 세계의 모든 프로토콜은 상세한 기능을 설명하는 RFC가 존재하고, 이 '사용자 에이전트'나 '리퍼러' 같은 것도 HTTP 표준에 기반하는데 이 표준도 RFC에 설명되어 있어요. 그래서 작동 원리가 궁금하시면 RFC를 찾아보세요! 아무튼 약간의 배경지식은 이 정도로 하고, 다시 리퍼러 클로킹으로 돌아갈게요. 말씀드렸듯이, 사용자가 링크를 따라 들어올 때 브라우저가 이 리퍼러 정보를 보내죠.

이해를 돕기 위해, 웹사이트를 요청할 때 브라우저가 서버로 보내는 실제 헤더 패킷(GET 요청이라고 해요)을 보여드리는 게 좋을 것 같아요:

```

GET /url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved= HTTP/1.1

Host: www.google.de

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: de,en-US;q=0.7,en;q=0.3

Accept-Encoding: gzip, deflate

DNT: 1

Referer: https://www.google.de

Cookie: NID=73=CxfcRkEuVWqfY6ZPQ_xEsHiF0nCywwmFO7O0EZbHr8OScN-

Connection: keep-alive

```

여기서도 똑같이 패턴 매칭 기술을 'referer' 필드에 적용하는 거예요. 만약 사용자가 구글 검색에서 왔다면 리디렉션하고, 아니면 실제 사이트를 보여주는 식이죠.

**IP 클로킹:**

이건 좀 더 발전된 방법인데, 알려진 봇 IP를 추적해서 IP 기반으로 클로킹하는 방식이에요. 수천 개의 IP 항목을 가진 기존 봇 목록도 있고, 구독을 통해 업데이트된 IP 리스트를 제공하는 서비스 제공업체도 있거든요. 하지만 단점이 있어요. 봇 IP가 하나라도 새로 생기면 전체 설정이 엉망이 되고 봇을 차단하지 못하게 되죠. 오해하지 마세요, 업데이트된 리스트를 사용하면 한동안은 꽤 신뢰할 수 있지만, 최신 IP를 계속해서 쫓아다녀야 하는 사냥 같은 일이라는 거죠. 작동 원리는 간단해요. 스크립트가 방문자 IP를 봇 리스트와 대조해서(이 과정이 페이지 로딩 속도를 느리게 만들 수도 있어요) 봇인지 아닌지 판단하는 거예요. 여기서 어려운 건 코드가 아니라 봇 IP를 계속 업데이트하는 일이에요. 저는 이 문제를 안정적으로 해결하는 'FinalCloak'라는 클로커를 개발했는데, 아직 비공개 베타 중이에요. 공개되면 더 자세히 말씀드릴게요(2014년부터 테스트해왔고 지금까지 잘 작동하고 있답니다). 이 문제도 해결 가능하다는 힌트 정도로 알아두세요.

**rDNS 확인:**

이건 다른 클로킹 방법에 추가로 사용하는 확인 작업에 가까워요. 'rDNS'는 '리버스 DNS(reverse DNS)'의 약자이고, IP의 기본 호스트 이름을 의미해요. 아시다시피 하나의 IP에 여러 가상 웹사이트가 호스팅될 수 있지만, IP는 항상 하나의 호스트 이름으로 해석되잖아요? 구글의 경우 'googlebot.com'으로 해석되는데, IP가 구글봇인지 확인하는 것뿐만 아니라 rDNS 항목이 일치하는지도 확인하는 게 좋다는 거죠. '사용자 에이전트'는 누구나 자유롭게 설정할 수 있기 때문에 쉽게 속일 수 있어요. 스크립트(또는 브라우저 플러그인)를 설치해서 구글봇의 UA로 위장하고 클로킹을 우회해서 경쟁사를 엿볼 수도 있거든요. 구글의 수동 검토자들이 이런 시도를 할 수도 있지만, 추가적인 rDNS 확인이 있다면 구글 UA를 사용하더라도 제대로 클로킹될 거예요.

**0-day(제로데이) 방식:**

몇 가지 비공개 기술들이 있지만, 당연히 여기서 공개적으로 다 털어놓을 수는 없겠죠. 그러면 많은 분들이 저한테 욕하실 테니까요. ㅎㅎ

**클로킹의 다양한 유형:**

주요 방법 외에도 다음과 같이 접할 수 있는 다양한 유형의 클로킹이 있어요.

- **모자이크 클로킹(Mosaic Cloaking):** 보통 페이지 전체를 클로킹하지만, 모자이크 클로킹은 은밀함을 유지하기 위해 웹사이트의 일부만 클로킹하는 거예요. 보통 구글이 좋아하지 않는 추가 콘텐츠가 담긴 div나 '폴드 위(above the fold)' 광고 같은 특정 부분만 건드리는 식이죠.

- **링크 클로킹(Link Cloaking):** 웹사이트에 너무 많은(혹은 아예) 제휴 링크가 있는 것을 피하기 위해 링크만 클로킹하는 거예요. 그래서 실제 사용자는 제휴 링크를 보지만, 구글은 보지 못하게 하는 거죠.

일단 오늘은 여기까지예요. 이 작은 소개가 시작하는 데 도움이 되었으면 좋겠네요!

댓글