자바/JSP에서 reCAPTCHA 사용

중요: reCAPTCHA API 버전 1.0은 더 이상 지원되지 않습니다. 버전 2.0으로 업그레이드하세요. 자세히 알아보기

reCAPTCHA 자바 라이브러리를 사용하면 자바 기반 웹사이트에 보안문자를 간단하게 입력하여 봇의 악용을 방지할 수 있습니다. 라이브러리는 reCAPTCHA API를 래핑합니다.

Java/JSP에서 reCAPTCHA를 사용하려면 Soren에서 제공한 reCAPTCHA Java 라이브러리를 다운로드하여 압축을 풉니다. 일반적으로 jar 파일 (recaptcha4j-X.X.X.jar)만 있으면 되며, 이 파일을 Java 애플리케이션에서 로드할 수 있는 위치로 복사해야 합니다. 예를 들어, Tomcat을 사용하여 JSP를 실행하는 경우 jar 파일을 WEB-INF/lib/라는 디렉터리에 넣을 수 있습니다.

빠른 시작

API 키를 등록하고 reCAPTCHA 자바 라이브러리를 다운로드한 후 사이트에 reCAPTCHA를 설치하는 방법은 다음과 같습니다.

클라이언트 측 (보안문자 이미지가 표시되도록 하는 방법)

자바 플러그인을 사용하여 reCAPTCHA 위젯을 표시하려면 적절한 reCAPTCHA 클래스를 가져와야 합니다. JSP에서는 reCAPTCHA 위젯이 표시될 양식 요소를 포함하여 파일 상단 근처에 다음 줄을 삽입하면 됩니다.

    <%@ page import="net.tanesha.recaptcha.ReCaptcha" %>
    <%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %>

그런 다음 reCAPTCHA 인스턴스를 만들어야 합니다.

    ReCaptcha c = ReCaptchaFactory.newReCaptcha("your_public_key", "your_private_key", false);

마지막으로 reCAPTCHA 위젯을 표시할 HTML은 다음 함수 호출에서 가져올 수 있습니다.

    c.createRecaptchaHtml(null, null)

따라서 JSP에서 코드는 다음과 같을 수 있습니다.

    <%@ page import="net.tanesha.recaptcha.ReCaptcha" %>
    <%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %>

    <html>
      <body>
        <form action="" method="post">
        <%
          ReCaptcha c = ReCaptchaFactory.newReCaptcha("your_public_key", "your_private_key", false);
          out.print(c.createRecaptchaHtml(null, null));
        %>
        <input type="submit" value="submit" />
        </form>
      </body>
    </html>

your_public_keyyour_private_key는 해당 API 키 값으로 바꿔야 합니다.

서버 측 (사용자가 올바른 답변을 입력했는지 테스트하는 방법)

양식을 확인하는 애플리케이션에서 먼저 필요한 reCAPTCHA 클래스를 가져와야 합니다.

    import net.tanesha.recaptcha.ReCaptchaImpl;
    import net.tanesha.recaptcha.ReCaptchaResponse;

다음으로, 사용자가 입력한 reCAPTCHA 솔루션을 확인하는 코드를 삽입해야 합니다. 아래 JSP 예제에서 이를 수행하는 방법을 보여줍니다.

    <%@ page import="net.tanesha.recaptcha.ReCaptchaImpl" %>
    <%@ page import="net.tanesha.recaptcha.ReCaptchaResponse" %>

    <html>
      <body>
      <%
        String remoteAddr = request.getRemoteAddr();
        ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
        reCaptcha.setPrivateKey("your_private_key");
String challenge = request.getParameter("recaptcha_challenge_field"); String uresponse = request.getParameter("recaptcha_response_field"); ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, uresponse); if (reCaptchaResponse.isValid()) { out.print("Answer was entered correctly!"); } else { out.print("Answer is wrong"); } %> </body> </html>

위 코드에서 다음이 수행됩니다.

  • remoteAddr는 사용자 IP 주소입니다 (reCAPTCHA 서버로 전달).
  • uresponse에는 reCAPTCHA 질문에 대한 사용자의 답변이 포함됩니다.
  • 중요: DNS 캐싱

    Java에는 서버와 reCAPTCHA 간의 연결이 몇 개월마다 중단될 수 있는 성가신 문제가 있습니다. 이 경우 reCAPTCHA가 사이트에서 작동을 중지합니다. 이 문제의 해결 방법은 아래를 참고하세요.

    기본적으로 Java 가상 머신 (JVM)은 각 호스트의 DNS 레코드에 지정된 TTL (수명) 값을 사용하는 대신 모든 DNS 조회를 영구적으로 캐시합니다. DNS 조회는 읽을 수 있는 호스트 이름을 IP 주소로 변환하는 DNS 서버로 전송되는 요청입니다. 예를 들어 www.recaptcha.net을 IP 주소 69.12.97.164로 변환합니다. 물론 이보다 훨씬 복잡하므로 자세한 내용은 DNS에 대한 Wikipedia 항목부터 확인하는 것이 좋습니다.

    흔하지는 않지만 reCAPTCHA 서버는 IP 주소를 변경할 수 있습니다. Java는 DNS 조회를 영구적으로 캐시하므로 reCAPTCHA IP 주소가 변경되면 서버와 reCAPTCHA 간의 연결이 끊길 수 있습니다. 이 경우 JVM을 다시 시작하면 (예: Tomcat 다시 시작) 새 DNS 조회가 발생하므로 문제가 해결될 수 있습니다. 그러나 reCAPTCHA 서버가 IP 주소를 변경했기 때문에 사이트가 중단될 때마다 몇 달에 한 번씩 JVM을 다시 시작하지 않는 것이 좋습니다.

    이 문제를 완전히 해결하려면 -Dsun.net.inetaddr.ttl=30을 앱 서버에 전달하면 됩니다. 이렇게 하면 Java에 30초 동안만 DNS를 캐시하도록 지시하게 됩니다. Windows용 Tomcat에서는

    1. Tomcat 중지
    2. tomcat\bin으로 이동
    3. Tomcat5w.exe 실행
    4. Java 탭으로 이동
    5. 자바 옵션 섹션에 자바 속성 추가: -Dsun.net.inetaddr.ttl=30
    6. 종료
    7. Tomcat 시작

    Linux 또는 MacOS X용 Tomcat의 경우 명령줄에서 다음 명령어를 실행한 다음 Tomcat을 다시 시작해야 합니다.

        export JAVA_OPTS="$JAVA_OPTS -Dsun.net.inetaddr.ttl=30"
    

    이 문제를 자세히 설명하는 도움말을 확인하세요.

    추가 자료

  • 디자인 맞춤설정
  • 도움말 및 가이드라인
  • 문제 해결