송민준의 개발노트

(spring) recaptcha v2 구현하기 - localhost test 본문

웹/Spring Framework

(spring) recaptcha v2 구현하기 - localhost test

송민준 2020. 1. 11. 02:00

recaptcha 구현해볼라다가 구글에서 localhost 형식은 안된다고 해서 애를 먹다가

해결 방법을 찾았다.

 

1. recaptcha로 이동 후 생성 (아래처럼 해주면된다.)

2. 사이트 키와 비밀 키 확인

3. Spring STS로 가자!  pom.xml에 다음 dependency를 추가해준다.

<!-- 구글 리캡챠 -->
        <dependency>
            <groupId>net.tanesha.recaptcha4j</groupId>
            <artifactId>recaptcha4j</artifactId>
            <version>0.0.7</version>
        </dependency>
 
        <!-- 구글 리캡챠 사용하기 위한 json -->
        <dependency>
            <groupId>javax.json</groupId>
            <artifactId>javax.json-api</artifactId>
            <version>1.1.2</version>
        </dependency>
 
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.json</artifactId>
            <version>1.1</version>
        </dependency>
 
        <!-- 잭슨 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.5</version>
        </dependency>

 

4. java파일 추가

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.net.ssl.HttpsURLConnection;

public class VerifyRecaptcha {
	 public static final String url = "https://www.google.com/recaptcha/api/siteverify";
	    private final static String USER_AGENT = "Mozilla/5.0";
	    private static String secret = ""; //local
	 
	    public static void setSecretKey(String key){
	        secret = key;
	    }
	    
	    public static boolean verify(String gRecaptchaResponse) throws IOException {
	        if (gRecaptchaResponse == null || "".equals(gRecaptchaResponse)) {
	            return false;
	        }
	        
	        try{
	        URL obj = new URL(url);
	        HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
	 
	        // add reuqest header
	        con.setRequestMethod("POST");
	        con.setRequestProperty("User-Agent", USER_AGENT);
	        con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
	 
	        String postParams = "secret=" + secret + "&response="
	                + gRecaptchaResponse;
	 
	        // Send post request
	        con.setDoOutput(true);
	        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
	        wr.writeBytes(postParams);
	        wr.flush();
	        wr.close();
	 
	        int responseCode = con.getResponseCode();
	        System.out.println("\nSending 'POST' request to URL : " + url);
	        System.out.println("Post parameters : " + postParams);
	        System.out.println("Response Code : " + responseCode);
	 
	        BufferedReader in = new BufferedReader(new InputStreamReader(
	                con.getInputStream()));
	        String inputLine;
	        StringBuffer response = new StringBuffer();
	 
	        while ((inputLine = in.readLine()) != null) {
	            response.append(inputLine);
	        }
	        in.close();
	 
	        // print result
	        System.out.println(response.toString());
	         
	        //parse JSON response and return 'success' value
	        JsonReader jsonReader = Json.createReader(new StringReader(response.toString()));
	        JsonObject jsonObject = jsonReader.readObject();
	        jsonReader.close();
	         
	        return jsonObject.getBoolean("success");
	        }catch(Exception e){
	            e.printStackTrace();
	            return false;
	        }
	    }

}

 

5. 컨트롤러.java 코드 추가

	@ResponseBody
	@RequestMapping(value = "VerifyRecaptcha", method = RequestMethod.POST)
	public int VerifyRecaptcha(HttpServletRequest request) {
	    VerifyRecaptcha.setSecretKey("시크릿 코드");
	    String gRecaptchaResponse = request.getParameter("recaptcha");
	    try {
	       if(VerifyRecaptcha.verify(gRecaptchaResponse))
	          return 0; // 성공
	       else return 1; // 실패
	    } catch (Exception e) {
	        e.printStackTrace();
	        return -1; //에러
	    }
	}

6. jsp파일에 코드 추가

<script src="https://www.google.com/recaptcha/api.js"></script>
<script>
$(function() {
$('#add_member_form').submit(function() {
		var captcha = 1;
		$.ajax({
            url: '/pro/VerifyRecaptcha',
            type: 'post',
            data: {
                recaptcha: $("#g-recaptcha-response").val()
            },
            success: function(data) {
                switch (data) {
                    case 0:
                        console.log("자동 가입 방지 봇 통과");
                        captcha = 0;
                		break;
                    case 1:
                        alert("자동 가입 방지 봇을 확인 한뒤 진행 해 주세요.");
                        break;
                    default:
                        alert("자동 가입 방지 봇을 실행 하던 중 오류가 발생 했습니다. [Error bot Code : " + Number(data) + "]");
                   		break;
                }
            }
        });
		if(captcha != 0) {
			return false;
		} 
});
});
</script>
<body>
 <div class="g-recaptcha" data-sitekey=자신의 공개키></div>
<button id = "join_button"type="submit">회원가입</button>
</body>

 

결과

 

recaptcha v3으로 하니까 안된다... 인식된 도메인이 아니라나 뭐래나...

v2로는 잘된다.