[python] 웹 서버에 캡차 기능 추가하기

이번 포스트에서는 파이썬을 사용하여 웹 서버에 캡차(문자 인증) 기능을 추가하는 방법을 알아보겠습니다. 캡차는 자동 로봇이나 스팸 봇으로부터의 악성 요청을 방지하는 역할을 합니다.

1. 캡차 이미지 생성하기

캡차 이미지를 생성하기 위해 Pillow 라이브러리를 사용합니다. Pillow는 파이썬에 대한 이미지 처리 라이브러리로, 이미지를 생성하고 조작하는 다양한 기능을 제공합니다.

from PIL import Image, ImageDraw, ImageFont

def generate_captcha(text):
    # 이미지 크기
    width, height = 200, 100

    # 배경색과 글자색
    background_color = (255, 255, 255)  # 흰색
    text_color = (0, 0, 0)  # 검은색

    # 폰트와 폰트 크기
    font_size = 40
    font = ImageFont.truetype("arial.ttf", font_size)

    # 캡차 이미지 생성
    image = Image.new("RGB", (width, height), background_color)
    draw = ImageDraw.Draw(image)
    text_width, text_height = draw.textsize(text, font=font)
    text_x = (width - text_width) // 2
    text_y = (height - text_height) // 2
    draw.text((text_x, text_y), text, font=font, fill=text_color)

    return image

위 코드는 generate_captcha 함수를 사용하여 주어진 텍스트를 가진 캡차 이미지를 생성합니다. 이미지의 폭과 높이, 배경색과 글자색, 폰트 및 폰트 크기를 설정할 수 있습니다.

2. 웹 서버에 캡차 기능 추가하기

이제 Flask 웹 서버를 사용하여 캡차 기능을 구현해보겠습니다. Flask는 파이썬 기반의 경량 웹 프레임워크로, 웹 애플리케이션을 쉽게 개발할 수 있도록 도와줍니다.

from flask import Flask, request, render_template
from PIL import Image

app = Flask(__name__)

@app.route("/captcha", methods=["GET"])
def captcha():
    # 캡차 텍스트 생성 (임시로 랜덤 문자열 사용)
    captcha_text = "ABCD"

    # 캡차 이미지 생성
    image = generate_captcha(captcha_text)

    # 캡차 이미지를 메모리로 저장
    image_io = BytesIO()
    image.save(image_io, "JPEG")
    image_io.seek(0)

    # 캡차 이미지를 웹 브라우저에 전송
    return send_file(image_io, mimetype="image/jpeg")

if __name__ == "__main__":
    app.run()

위 코드는 Flask 웹 서버를 생성하고 /captcha 경로에 GET 요청을 받으면 캡차 이미지를 생성하여 응답으로 전송하는 간단한 예시입니다. 캡차 텍스트와 이미지 생성은 앞서 작성한 generate_captcha 함수를 사용합니다.

마무리

이제 파이썬 기반 웹 서버에 캡차 기능을 추가하는 방법을 알아보았습니다. 캡차는 웹 애플리케이션의 보안을 강화하고, 스팸 및 악성 요청을 방지하는 중요한 요소입니다. 이를 통해 사용자들에게 안전한 웹 경험을 제공할 수 있습니다.

참고 자료: