12. HTTP 연결
1. HTTP (Hypertext Transfer Protocol)
HTTP는 우리가 html로 제작된 웹 사이트를 주고 받을 때 주로 쓰인다. 서버에 존재하는 html 문서를 클라이언트와 주고받을때 사용되는 프로토콜이다. HTTP는 기본적으로 WWW 환경 아래에서 제어 된다. html 문서 이외에도 TIFF 이미지, 워드 문서, 윈도우 .exe 파일 전송에도 쓰인다.
앞서 URL에서 배웠듯이 웹 상에 정보를 가져오기 위해서 주소를 작성하게 되는데 가장 앞부분에 프로토콜 명이 들어간다. 우리가 웹사이트에서 흔히 입력하는 주소인 "http://www.google.co.kr" 을 떠올리면 HTTP를 호출하는 방법을 쉽게 알 수 있다. 웹 서버에 있는 html 문서를 불러 오기 위해 HTTP 프로토콜을 사용해 불러온다.
HTTP 프로토콜은 주로 TCP와 UDP로 나뉘고, 포트 번호는 80번을 사용한다.
<HTTP 요청 메세지 포맷>
- 요청 내용 : GET /images.logo.gif HTTP/1.1
- 헤더 : Accept-Language; en
- 기타 메세지
<HTTP 응답 메세지 포맷>
- 상태 표시행 : GET /images.logo.gif HTTP/1.1
- 응답 헤더 필드 : Accept-Language; en
- 기타 메세지
(출처 : 위키 백과 - HTTP)
2. GET / POST
HTTP 프로토콜에서 웹으로 URI를 전달할 때 크게 저 2가지 방법으로 분류 할 수 있다. 쉽게 설명하자면 GET 방식은 URI에 전달하고자 하는 데이터를 포함하여 전달하는 방식이고 POST URI가 아닌 메시지 바디에 해당 내용을 전달 하는 방법이다.
사실 우리는 흔히 GET과 POST 방식으로 저 두 방법을 나누게 되는데, GET과 POST는 전달 방법이 아닌 HTTP 메소드이다. HTTP에서 사용되는 메세지의 경우 다음 시간에 좀 더 정확히 알아 볼 것이다. 간단히 설명하면, GET은 요청한 리소스를 읽어들이는 작업이고, POST는 요청을 수행하기 위해 사용하는 것이다. 둘다 서버에서 리소스를 업로드 하기에 흔히 같은 동작을 한다고 오해할 수 있다. 비슷한 기능을 수행할 뿐 목적은 전혀 다르다.
GET 방식의 경우 전달하려는 정보가 URI의 Query (? 이하) 부분에 작성되게 되고. POST 방식의 경우 URI에 별도로 작성하지 않는다. 각각의 방법의 URI는 다음과 같이 작성 될 것이다. (아래 주소는 가상의 사이트다.)
- GET 메소드 사용 시 URI
http://www.abcd.co.kr/login?id=myname&passwd=1234
- POST 메소드 사용 시 URI
http://www.abcd.co.kr/login
3. HTTP 요청 예시
크롬 개발자 도구 - HTTP 요청 확인
각 웹 브라우저의 개발자 도구를 살펴보면 HTTP 요청에 대한 헤더와 응답 코드를 쉽게 볼 수 있다. 대한민국의 대표 은행사 한곳일 접속했을 때 우리가 웹 서버에서 html 문서를 가져오기 위해 보느는 요청이 위와 같다. 위의 개발자 도구는 크롬으로 사용 했는데, URL, 사용 메소드 (GET) 등의 정보가 포함 되어 있다.
General 부분에 일반 사항이 포함된다면, Response Header / Requset Header 에는 각각 요청과 응답에 관한 헤더가 들어가 있다.
- Keep-Alive 옵션
Request Headers 중 Connection : Keep-Alive이 존재하는 것을 확인 할 수 있다.
HTTP 1.0에서는 HTTP 요청마다 새로운 연결을 하게 된다. 이 방법이 HTTP의 기본 매커니즘이긴 하지만 분명 시간과 돈은 많이 소요된다. 그렇기에, HTTP 1.1 버전에서는 서버가 응답을 보내 온 후 소케승ㄹ 닫지 않고, 새로운 요청을 기다리게 된다. 이 방법을 사용하면 하나의 HTTP 연결로 다수의 요청을 주고 받을 수 있다. 이를 제어하는 옵션이 바로 Keep-Alive이다.
HTTP Keep-Alive 설정은 기본값으로 true로 설정 되어 있다. 사용하고 싶지 않으면 false로 값을 바꿔주면 된다.
- Java HTTP 요청
Java를 통해서도 HTTP 프로토콜의 요청이 가능하다. 기존에 작성했던 URL 값에 "http" 프로토콜 임을 명시해준다면 HTTP 요청이 가능하다. URL 클래스로 요청을 보낸 후 받아온 html을 출력 받는 간단한 프로그램을 아래와 같이 구현 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; public class Solution { public static void main(String[] args) { // TODO Auto-generated method stub try { URL url = new URL("http://www.example.com/"); try (InputStream in = new BufferedInputStream(url.openStream())){ InputStreamReader theHTML = new InputStreamReader(in); int c; while ((c = theHTML.read()) != -1){ System.out.print((char) c); } } } catch (MalformedURLException ex){ System.err.println(ex); } catch (IOException ex){ System.err.println(ex); } } } | cs |