Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 CAPTCHA 생성 및 사용자 검증 프로그램 만들기

개요

이 글에서는 C++를 사용하여 CAPTCHA를 생성하고 사용자의 입력을 검증하는 프로그램을 만드는 방법을 살펴봅니다.

CAPTCHA는 'Completely Automated Public Turing test to tell Computers and Humans Apart'의 약자로, 사람과 자동화 프로그램(봇)을 구분하기 위한 테스트입니다. 회원가입, 로그인, 게시글 작성 등 다양한 온라인 서비스에서 쉽게 접할 수 있으며, 스팸과 악성 봇을 차단하는 기본적인 보안 장치로 널리 활용됩니다.

동작 원리

이 프로그램은 다음과 같은 순서로 동작합니다.

  1. 시스템이 무작위로 문자열을 생성하여 사용자에게 출력합니다.
  2. 사용자는 화면에 표시된 문자열을 그대로 다시 입력합니다.
  3. 입력받은 문자열과 처음 생성한 CAPTCHA를 비교하여 일치 여부를 판단합니다.

생성되는 CAPTCHA는 완전히 무작위여야 하며, 영문 소문자(a-z), 영문 대문자(A-Z), 숫자(0-9)로만 구성됩니다.

예제 코드

#include<bits/stdc++.h>
using namespace std;
// 두 문자열이 같은지 검사하는 함수
bool check_string(string &captcha, string &user_captcha){
    return captcha.compare(user_captcha) == 0;
}
// 무작위 CAPTCHA 문자열을 생성하는 함수
string gen_captcha(int n){
    time_t t;
    srand((unsigned)time(&t));
    char *chrs = "abcdefghijklmnopqrstuvwxyzABCDEFGHI" "JKLMNOPQRSTUVWXYZ0123456789";
    string captcha = "";
    while (n--)
        captcha.push_back(chrs[rand()%62]);
    return captcha;
}
int main(){
    string captcha = gen_captcha(9);
    cout << captcha;
    string usr_captcha;
    cout << "\nEnter CAPTCHA : ";
    usr_captcha = "fgyeugs56";
    if (check_string(captcha, usr_captcha))
        printf("\nCAPTCHA Matched");
    else
        printf("\nCAPTCHA Not Matched");
    return 0;
}

실행 결과

nwsraJhiP
Enter CAPTCHA :
CAPTCHA Not Matched

코드 설명

gen_captcha() — CAPTCHA 생성 함수

매개변수 n으로 전달받은 길이만큼의 무작위 문자열을 생성합니다. 사용 가능한 전체 문자 집합은 소문자 26개, 대문자 26개, 숫자 10개로 총 62개이며, rand()%62 연산으로 인덱스를 무작위 선택한 후 해당 문자를 하나씩 이어 붙여 CAPTCHA를 완성합니다. 또한 srand((unsigned)time(&t))를 호출하여 실행 시점마다 다른 난수 시퀀스가 나오도록 초기화합니다.

check_string() — 문자열 비교 함수

string 클래스의 compare() 메서드를 사용하여 시스템이 생성한 CAPTCHA와 사용자가 입력한 문자열이 동일한지 확인합니다. 두 문자열이 같으면 compare()는 0을 반환하므로, 이 반환값을 검사해 일치 여부를 판단합니다.

main() — 전체 흐름 제어

길이 9짜리 CAPTCHA를 생성해 화면에 출력한 뒤 사용자 입력을 받습니다. 이 예제에서는 데모 목적으로 usr_captcha 변수에 직접 값을 대입했지만, 실제 환경에서는 cin 등을 통해 사용자로부터 입력을 받아 처리하게 됩니다.

참고 사항

srand(time(NULL)) 방식은 간단하지만 예측 가능성이 있다는 한계가 있습니다. 실제 서비스 환경에서는 보안을 위해 C++11의 <random> 헤더(std::mt19937 등)나 운영체제가 제공하는 암호학적으로 안전한 난수 생성기를 사용하는 것이 권장됩니다. 또한 실제 웹 서비스에서는 이미지 왜곡, 배경 노이즈 추가 등의 기법을 함께 적용해야 봇의 OCR 공격을 효과적으로 막을 수 있습니다.