Java/JSP 환경에서 SimpleCaptcha로 자동가입 방지 캡차를 5분에 적용하는 방법을 정리했습니다. 라이브러리 다운로드부터 Controller·JavaScript 새로고침 버튼 구현까지 코드를 그대로 복붙해서 쓸 수 있도록 단계별로 다룹니다.
CAPTCHA는 HIP 기술의 일종으로, 어떠한 사용자가 실제 사람인지 컴퓨터 프로그램인지를 구별하기 위해 사용되는 방법이다. 사람은 구별할 수 있지만 컴퓨터는 구별하기 힘들게 의도적으로 비틀거나 덧칠한 그림을 주고 그 그림에 쓰여 있는 내용을 물어보는 방법이 자주 사용된다.
위키백과
다운로드
CATPCHA를 사용하기 위해선 https://sourceforge.net/projects/simplecaptcha/ 사이트로 이동해서 jar 파일을 다운로드 받습니다.

jar 파일 추가
사용하는 툴이 이클립스 일 경우 jar 파일을 프로젝트에 포함시켜야 한다. 아래 이전 글을 참고해서 추가합니다.
[Eclipse] 프로젝트에 jar 파일 추가하는 방법
이클립스에서 라이브러리(jar 파일)를 추가하는 방법입니다. 일반적인 자바 프로젝트와 웹 프로젝트일 경우 두 가지로 방법으로 나눠집니다.자바 프로젝트1. 프로젝트 우클릭 > properties2. Java Build
hgko-dev.tistory.com
사용
HTML
먼저 자동입력 방지 기능을 넣기 위한 화면 코드입니다. CATPCHA 이미지를 보여주고 이미지 안의 숫자들을 새로고침 할 수 있는 버튼을 만들었습니다.
<div class="mt-3">
<label class="form-label fw-bold">자동입력 방지문자</label>
<div class="d-flex">
<img id="captchaImg" src="captchaImg" title="캡차 이미지" alt="캡차 이미지" />
<button type="button" id="refresh_btn" class="btn btn-sm btn-gray w-50 ms-2">새로고침</button>
</div>
<div class="d-flex mt-1">
<input id="captcha" type="text" class="form-control input-control" />
</div>
</div>
Controller 부분
html에서 /captchaImg 경로를 호출하면 아래 컨트롤러가 호출됩니다. Captcha 이미지 설정을 한 후 세션에 값을 저장하고 이미지를 그려줍니다.
/**
* captchaImg
* @param request
* @param response
* @throws IOException
*/
@GetMapping("captchaImg")
public void captchaImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
// 폰트 설정 =========================================================
List<Font> fontList = new ArrayList<Font>();
fontList.add(new Font("", Font.HANGING_BASELINE, 28));
fontList.add(new Font("Courier", Font.ITALIC, 28));
fontList.add(new Font("", Font.PLAIN, 28));
List<Color> colorList = new ArrayList<Color>();
colorList.add(Color.black);
Captcha captcha = new Captcha.Builder(200, 36) // 이미지 크기 설정
.addText(new NumbersAnswerProducer(6), new DefaultWordRenderer(colorList, fontList))
//.gimp(new DropShadowGimpyRenderer()).gimp() // 그림자 효과 추가
.addNoise().addNoise() // 한번 호출할 떄마다 하나의 라인이 추가된다
.addBackground(new GradiatedBackgroundProducer()) // Gradiated백그라운드 효과 추가
.addBorder() // 검정 테두리 선 생성
.build();
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
// 캐쉬를 지우기 위해 헤더값을 설정
response.setDateHeader("Expires", 0);
response.setDateHeader("Max-Age", 0);
// 리턴값을 image형태로 설정
response.setContentType("image/png");
// 세션에 자동가입방지 문자를 저장한다.
request.getSession().setAttribute(Captcha.NAME, captcha);
// Image를 write 한다
CaptchaServletUtil.writeImage(response, captcha.getImage());
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
}
}
다음은 현재 보이는 자동입력 방지문자와 입력한 문자가 일치하는 하는지 확인하는 코드입니다.
/**
* 자동입력 방지문자 확인
*/
@GetMapping("isCorrect")
public ResponseEntity<?> isCorrect(HttpServletRequest request, String answer) {
boolean result = false;
Captcha captcha = (Captcha) request.getSession().getAttribute(Captcha.NAME);
if (captcha.isCorrect(answer)) {
result = true;
}
return new ResponseEntity<>(result, HttpStatus.OK);
}
JavaScript
화면단에서 자등입력 방지문자를 잘 입력했는지 확인하는 코드입니다.
// 자동입력 방지문자가 일치하는지 확인
const isCaptCha = () => {
const answer = $('#captcha').val();
if (answer == '') {
alert('자동입력 방지문자를 입력해주세요.');
return;
}
let result = false;
$.ajax({
url: `${contextPath}/signup/isCorrect`,
type: 'GET',
data: { answer: answer },
async: false,
success: function (response) {
result = response;
},
});
return result;
};
if (!isCaptCha()) {
alert('자동입력 방지문자가 일치하지 않습니다.', function () {
$('#captcha').focus();
});
return;
} else {
alert('자동입력 방지문자가 일치합니다.');
}
새로고침 버튼을 누를 경우 자동입력 방지문자 이미지 안의 숫자가 바뀝니다.
/**
* 자동입력 방지문자 새로고침
*/
$('#refresh_btn').click(function () {
$('#captchaImg').attr('src', 'captchaImg');
});
화면
성공적으로 자동입력 방지문자 이미지를 가져왔다! 위의 방법처럼 쉽게 구현할 수 있습니다.

자주 묻는 질문
Q. SimpleCaptcha 외에 다른 캡차 라이브러리는 뭐가 있나요?
A. Google reCAPTCHA가 가장 많이 쓰이지만 외부 의존성이 있습니다. SimpleCaptcha는 자체 호스팅이 가능해 사내 시스템·폐쇄망에서 유리합니다. 그 외 KaptchaCaptcha, JCaptcha 등이 있습니다.
Q. SimpleCaptcha는 모바일에서도 잘 보이나요?
A. 기본 이미지 크기가 PC 화면 기준이라 모바일에서는 작아 보일 수 있습니다. JSP에서 img 태그에 width·height를 명시하거나 CSS max-width 100%로 반응형 처리 권장.
Q. 캡차 우회 봇이 SimpleCaptcha를 뚫지 않나요?
A. AI OCR이 발달하면서 단순 텍스트 캡차는 우회 가능성이 있습니다. 보안이 중요한 사이트는 reCAPTCHA v3 또는 hCaptcha 같은 행동 기반 캡차로 보강하는 게 안전합니다.
Q. SimpleCaptcha를 Spring Boot 프로젝트에서 써도 되나요?
A. 네, 가능합니다. JSP가 아닌 Thymeleaf·JSON 응답 환경에서도 BufferedImage로 직접 응답을 반환하면 됩니다. 본문 코드는 JSP 기준이지만 Controller 패턴은 동일합니다.
Q. 캡차 이미지가 화면에 안 뜨면 어떻게 디버깅하나요?
A. 우선 브라우저 개발자 도구의 Network 탭에서 캡차 이미지 요청이 200으로 오는지 확인하세요. 404면 Controller 매핑 문제, 500이면 SimpleCaptcha jar가 빌드 경로에 없을 가능성이 큽니다.
'Language > Java' 카테고리의 다른 글
| Java 8 코딩 및 프로그래밍 면접 질문과 답변 (1) | 2024.07.31 |
|---|---|
| [Java 8] Stream API 면접 질문과 답변 (0) | 2024.07.30 |
| [Java] Iteration 예 (0) | 2022.11.25 |
| [Java] 스트림(Stream) 사용 방법 (0) | 2022.11.25 |
| Java 8 람다(Lambda) 적용 예 (0) | 2022.11.24 |
IT 기술과 개발 내용을 포스팅하는 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!