HTTP 프로토콜과 Web 사용
HTTP (Hypertext Transfer Protocol)
HTTP는 Hypertext Transfer Protocol의 약자로서 Web에서 데이타를 주고 받을 때
사용되는 프로토콜이다.
HTTP는 웹 클라이언트와 웹서버 간에 HTML 문서와 같은 데이타를 송수신하는데 사용된다.
브라우져와 같은 웹 클라이언트에서 웹서버에 요청하는 것은 HTTP Request라고 하고,
반대로 웹서버에서 클라이언트로 결과를 보내는 것은 HTTP Response라고 한다.
HTTP는 1990년대 초반에 설계된 확장적인 프로토콜으로서 TCP/IP에 기반한 Application Layer의
프로토콜이다. HTTP상에 주고 받는 데이타는 네트워크 상에서 암호화되어 있지 않은데,
이러한 단점을 보완하기 위해 HTTP를 확장한 HTTPS (Hypertext Transfer Protocol Secure) 프로토콜이 사용된다.
HTTPS는 TCP Layer에 TLS (Transport Layer Security, SSL) Encryption을 추가한 TLS 기반 TCP Connection을
사용하여 네트워크 상의 데이타를 암호화하여 전송한다.
HTTP의 기본 프로토콜
HTTP 클라이언트는 다음과 같은 방식으로 HTTP 서버와 통신한다.
- HTTP 클라이언트는 서버로 TCP Connection을 연다. 클라이언트는 새 TCP Connection을 연결하거나
기존 TCP Connection을 사용할 수 있으며, 여러 개의 Connection들을 사용할 수도 있다.
-
HTTP 클라이언트는 HTTP 메시지를 HTTP 서버로 보낸다. HTTP 메시지는 HTTP 프로토콜에 정해진 메시지 문법에 따라
작성되는데, 첫라인에는 (1) GET, POST, PUT, DELETE 등과 같은 HTTP Verb, (2) 다음으로 요청하는 웹페이지 URL, (3) HTTP 버전을
표시하게 된다. 다음라인은 HTTP 헤더들을 옵션으로 추가할 수 있는데, 각 헤더는 한 라인을 차지하고 Name: Value 와 같이 헤더이름과 값을
(콜론으로 분리하여) 쌍으로 표시한다. 아래는 간단한 HTTP GET Request를 표현한 예이다.
GET / HTTP/1.1
Host: www.example.com
Accept-Language: en
HTTP 헤더들을 모두 적은 후 만약 옵션으로 Body 데이타를 추가할 필요가 있으면, 하나의 공백 라인을 추가하고
그 다음에 Body 데이타를 적게된다. 아래는 JSON 데이타를 HTTP Body에 추가한 예이다.
POST /save.aspx HTTP/1.1
Host: www.example.com
Content-Type: application/json
{"id":"1", "name":"tom"}
-
HTTP 서버는 HTTP Request에 대한 응답으로 HTTP Response를 클라이언트에 보내게 된다.
HTTP 클라이언트는 HTTP Response를 읽어 처리한다. 아래는 HTTP 서버에서 리턴하는 HTTP Response의 예이다.
HTTP/1.1 200 OK
Date: Sat, 16 Nov 2019 10:20:01 PST
Server: Apache
Last-Modified: Tue, 10 Nov 2019 10:28:12 PST
Accept-Ranges: bytes
Content-Length: 646
Content-Type: text/html
<!DOCTYPE html>
<html>
(웹페이지 HTML 생략)
</html>
-
HTTP 클라이언트는 TCP Connection을 닫거나 혹은 다음 HTTP Request에 재사용한다.
HTTP의 기본 프로토콜은 여러 개발 Framework이나 프로그래밍 언어에서 쉽게 사용할 수도 있도록 구현되어 있는데,
아래는 C# / .NET 환경에서 HTTP를 사용하는 방법등에 대해 간단한 소개한 것이다.
WebClient를 사용하여 HTTP 사용하기
C#에서 HTTP를 사용하기 위해서는 여러 방법이 있는데,
간단하게는 System.Net.WebClient 클래스를 사용할 수 있으며,
좀 더 세밀한 제어를 위해서는 System.Net.HttpWebRequest 클래스를 사용할 수 있다.
아래는 WebClient 클래스를 사용하여 웹사이트의 HTML을 가져오는 예제이다.
// using System.Net;
string url = "http://www.google.com";
WebClient webClient = new WebClient();
string html = webClient.DownloadString(url);
WebClient 클래스에 대해 보다 다양한 예제는
http://www.csharpstudy.com/web/article/15
에 소개되어 있다.
HttpWebRequest를 사용하여 HTTP 사용하기
C#에서 좀 더 세밀하게 HTTP를 제어할 필요가 있을 때는, System.Net.HttpWebRequest 클래스를 사용할 수 있다.
예를 들어, HttpWebRequest.Timeout 속성을 사용하여 타임아웃을 지정하거나,
HttpWebRequest.KeepAlive 속성을 사용하여 Keep Alive 기능을 Enable/Disalbe 하는 등의
여러 제어를 설정할 수 있다.
아래는 HttpWebRequest 클래스를 사용하여 HTML을 가져오는 예제이다.
단순히 HTML을 가져오는 코드는 훨씬 간단하겠지만, 몇가지 추가적인 속성 설정들을 예시하였다.
// using System.Net;
string url = "https://httpbin.org/get"; //테스트 사이트
string responseText = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.Timeout = 30 * 1000; // 30초
request.Headers.Add("Authorization", "BASIC SGVsbG8="); // 헤더 추가 방법
using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
{
HttpStatusCode status = resp.StatusCode;
Console.WriteLine(status); // 정상이면 "OK"
Stream respStream = resp.GetResponseStream();
using (StreamReader sr = new StreamReader(respStream))
{
responseText = sr.ReadToEnd();
}
}
Console.WriteLine(responseText);
HttpWebRequest 클래스에 대해 보다 다양한 예제는
http://www.csharpstudy.com/web/article/16
에 소개되어 있다.
HttpClient를 사용하여 HTTP 사용하기
.NET 4.5와 .NET Core에서 HttpClient 클래스를 지원하게 되었는데, HttpClient 클래스는
모든 IO 메서드들을 비동기로 처리하는 기능을 가지며, 특히 C# await 를 사용하여
자연스럽게 비동기 HTTP 호출을 할 수 있다.
아래는 HttpClient 클래스를 사용하여 웹사이트에서 HTML을 가져오는 예제이다.
// using System.Net.Http;
static async void GetHtml()
{
using (var client = new HttpClient())
{
var response = await client.GetStringAsync("http://www.csharpstudy.com");
Console.WriteLine(response); // HTML
}
}
HTTP 서버
위에서 설명한 WebClient, HttpWebRequest, HttpClient 등은 웹 클라이언트 기능을 갖는 것이다.
웹서버 기능은 IIS/ASP.NET를 비롯하여 여러 웹서버 및 웹서버 프로그래밍을 통해 이루어진다.
C#/.NET 에서 가장 보편적으로 사용하는 ASP.NET 웹프로그래밍에 대해서는
http://www.csharpstudy.com/web/article/1 에 자세히 소개되어 있다.