개인참고자료/자바(네트워크)

URL - POST 방식으로 URL 주소 호출하기

경진 2008. 7. 19. 23:35
 POST 방식으로 URL 주소 호출하기

인터넷에 존재하는 많은 게시판 등에서 글을 폼에 입력한 후, 확인 버튼을 누르면 보통 POST 방식으로 정보가 웹 애플리케이션에게 전달된다. 회원 로그인 창에서 아이디와 암호를 입력할 때에도 마찬가지이다. POST 방식의 경우, 사용자 쿼리 길이에 대한 제한이 없고(반면에 GET 방식은 길이 제한이 있다), URL 주소에 사용자 쿼리가 표시되지 않는 장점이 있다.

사용자 쿼리가 URL 주소에 보여지지 않는다는 것은 HTML 폼에 아이디와 암호를 입력해서 로그인을 했을 때 보안상 좀더 유리함을 의미한다. 아이디와 암호를 입력해서 로그인했는데 URL 주소 물음표 뒤에 사용자 쿼리가 주소 창에 보이면 안되기 때문이다.

그렇지만 POST 방식은 GET 방식처럼 주소 입력 창에 주소를 직접 적어서 사용자 쿼리를 전송하지 못한다. 따라서 POST 방식으로 URL 주소에 사용자 쿼리를 전달하려면 HTML 폼을 이용하든지, POST 방식으로 사용자 쿼리를 전송하는 프로그램을 이용해야한다.

POST 방식으로 URL 주소를 호출하는 방법도 앞서 배운 GET 방식으로 URL 주소를 호출하는 방법과 비슷하다. 다만 setRequestMethod()에 인자로 "POST"를 지정하는 부분만 다르다.

POST 방식으로 사용자 쿼리 전달 : PostConnection

POST 방식으로 웹 애플리케이션이 어떤 정보를 전달받는지 알 필요가 있다.

입력 폼에 아이디와 암호를 입력 받는 입력 폼이 있다.

아이디와 암호를 입력한 후 확인 버튼을 누르면 폼에 입력한 값이 POST 방식으로 post.jsp 웹 애플리케이션에 전달되어 값이 출력된다.

결과를 보면 URL 주소 뒤쪽에 물음표가 없고 사용자 쿼리도 없는 것을 알 수 있다. 이경우 사용자가 보내는 정보가 어떤 정보인지 알기 어렵다. 알 수 있는 방법은 입력 폼의 HTML 태그를 분석하는 것이다.

<html>
<head><title> post form </title></head>
<body>
<center>
입력 폼
<form method=post action=post.jsp>
id : <input type=text name=id><br>
암호 : <input type=password name=passwd><br>
<input type=submit value=확인>
</form>
</center>
</body>
</html>

postform.html 문서에서 중요한 부분은 input 태그의 name 속성이다. 아이디와 암호의 name 속성 값으로 각각 id, passwd가 지정되어 있는 것을 확인할 수 있다. 이 경우, 사용자 쿼리는 다음과 같은 값으로 웹 애플리케이션에 전달된다.

id=사용자가입력한아이디&passwd=사용자가입력한암호

import java.io.*;           
import java.net.*;           
           
public class PostConnection {           
    public static void main(String[] args){       
           
        if (args.length != 2) {   
            System.err.println("사용법: java PostConnection id password");
            System.exit(1);
        }   
        try{   
            String id = URLEncoder.encode(args[0]);
            String passwd = URLEncoder.encode(args[1]);
            String query = "id=" + id + "&passwd=" + passwd;   
            String u = "http://localhost/post.jsp";   
            System.out.println(u + query);       
            URL url = new URL(u);   
            URLConnection connection = url.openConnection();   
            HttpURLConnection hurlc = (HttpURLConnection)connection;   
            hurlc.setRequestMethod("POST");   
            hurlc.setDoOutput(true);   
            hurlc.setDoInput(true);   
            hurlc.setUseCaches(false);   
            hurlc.setDefaultUseCaches(false);   
            PrintWriter out = new PrintWriter(hurlc.getOutputStream());   
            out.println(query);   
            out.close();   
            BufferedReader in = new BufferedReader(new InputStreamReader(hurlc.getInputStream()));   
            String inputLine = null;   
            while ((inputLine = in.readLine()) != null){   
                System.out.println(inputLine);
            }   
            in.close();   
        }catch(Exception ex){       
            System.out.println(ex);   
        }       
    }           
}               

URLConnection 객체까지 얻었다면, URLConnection 객체에 있는 setRequestMethod() 메소드를 이용한다.

            URL url = new URL(u);   
            URLConnection connection = url.openConnection();   
            HttpURLConnection hurlc = (HttpURLConnection)connection;   
            hurlc.setRequestMethod("POST");   

그리고 아이디와 암호를 query 문자열에 저장한 후, 웹 애플리케이션에게 전달한다.

            String query = "id=" + id + "&passwd=" + passwd;    
……
            PrintWriter out = new PrintWriter(hurlc.getOutputStream());   
            out.println(query);   
            out.close();