[220124] 프로젝트 1일차

oxllz·2022년 1월 24일
0

교육

목록 보기
35/41

NAVER CLOUD PLATFORM 의 CAPTCHA API 사용하기


네이버 캡차 API 예제

키 발급

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Test906 {
	public static void main(String[] args) {
		String clientId = "...";// 애플리케이션 클라이언트 아이디값";
		String clientSecret = "...";// 애플리케이션 클라이언트 시크릿값";
		try {
			String code = "0"; // 키 발급시 0, 캡차 이미지 비교시 1로 세팅
			String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha/v1/nkey?code=" + code;
			URL url = new URL(apiURL);
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			con.setRequestMethod("GET");
			con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", clientId);
			con.setRequestProperty("X-NCP-APIGW-API-KEY", clientSecret);
			int responseCode = con.getResponseCode();
			BufferedReader br;
			if (responseCode == 200) { // 정상 호출
				br = new BufferedReader(new InputStreamReader(con.getInputStream()));
			} else { // 오류 발생
				br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
			}
			String inputLine;
			StringBuffer response = new StringBuffer();
			while ((inputLine = br.readLine()) != null) {
				response.append(inputLine);
			}
			br.close();
			System.out.println(response.toString());
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}

위의 코드에서 setRequestProperty 에 지정한 값은 요청한 jsp 에서 reqeust.getHeader() 를 이용해서 추출할 수 있다. 즉 보안정보는 요청의 body 가 아니라 header 정보를 이용하여 전달하고 있음을 알 수 있다.

InputStreamReader : InputStream 의 byte 단위 입출력을 Reader 의 char 단위 입출력으로 바꿔주는 역할을 한다. ( 이 때 문자셋을 바꿔주기도 한다. )

BufferedReader : 한 줄씩 읽어들이는 readLine() 함수를 쓰기위해 많이 활용

java.net.URL : ajax 와 마찬가지로 요청을 발생시켜 응답을 받아들이는 역할을 한다.
( ajax 와 다른점은 비동기적으로 동작하지 않는다. 즉 요청을 발생시키고 응답올때까지 기다린다. )



캡차 이미지 수신

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;

public class Test907 {
    public static void main(String[] args) {
        String clientId = "...";//애플리케이션 클라이언트 아이디값";
        try {
            String key = "..."; // https://naveropenapi.apigw.ntruss.com/captcha/v1/nkey 호출로 받은 키값
            String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha-bin/v1/ncaptcha?key=" + key + "&X-NCP-APIGW-API-KEY-ID" + clientId;
            URL url = new URL(apiURL);
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setRequestMethod("GET");
            int responseCode = con.getResponseCode();
            BufferedReader br;
            if(responseCode==200) { // 정상 호출
                InputStream is = con.getInputStream();
                int read = 0;
                byte[] bytes = new byte[1024];
                // 랜덤한 이름으로 파일 생성
                String tempname = Long.valueOf(new Date().getTime()).toString();
                File f = new File( Util.upload() + tempname + ".jpg");
                f.createNewFile();
                OutputStream outputStream = new FileOutputStream(f);
                while ((read =is.read(bytes)) != -1) {
                    outputStream.write(bytes, 0, read);
                }
                is.close();
            } else {  // 오류 발생
                br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
                while ((inputLine = br.readLine()) != null) {
                    response.append(inputLine);
                }
                br.close();
                System.out.println(response.toString());
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

지정 폴더에 이미지 저장되는 것 확인


입력값 비교

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Test908 {
    public static void main(String[] args) {
        String clientId = "...";//애플리케이션 클라이언트 아이디값";
        String clientSecret = "...";//애플리케이션 클라이언트 시크릿값";
        try {
            String code = "1"; // 키 발급시 0,  캡차 이미지 비교시 1로 세팅
            String key = "..."; // 캡차 키 발급시 받은 키값
            String value = "..."; // 사용자가 입력한 캡차 이미지 글자값
            String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha/v1/nkey?code=" + code +"&key="+ key + "&value="+ value;

            URL url = new URL(apiURL);
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setRequestMethod("GET");
            con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", clientId);
            con.setRequestProperty("X-NCP-APIGW-API-KEY", clientSecret);
            int responseCode = con.getResponseCode();
            BufferedReader br;
            if(responseCode==200) { // 정상 호출
                br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            } else {  // 오류 발생
                br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
            }
            String inputLine;
            StringBuffer response = new StringBuffer();
            while ((inputLine = br.readLine()) != null) {
                response.append(inputLine);
            }
            br.close();
            System.out.println(response.toString());
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

결과 true/flase 로 확인 가능


CAPTCHA & Servlet

project p0124_2 : CAPTCHA 와 Servlet 같이 사용하기

public class Test909 extends HttpServlet {
	@Override
	public void service(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException 
	{
		String clientId = "...";// 애플리케이션 클라이언트 아이디값";
		String clientSecret = "...";// 애플리케이션 클라이언트 시크릿값";
		String key = null;
		try {
			String code = "0"; // 키 발급시 0, 캡차 이미지 비교시 1로 세팅
			String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha/v1/nkey?code=" + code;
			URL url = new URL(apiURL);
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			con.setRequestMethod("GET");
			con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", clientId);
			con.setRequestProperty("X-NCP-APIGW-API-KEY", clientSecret);
			int responseCode = con.getResponseCode();
			BufferedReader br;
			if (responseCode == 200) { // 정상 호출
				br = new BufferedReader(new InputStreamReader(con.getInputStream()));
			} else { // 오류 발생
				br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
			}
			String inputLine;
			StringBuffer sb = new StringBuffer();
			while ((inputLine = br.readLine()) != null) {
				sb.append(inputLine);
			}
			br.close();
			
			JSONObject jo = new JSONObject(sb.toString());
			key = jo.getString("key");
			
		} catch (Exception e) {
			System.out.println(e);
		}
		
		String tempname = null;
        	try {
            		String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha-bin/v1/ncaptcha?key=" + key + "&X-NCP-APIGW-API-KEY-ID" + clientId;
           		URL url = new URL(apiURL);
            		HttpURLConnection con = (HttpURLConnection)url.openConnection();
            		con.setRequestMethod("GET");
            		int responseCode = con.getResponseCode();
            		BufferedReader br;
            		if(responseCode==200) { // 정상 호출
                		InputStream is = con.getInputStream();
                		int read = 0;
                		byte[] bytes = new byte[1024];
                		// 랜덤한 이름으로 파일 생성
                		tempname = Long.valueOf(new Date().getTime()).toString();
               			File f = new File( Util.upload() + tempname + ".jpg");
                		f.createNewFile();
                		OutputStream outputStream = new FileOutputStream(f);
                		while ((read =is.read(bytes)) != -1) {
                    		outputStream.write(bytes, 0, read);
                	}
                	is.close();
            		} else {  // 오류 발생
                		br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
                		String inputLine;
                		StringBuffer sb = new StringBuffer();
                		while ((inputLine = br.readLine()) != null) {
                    			sb.append(inputLine);
                		}
                		br.close();
                		System.out.println(sb.toString());
            		}
        	} catch (Exception e) {
            		System.out.println(e);
        	}
		
		request.setAttribute("key", key );
		request.setAttribute("fname", tempname );
		RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/test_909_1.jsp");
		rd.forward(request, response);
	}
}

발급받은 key 값과 저장할때 사용한 파일 이름을 test_909_1.jsp 로 forward 시켜

/WEB-INF/test_909_1.jsp

<body>
	${key}<br/>
	<img src="image.jsp?fname=${fname}"/>
	<br/>
	<form method="POST" action="test910">
		<input type="hidden" name="key" value="${key}"/>
		<input type="text" name="captcha"/> 
		<input type="submit"/>
	</form>
</body>

${key}, ${fname} 으로 값을 받아 아래의 화면을 구현

action="test910"

public class Test910 extends HttpServlet {
	@Override
	public void doPost(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException 
	{
		String clientId = "...";
		String clientSecret = "...";
		// jsp 로부터 key 값 받아오기
		String key = request.getParameter("key");
        	// jsp 로부터 captcha 값 받아오기
		String value = request.getParameter("captcha");
		
		boolean result = false;
		try {
        		String code = "1"; // 키 발급시 0,  캡차 이미지 비교시 1로 세팅
            		String apiURL = "https://naveropenapi.apigw.ntruss.com/captcha/v1/nkey?code=" + code +"&key="+ key + "&value="+ value;

            		URL url = new URL(apiURL);
            		HttpURLConnection con = (HttpURLConnection)url.openConnection();
            		con.setRequestMethod("GET");
            		con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", clientId);
            		con.setRequestProperty("X-NCP-APIGW-API-KEY", clientSecret);
            		int responseCode = con.getResponseCode();
            		BufferedReader br;
            		if(responseCode==200) { // 정상 호출
                		br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            		} else {  // 오류 발생
                		br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
            		}
            		String inputLine;
           		StringBuffer sb = new StringBuffer();
            		while ((inputLine = br.readLine()) != null) {
                		sb.append(inputLine);
            		}
            		br.close();
            
            		JSONObject jo = new JSONObject(sb.toString());
            		// 사용자가 text박스 에 입력한 값과 captcha 이미지 안의 값이 같으면 true  
            		result = jo.getBoolean("result");
            
       		} catch (Exception e) {
           		System.out.println(e);
        	}
		System.out.println( result );
	}
}

text 타입의 input 에 캡차 이미지속의 값을 입력하고 제출을 누르면
Test910 코드를 실행시켜 콘솔창에 true 가 나오도록 구현

0개의 댓글