Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Django 웹사이트에 캡차(Captcha)를 손쉽게 추가하는 방법

캡차(Captcha)는 현대 웹사이트에서 사용자 검증을 위해 가장 널리 사용되는 방법 중 하나입니다. 봇이나 악성 트래픽을 차단하는 데 매우 효과적이어서 수많은 웹사이트가 이를 활용하고 있습니다. Google reCAPTCHA를 사용할 수도 있지만, 설정 과정이 다소 번거로울 수 있습니다. 다행히 Django에서는 django-simple-captcha라는 라이브러리를 통해 훨씬 간단한 방법으로 캡차를 구현할 수 있습니다.

이 글에서는 Django 웹사이트에 캡차를 만들고 적용하는 방법을 단계별로 알아보겠습니다.

구현 예제

먼저 Django 프로젝트와 앱을 생성합니다.

그다음 django-simple-captcha 라이브러리를 설치합니다:

pip install django-simple-captcha

settings.py 파일을 열고 INSTALLED_APPS 목록에 본인의 앱 이름과 "captcha" 모듈을 추가합니다:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "captchaproject", # 내 앱 이름
    "captcha" # 캡차 모듈
]

이렇게 하면 캡차가 하나의 앱으로 프로젝트에 등록됩니다.

프로젝트 루트 디렉터리의 urls.py에 다음 코드를 추가합니다:

from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include("captchaproject.urls")),
    path('captcha/', include("captcha.urls"))
]

이 설정을 통해 내 앱의 URL과 함께 캡차 검증이 이루어질 전용 URL도 등록됩니다.

앱의 메인 디렉터리에 forms.py 파일을 생성하고 아래와 같이 작성합니다:

from django import forms
from captcha.fields import CaptchaField

class MyForm(forms.Form):
    captcha = CaptchaField()

여기서 CaptchaField를 포함한 폼 클래스를 정의했습니다.

작업 후에는 반드시 python manage.py migrate 명령을 실행하여 데이터베이스 마이그레이션을 완료해야 합니다. 캡차는 검증 정보를 데이터베이스에 저장하기 때문에 이 단계가 필수입니다.

이제 앱의 views.py에 다음 코드를 추가합니다:

from django.shortcuts import render
from .forms import MyForm

# Create your views here.
def home(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            print("success")  # 캡차 검증 성공
        else:
            print("fail")  # 캡차 검증 실패
    form = MyForm()
    return render(request, "home.html", {"form": form})

home 뷰에서 폼을 렌더링하며, POST 요청이 들어오면 폼 유효성 검사를 통해 캡차를 확인하고 그 결과를 출력합니다.

templates 디렉터리(HTML, CSS 파일을 관리하는 폴더)에 HTML 파일을 생성하고 다음 코드를 작성합니다:

<!DOCTYPE html>
<html>
    <head>
        <title>캡차 예제</title>
    </head>
    <body>
        <form method="POST" novalidate>
            {%csrf_token%}
            {{form.captcha}}
            <input type="submit" value="제출">
        </form>
    </body>
</html>

이것이 캡차 폼을 화면에 렌더링하는 프런트엔드 부분입니다. {%csrf_token%} 태그는 CSRF 공격을 방지하기 위해 반드시 포함해야 합니다.

모든 설정이 끝났습니다. 서버를 실행하고 브라우저에서 결과를 확인해 보세요. 이미지가 표시되고, 올바른 문자를 입력하면 성공 메시지가 출력됩니다.

실행 결과

Django 웹사이트에 캡차(Captcha)를 손쉽게 추가하는 방법

이처럼 django-simple-captcha 라이브러리를 활용하면 Google reCAPTCHA 없이도 몇 줄의 코드만으로 웹사이트에 강력한 보안 문자 기능을 손쉽게 구현할 수 있습니다. 회원가입, 로그인, 댓글 작성 등 봇 스팸이 우려되는 모든 폼에 응용해 보시기 바랍니다.