미친해커

[Web] Python Flask Google reCAPTCHA v3 적용하기 본문

Web

[Web] Python Flask Google reCAPTCHA v3 적용하기

미친해커 2022. 1. 15. 09:54
반응형

구글의 reCAPTCHA를 적용하려고 검색하던 도중 버전이 v2와 v3(v1은 지원이 종료됨) 이렇게 2가지가 존재한다는 것을 알게되었다. 또 직접 사용해보면서 차이점을 알게되었다. v3는 로봇이 아닙니다와 다르게 점수를 이용해 로봇인지를 파악한다. (필자도 아직 어떠한 식으로 로봇을 판단하는지 잘 모르겠다) 우선 reCAPTCHA 사이트 접속하자.

 

로그인 - Google 계정

하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인

accounts.google.com

사이트에 들어가 다음과 같이 등록해준다.

도메인에는 실제 본인의 도메인을 넣도록한다. 필자는 127.0.0.1 localhost로 웹 서버를 열어 테스트를 진행할 예정이라 127.0.0.1으로 등록했다. 이후 제출 버튼을 누르면 다음과 같은 화면을 볼수 있다.

사이트 키 : 웹 사이트에서 토큰을 발급받기 위해 사용하는 키
비밀 키 : 웹 서버가 토큰이 유효한지 확인하기 위해 사용하는 키

이렇게 정상적으로 키가 발급되었다면 이제 Python 라이브러리를 다운받도록 하자

$ pip install flask
$ pip install requests
# 서버 코드
# file name : run.py
import requests
from flask import Flask, request, render_template

app = Flask(__name__)

RECAPTCHA_API_URL = 'https://www.google.com/recaptcha/api/siteverify'
RECAPTCHA_SITE_KEY = '사이트 키'
RECAPTCHA_SECRET_KEY = '비밀 키'

@app.route('/', methods=['GET', 'POST'])
def default():
    message = ''
    if request.method == 'POST':
        grecaptcha = request.form.get('g-recaptcha-response')
        remoteip = request.remote_addr # Client의 IP 주소를 필수가 아니다. 

        data = {'secret':RECAPTCHA_SECRET_KEY, 'response':grecaptcha, 'remoteip':remoteip}
        data = requests.get(RECAPTCHA_API_URL, params=data).json()

        if data['success']:
            if data['score'] > 0.5:
                message = 'success'
            else:
                message = 'maybe robot'
        else:
            message = 'failed'
    return render_template('v3.html', message=message, RECAPTCHA_SITE_KEY=RECAPTCHA_SITE_KEY)
<!-- file name : v3.html -->
<!DOCTYPE html>
<html>
    <head>
        <title>Flask ReCaptcha Tutorial</title>
        <script src="https://www.google.com/recaptcha/api.js?render={{ RECAPTCHA_SITE_KEY }}"></script>
        <script type="text/javascript">
            function get_recaptcha()
            {
                grecaptcha.execute("{{ RECAPTCHA_SITE_KEY }}").then(function(token) {
                        document.getElementById('g-recaptcha-response').value = token;
                });
            }
        </script>
    </head>
    <body>
        <form method="POST">
            <input type="submit">
            <!-- 토큰 값을 받아 저장할 태그 -->
            <input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response" />
        </form>
        <p>{{ message }}</p>
        <button onclick="get_recaptcha()">캡챠 코드 발급</button>
    </body>
</html>

아래 압축파일에 미리 환경을 셋팅해뒀다. 잘 모르겠다면 다운받아서 run.py 만 실행하면 된다.

reCAPTCHA.zip
0.00MB

웹 사이트를 가동시켜 확인해보면 정상적으로 동작하는 것을 볼수 있다.

reCAPTCHA v3는 v2와 다르게 인증 토큰을 자바 스크립트를 이용해 발급받고 서버에서 해당 토큰을 발급 받은 자에 대한 점수를 매긴다. 점수는 0.0 ~ 1.0 점으로 사이로 나오고 1.0 점에 가까울 수록 사람에 가깝다는 것이 된다. 즉 success로 캡챠 성공여부를 확인하고 score로 점수를 확인하여 본인이 충족해야한다고 하는 점수 이상이라면 사람으로 판단하고 처리할 수 있는 것이다.

반응형

'Web' 카테고리의 다른 글

[Web] Python Flask Google reCAPTCHA v2 적용하기  (0) 2022.01.06
Comments