2015년 12월 18일 금요일

API : Google reCaptcha 사용하기

스팸 같은 자동 글 등록기를 이용한 글 등록을 방지하기 위해 가장 흔히 쓰는게 Captcha 체크다.
보통은 직접 구현을 하지만, Captcha 서버를 따로 두거나 기능을 구현하기도 쉬운일이 아니므로, 간단히 Google 이 제공하는 Api 를 이용해 쉽게 구현 할 수 있다.

일단은 사용할 사이트를 Google 에 등록하고 키를 받아야 한다.



사용 키를 받는 다른 API 에 비해 정말 등록법이 간단한데, 그냥 사용할 도메인 리스트만 기록하고 등록하면 된다.


등록하면 2개의 키 (Site Key, Secret Key) 를 주는데, 사용법은 아래에 있는 코드를 그냥 사용할 위치에 삽입하기만 하면 된다.

참고로 Site Key 는 Html (클라이언트) 에서 캡챠를 생성할 때 쓰이는 것이고,
Secret Key 는 서버로 데이터를 전송했을 때 서버에서 캡챠값을 체크 할때 쓰이는 것이다.


이렇게 하면... (여기서 SiteKey 가 쓰임)


이렇게 캡차 체크가 나타난다.
이곳의 체크 박스를 클릭하면 자동 입력 프로그램인지, 실제 사람인지를 체크한다.
(클릭해보면 일반적으로는 그냥 체크만 되고 끝날 것이다. 다른 캡챠에 비해 허술해 보이지만 그렇지 않다. 보통은 그냥 바로 체크만 되고 끝나기 때문에 별것 아닌것 같아 보이지만, 실제로는 사용자 아이피 대역을 가지고 Google 스팸 블랙리스트를 체크하기 때문에 스팸사용자로 등록된 아이피 대역대의 사용자는 별도의 인증창을 띄워 좀더 까다롭게 체크한다. 내가 알기로는 전세계의 어떤 사이트에든 단 한번이라도 스패머로 인식될 경우 Google 캡챠를 쓰는 전세계 모든 사이트에서 스패머로 인식이 된다. 즉, 전문적인 스팸 등록자의 경우 구글 캡챠를 통과하기 어렵다.)

그러면 캡챠 체크여부는 이렇게...

function chkCaptcha() {
    if (typeof(grecaptcha) != 'undefined') {
if (grecaptcha.getResponse() == "") {
          alert("스팸방지코드를 확인해 주세요.");
          return false;
}
    }
    else {
return false;
    }
}

이렇게 자바 스크립트로 체크를 한다. (grecaptcha 는 html 에 기록한 캡챠의 id 임)
이때는 단지 캡챠에 체크가 되어 있는지 만을 체크한다.
자동 등록 프로그램으로는 Google 캡차에 체크를 할 수 없기 때문에, 보통은 이렇게 체크 여부만  체크해줘도 어지간한 자동 등록 프로그램을 막을 수 있다.

하지만, 단순히 클릭질만 하는 매크로 정도라면 막을 수 있지만, 좀더 전문적인 자동 매크로는 이정도는 통과 하는데... (체크되지 않았는데 체크되었다고 속일 수가 있다) 이 경우까지 막으려면 서버단에서 한번더 체크 해주면 된다.

즉, "등록하기" 버튼을 클릭해 "Submit" 이 발생했을 때, 데이터가 전송된 서버에서 캡챠값을 정확한 값인지 체크해보면 된다. (체크 했다고는 속일 수는 있지만, 체크되었을 때 생성되는 체크값 까지 조작하기는 어렵다) 

그러니까. 요렇게...


클릭했을때 생성되는 캡챠값이 Google 인증 서버에 보내서 정확한 값인지를 체크하면 된다.
뭔가 대단해 보이지만, 단순히 구글 인증 서버에 POST 를 보내 결과 값을 jSon 으로 받는 것이다. (꼭 위의 방식으로 하지 않아도 된다.)
주의 할 것은 "127.0.0.1" 이나 "localhost" 에서 테스트 하는 경우에는 그냥 결과 값을 보내 주지만, 일반적인 도메인 이라면 최초에 등록한 도메인에서 정확한 키값을 보내지 않으면 실패하지 주의 해야 한다.

만약 제대로된 인증이라면....


이렇게 "success" : true 라는 값을 보내 준다.

만약 잘못되었다면...

이렇게 오류 메시지를 보내 준다.
저렇게 보내준 값을 잘 알아서 쓰면 된다.