**CAPTCHA**는 HIP(Human Interaction Proof) 기술의 일종으로, 어떠한 사용자가 실제 사람인지 컴퓨터 프로그램인지를 구별하기 위해 사용되는 방법이다. 사람은 구별할 수 있지만 컴퓨터는 구별하기 힘들게 의도적으로 비틀거나 덧칠한 그림을 주고 그 그림에 쓰여 있는 내용을 물어보는 방법이 자주 사용된다. 이것은 기존의 텍스트와 이미지를 일그러뜨린 형태로 변형한 후 인식 대상이 변형된 이미지로부터 기존 이미지를 도출해 낼 수 있는지를 확인하는 방식의 테스트이다. 컴퓨터 프로그램이 변형시킨 이미지는 사람이 쉽게 인식 할 수 있지만 컴퓨터 프로그램은 변형된 이미지를 인식하지 못하므로 테스트를 통과하지 못한다면 테스트 대상이 사람이 아님을 판정할 수 있다. 흔히 웹사이트 회원가입을 할 때 뜨는 자동가입방지 프로그램 같은 곳에 쓰인다.

CAPTCHA는 기기가 사람을 대상으로 하는 테스트이므로 사람에 가까운 기기를 대상으로 하는 테스트인 튜링 테스트(Turing test)에서 용어를 따와 리버스 튜링 테스트(Reverse Turing test)라고 부르기도 한다.

## 원리
CAPTCHA는 기계는 인식할 수 없으나 사람은 쉽게 인식할 수 있는 텍스트, 이미지를 통해 사람과 기계를 구별하는 프로그램이다. 가장 일반적인 방법은 OCR 프로그램의 한계를 이용한 텍스트 CAPTCHA이며 다음과 같은 과정을 거쳐 사람과 기계를 판별한다.

CAPTCHA가 사람과 기계를 구별하는 과정을, PHP로 만들어진 텍스트 CAPTCHA 프로그램의 구조를 통해 살펴보면 다음과 같다.

(전략)

	$zsfN = $thisZsfCfg['codeForm'];
	switch ( $zsfN ) {
		case 1:	# A 와 B 중 큰 수는?
			if ( isset($zsfCfg['codeCfg'][1]) && zsfVarChk ) { $thisZsfCfg['codeCfg'][1] = intval($zsfCfg['codeCfg'][1]); }
			$zsfMax = pow - 1;
			$zsfNum = array ( mt_rand, mt_rand );
			if ( $zsfNum[0] == $zsfNum[1] ) { $zsfNum[0] --; shuffle($zsfNum); }
			$zsfA = max($zsfNum);
			switch ( $thisZsfCfg['view'] ) {
				case 3:
					$zsfQ = $zsfNum[0].$thisZsfCfg['josa'][$thisZsfCfg['jong'][substr]].' '.$zsfNum[1].'중 큰 수는?';
					break;
				default:
					$zsfQ = 'WHICH IS BIGGER '.$zsfNum[0].' OR '.$zsfNum[1].' ?';
			break;

(중략)

$zsfIm = imageCreateTrueColor ;
$zsfCol = array ( array(mt_rand, mt_rand, mt_rand), array(mt_rand, mt_rand, mt_rand) );
shuffle ( $zsfCol );
$zsfImBg = imageColorAllocate  ;
$zsfImFg = imageColorAllocate  ;
imagefill  ;
$thisZsfCfg['offX']=0;
foreach ( $zsfQArr as $zsfQv ) {
	foreach ( $imgFontMap[$zsfQv] as $v ) {
			$x = substr*1+$thisZsfCfg['offX'];
			$y = substr*1;
			if ( isset($zsfCfg['distortion']) && $zsfCfg['distortion'] == 1 ) {
				$x=$x+(sin($x*$zsfRand[0]+$zsfRand[4])+sin($y*$zsfRand[2]+$zsfRand[5]))*$zsfRand[8]+2;
				$y=$y+(sin($x*$zsfRand[1]+$zsfRand[6])+sin($y*$zsfRand[3]+$zsfRand[7]))*$zsfRand[9]+3;
			imageSetPixel ;
	$thisZsfCfg['offX'] += $imgFontEngWidth[$zsfQv]+$thisZsfCfg['letter-spacing-ratio'];

(중략)

	$zsfR = false;
	if ( isset($zsfA) && $zsfA && $zsfCode && strtoupper($zsfCode) == $zsfA ) {	# 보안코드의 참 거짓 여부 
		$zsfR = true;
	else {
		if ( defined( 'zsfSessId' ) && is_file( zsfAr.'Log/Connect/'.zsfSessId.'.php' ) ) {
			unlink ( zsfAr.'Log/Connect/'.zsfSessId.'.php' );
	$zsfRTxt = $zsfR ? 'Passed' : 'Denied';

(후략)
|zmSpamFree.php}}

예시로 사용된 CAPTCHA 프로그램은 이미지를 왜곡시킬 때 sin함수만을 사용하지만, ImageLine함수 등 다양한 절차를 추가해 이미지를 변형시킬 수 있다. 야후!에 사용되던 초기 CAPTCHA는 EZ-GIMPY 프로그램을 이용해 제작되었으나 현재는 이를 통과하는 방법이 공개되어 있다.

이 외에도 이미지, 오디오 등 다양한 기반의 CAPTCHA들이 사용되는데, 이들 또한 프로그램이 입력된 값을 대상과 매치시키지 못하는 한계를 활용한 것이다. 드래그 앤 드롭을 이용한 슬라이드 CAPTCHA의 경우 자동 프로그램이 드래그 앤 드롭을 사용하지 못하는 점을 이용해 사람과 기계를 구별한다.

## 용도
캡차는 아래와 같은 부분에 적용된다. 주로 계정 생성이나 게시물 등록에 많이 이용되며 이를 통해 자동 프로그램으로 부당한 이득을 챙기거나 악용하는 사람들, 게시판의 불필요한 게시물 도배 등을 막을 수 있다.

개인 홈페이지나 블로그에 비회원으로 댓글을 달기 전 CAPTCHA를 입력하는 경우를 쉽게 볼 수 있다. 이는 광고성 게시물 또는 댓글을 올리기 위해 만들어진 봇을 막기 위해 사용된다. 광고 댓글을 막기 위해 봇이 자주 사용하는 특정 문자열을 아예 댓글에 입력할 수 없도록 설정하는 방법도 사용되지만 설정된 문자열 사이에 공백이나 특수문자를 넣는 편법까지 막기는 어려우므로 CAPTCHA가 유용하게 쓰인다. 또한 여러 번 연속해서 글과 댓글을 올리는 경우에도 CAPTCHA 테스트를 요구하여 봇의 공격을 차단한다.

야후!, Gmail 등의 사이트에서는 특별한 개인정보를 제공하지 않아도 무료 이메일 계정 서비스를 받을 수 있기 때문에, 임의의 계정으로 스팸 광고를 발송하려는 봇들이 수많은 계정을 생성하기 쉽다. 이러한 피해를 막고자 회원가입 절차에 CAPTCHA를 입력하게 함으로써 오직 사람만 계정을 등록할 수 있도록 한다. 카페 기능을 제공하는 포털 사이트의 경우 이미 인증된 회원의 계정이 해킹에 의해 카페에 가입되거나 광고글을 쓰는 것을 막기 위해 카페 가입 전 CAPTCHA를 요구하기도 한다.

스팸 광고의 수신인을 찾기 위해 웹 사이트를 돌아다니며 이메일 주소를 수집하는 봇들을 막기 위해 사용한다. 게시된 이메일 주소를 보이기 전 CAPTCHA를 제시하여 봇들이 이메일 주소를 보지 못하도록 한다. 이메일 주소 뿐 아니라 전화번호나 사용자의 개인정보처럼 봇들에게 제공하고 싶지 않은 정보들을 보호하는 데에도 이용된다.

1999년 11월, Slashdot(http://www.slashdot.org/ )은 어떤 학교에서 컴퓨터 공학을 전공하는 것이 가장 좋은지를 묻는 온라인 투표를 실시했다. 대부분의 온라인 투표처럼 한 사용자가 여러번 투표하는 것을 막기 위해 투표자의 아이피 주소가 기록되었다. 그러나 카네기 멜론 대학의 한 학생이 카네기 멜론 대학에 중복 투표할 수 있는 프로그램을 만들어 카네기 멜론 댓글의 순위가 급속도로 상승했고, 다음날 매사추세츠 공과대학 학생들도 다중 투표 프로그램을 만들어 투표하기 시작했다. 결국 투표는 봇들의 투표경쟁이 되어 매사추세츠 공과대학이 21156표, 카네기 멜론 대학이 21032표로 투표를 마감했고 나머지 학교들은 1000표도 넘지 못했다. 이러한 투표결과는 신뢰성이 떨어져 의미가 없다.

때문에 믿을 수 있는 투표결과를 위해, 사람만이 투표할 수 있도록 온라인 선거 과정에 CAPTCHA를 사용히며, CAPTCHA가 만들어진 계기가 되기도 했다.

비밀번호의 길이는 한정되어 있으므로 여기에 무작위로 텍스트를 입력해 계정을 해킹하려는 봇도 존재한다. 때문에 매 회 로그인을 할 때마다 CAPTCHA를 풀게 하거나, 일정 횟수 이상 로그인에 실패하면 CAPTCHA를 제시하는 방법으로 계정 해킹 및 반복적인 단어 입력을 막는다. 로그인에 실패할 경우 계정에 접근할 수 없게 만드는 방법도 있지만, 봇이 의도적으로 계정을 막아 실제 사용자 또한 로그인하지 못하도록 할 가능성이 있으므로 CAPTCHA를 사용하는 편이 더 효율적이다.

CAPTCHA는 인공지능의 한계에 기반을 두고 있다. 예를 들어 왜곡된 텍스트로부터 이미지를 해독해 내는 것은 현대 컴퓨터의 능력을 벗어난다. 그러므로 CAPTCHA는 인공지능 사회에 명확한 과제를 제시하고 보안연구원 뿐만 아니라 악의적인 프로그래머들도 인공지능 분야의 발달을 위해 노력하도록 한다. CAPTCHA가 기계에 의해 풀리지 않으면 인간과 컴퓨터를 구분하는 방법이 있는 것이고 CAPTCHA가 풀리면 인공지능의 문제를 해결한 것이다.

## 종류
CAPTCHA는 기계와 사람을 구분 가능한 모든 방식의 테스트를 지칭하기 때문에 제시된 것들 외에도 종류가 매우 다양하다.

텍스트 CAPTCHA(TextImage CAPTCHA)는 가장 흔히 볼 수 있는 CAPTCHA로, 이미지로 표시된 글자가 요구하는 내용을 입력하는 형태이다. 출력된 텍스트 이미지는 OCR 프로그램이 인식하지 못하도록 편집되어 있다.

출력된 글자를 그대로 입력하기도 하지만 수학 CAPTCHA(Math CAPTCHA)처럼 간단한 연산이나 지식을 요구하기도 한다. '더하기', '빼기' 등 특정 언어를 사용해 연산을 요구함으로써 외국인 스패머들의 접근을 막기도 한다. EZ-GIMPY를 사용했던 초기 CAPTCHA에서는 7개의 단어를 제시하고 그 중 3개를 선택해 입력하도록 했다.

오디오 CAPTCHA(Audio CAPTCHA)는 컴퓨터와 인간의 구어 인식능력 차이를 이용한 것으로, 잡음에 섞여 들리는 단어를 입력하는 방식으로 사용된다. 텍스트 CAPTCHA를 구별하기 힘들 경우 보조수단으로 활용할 수 있도록 텍스트 CAPTCHA와 함께 사용하는 경우가 많다. CAPTCHA 프로그램이 단어나 연속된 숫자를 임의로 고르고, 이를 음성파일로 만든 후 왜곡시킨다. 그리고 왜곡된 소리를 사용자에게 들려주어 그 문자열을 입력하게 한다.

시각장애가 있는 사람들의 접근성을 높이기 위해 재생버튼 대신 마침표, 쉼표 등으로 음성파일의 재생을 조절할 수 있도록 만들어진 오디오 CAPTCHA도 있다.

텍스트가 아닌 사진이나 그림 이미지를 출력하고 답을 요구하는 CAPTCHA이다. 특정 사물의 이미지를 하나 이상 제시하고 그 이름을 입력하게 하거나, 무작위로 회전된 이미지를 원래대로 되돌리는 등의 형태가 있다. 텍스트 CAPTCHA보다 사용자에게는 더 쉽고, 봇 프로그램이 판독해 내기에는 어렵다. 그러나 텍스트 CAPTCHA는 그때그때 텍스트를 이미지로 만들고 사용 후에 바로 삭제하는 반면 이미지 CAPTCHA는 미리 저장된 이미지를 이용하기 때문에 데이터베이스의 크기가 커진다는 단점이 있다.

정지한 이미지 뿐만 아니라 움직이는 이미지를 이용한 이미지 CAPTCHA도 개발되고 있다.

드래그 앤드 드롭을 활용한 CAPTCHA이다. 스마트폰의 잠금화면을 풀듯 화면의 수평 바를 이동시키는 형태의 QapTcha등이 있다.

이 외에도 사람의 얼굴과 이름을 매치시키는 소셜 CAPTCHA, 커서가 이동한 경로를 확인하는 동작 CAPTCHA(motion CAPTCHA) 등이 있다.

## 한계

### 막을 수 없는 사람
‘캡차공장’은 인도 말고도 방글라데시, 파키스탄, 중국, 브라질, 나이지리아, 러시아 등에서 성행하고 있다. 이는, 주민번호 1개 당 1원씩 하는 한국의 개인정보 산업과 함께 또 하나의 네트워크 지하경제를 이루고 있다. (후략)|댓글 알바, 혹은 기름땀 짜는 디지털노동, }}

### 통과하지 못하는 사람

#### 모든 사람들이 통과하지 못하는 경우
텍스트 CAPTCHA의 경우, OCR 기술이 점차 발전함에 따라 CAPTCHA도 점점 어려워지는 문제점이 있다. CAPTCHA는 자신이 생성해내는 이미지가 사람이 구별할 수 있는 수준인지 알지 못하므로, 사람조차 판독이 불가능한 이미지를 출력해 사용자들을 당황하게 만들기도 한다. 이러한 불편사항들을 해결하기 위해 새로 고침 기능을 제시하거나, 오디오 CAPTCHA, 이미지 CAPTCHA 등 다양한 방법을 병행한다.

## 튜링 테스트
앨런 튜링이 고안한 튜링 테스트는 기계에 지능이 있는지를 판별하고자 하는 테스트이다. 질문자인 사람은 다른 방에 있는 컴퓨터와 사람에 연결되어, 컴퓨터와 사람 중 사람을 구별해 내기 위한 대화를 하게 된다. 튜링 테스트 중 관찰하는 사람과 기계는 텔레타이프로 상호교류하는데, 기계는 아직 사람의 외모와 목소리를 완전히 흉내내지 못하기 때문이다. 이 상황에서 기계는 관찰하는 사람에게 자기가 인간이라고 설득함으로써 사람을 속이려 시도하는 셈이다. 튜링 박사는 질문자가 사람과 컴퓨터의 반응을 구별할 수 없을 경우 기계가 인간처럼 사고한다고 말할 수 있다고 제안했다. 그는 2000년에는 컴퓨터가 5분의 질문시간에서 적어도 30%는 평균적인 질문자를 속일 수 있을 것이라고 예상했다.

튜링 테스트는 인공지능이라는 활발한 연구 분야를 낳았지만, 앨런 튜링의 예상은 빗나갔다. 오늘날 컴퓨터의 능력은 상상하지 못할 만큼 눈부시게 발전했음에도 가장 뛰어난 컴퓨터조차 평범한 5살의 인간의 능력을 넘지 못한다. 컴퓨터는 체스나 의학 진단을 내리는 것처럼 지능적이라고 불리는 능력들에서는 강세를 보이지만 시각, 청각, 언어 같은 훨씬 간단한 능력들에서 어려움을 겪는다는 것이 증명되었다. 그리고 이렇게 튜링 테스트에서 나타난 인공지능의 한계를 이용해 사람과 기계를 구별하도록 만들어진 프로그램이 바로 CAPTCHA이다. CAPTCHA는 사람을 구별해내는 목적으로 만들어졌지만, 컴퓨터가 제시한 정답(반응)이 사람과 구별되지 않을 경우 사람이라 인식한다는 면에서는 일종의 튜링 테스트라고도 할 수 있다.

## reCAPTCHA
오래전에 제작된 종이책들을 텍스트화하기 위해 OCR 프로그램을 사용하는데, 낙서나 얼룩, 헤짐 등의 방해요소만 있어도 OCR 프로그램은 텍스트를 제대로 인식하지 못한다. 이런 단어들은 사람이 하나하나 판독해야 하지만 수요가 적은 책들까지 일일이 입력하려면 노동력과 인건비가 많이 들어간다. 이를 해결하기 위해 CAPTCHA를 입력하는 수많은 사용자들의 힘을 빌리는 것이 바로 reCAPTCHA이다.

reCAPTCHA는 다음과 같은 과정을 거친다.

시각장애인을 위한 오디오 reCAPTCHA의 경우에도 옛 라디오 프로그램 중에서 자동으로 소리 인식이 되지 못한 부분을 활용한다.

reCAPTCHA를 통해 텍스트화되는 책의 숫자는 연간 250만권 정도에 해당한다. 하루에 10만건에 이르는 이 절차들은 CAPTCHA를 입력하는 데 낭비되는 시간을 활용하면서 수많은 책의 디지털화에 기여하고 있다.

reCAPTCHA를 사용하려는 유저들은 reCAPTCHA 배포 사이트를 통해 무료로 이용할 수 있다.