Daylogs/Security
구글 리캡차(Google ReCaptcha) 적용하기
ohgyun
2015. 5. 16. 00:52
발생일: 2015.05.16
키워드: Google Recaptcha, Captcha, 캡차, 리캡차
문제:
진행하고 있는 서비스에 구글 리캡차를 적용하려고 한다.
"리"캡차이지만, 현재 활용되고 있는 방식은 예전과 다르게 원클릭으로 사람인지 판단하는 방식이다.
브라우저의 인터랙션을 보고 사용자인지를 판단하는 것 같은데, 생각보다 뭔가 더 똑똑한 알고리즘이 내장되어 있을 것 같다.ㅎㅎ
어떻게 적용하면 되지?
해결책:
발급과 적용 과정 모두 엄청 간단하다.
1. 리캡차 개발자 페이지에서 캡차를 등록한다.
서비스명과 캡차가 노출될 도메인 목록을 작성한 후에 서브밋하면 바로 키가 발급된다.
2. 등록이 완료되면, 공개키와 비밀키가 발급된다.
공개키는 클라이언트에서 요청을 보내는 용도로, 비밀키는 서버에서 검증하는 용도로 사용된다.
3. 가이드를 보고, 서버와 클라이언트에 코드 스니핏을 적용하면 된다.
동작 방식을 추측해보면,... 대충 아래와 같을 것으로 보인다.
1. 클라이언트 API가 캡차를 로드할 때, 공개키를 파라미터로 전달한다.
1.1. 서버에서는 세션을 생성하고, 1회성 토큰을 내려준다.
2. 사용자가 `I'm not a robot`의 체크박스를 클릭한다.
2.1. 이 때 클라이언트 API는 백그라운드 액션을 데이터로 만드는 것 같아 보인다...
2.2. 인터랙션을 보고 사람이라고 판단했다면, 공개키와 토큰과 데이터를 캡차 서버에 전달한다.
2.3. 캡차 서버에서는 토근과 데이터의 값을 기반으로 새 값을 만들어 세션에 저장한다.
2.4, 생성한 값을 공개키로 암호화한 후 응답 토큰으로 내려준다.
2.5. 클라이언트 API에서는 응답 토큰을 `<input name="g-recaptcha-response>` 엘리먼트에 할당한다.
3. 캡차를 포함한 폼을 애플리케이션 서버로 서브밋한다. 이 때, 응답 토큰을 포함해 보낸다.
3.1. 애플리케이션 서버에서는 발급받은 비밀키와 응답 토큰으로 캡차 서버에 인증 요청을 보낸다.
3.2. 캡차 서버에서는 파라미터로 받은 비밀키로 응답 토큰을 복호화하고, 세션에 저장된 값과 비교해 응답한다.
3.3. 응답이 유효하면 성공!
추측일 뿐이고,ㅎㅎ 훨씬 더 견고하게 잘 만들어져 있을 거라 믿는다.
여튼, 원클릭 방식의 리캡차-
기존 방식에 비해 엄청 깔끔하고, 무려 적용하기도 쉽다! 굿굿!
반응형