땃쥐네

[Http 완벽 가이드] 01장: HTTP 개관 본문

Study/[진행중] Http 완벽가이드

[Http 완벽 가이드] 01장: HTTP 개관

ttasjwi 2023. 9. 1. 22:38

이 포스트는 HTTP 완벽 가이드의 01장을 읽고 개인적으로 굵직하다 느낄만한 키워드를 정리해서 작성했습니다.

 

우리가 개발하는 웹 애플리케이션들은 HTTP 프로토콜 위에서 동작하고, 우리가 편리하게 사용하는 각종 웹 프레임워크들도 결국 HTTP 메시지 처리에 관한 세부적인 로직들을 많이 추상화시켜 뒀습니다. 그 많은 것들을 추상화시켰지만 결국 여러가지 실무적인 문제들은 HTTP 기본 지식이 있어야 해결할 수 있을 때가 많아집니다.

 

요즘 서비스들은 단순히 특정 웹 애플리케이션 하나만으로 동작하지 않고 여러 개의 애플리케이션을 함께 결합하서 운영하는 경우가 많습니다. 서비스의 규모가 커지면 커질수록 결국 많은 애플리케이션간의 의존관계를 구축하게 될테고 이들 간에도 간 HTTP 통신을 사용하게 될 것입니다. 그럴 수록, 이들 애플리케이션 간 통신의 근간에 위치한 HTTP, 네트워크에 관한 지식이 더 중요해질 것입니다.

 

제 스스로 자바, 스프링 같은 특정 프레임워크를 개발 공부를 시간을 많이 들였지만 네트워크 및 HTTP 자체에 대해서는 깊이 있게 학습해 보지 못 했다는 생각에 개인적으로 HTTP 완벽 가이드라는 책을 조금씩 읽어가면서 정리해보려고 합니다. 


1. HTTP : 인터넷의 멀티미디어 배달부

  • 신뢰성 있는 데이터 전송 프로토콜
  • 전송 중 파괴되거나 중복되거나 왜곡되는 것을 걱정하지 않아도 됨
  • 개발자는 인터넷의 결함이나 약점에 대한 걱정 없이 애플리케이션 고유의 기능을 구현하는 데 집중할 수 있음

2. 웹 클라이언트와 서버

  • 웹 클라이언트 : 웹 콘텐츠를 요청하는 주체. 브라우저가 될 수도 있고, 특정 모바일 기기의 애플리케이션이 될 수도 있으며, 다른 서버에 요청하는 서버도 클라이언트라 할 수 있음
  • 웹 서버 : 웹 콘텐츠를 제공하는 제공자. HTTP 프로토콜로 통신하기 때문에 HTTP 서버라고 불림
  • 클라이언트는 서버에게 HTTP 요청을 보내고, 서버는 요청된 데이터를 HTTP 응답으로 돌려준다.

3. 리소스

3.1 리소스란?

  • 웹에 존재하는 모든 것들!
  • 웹 서버는 웹 리소스를 관리하고 사용자(클라이언트)에게 제공
  • 정적 리소스와 동적 콘텐츠 리소스로 나뉨
    • 정적 리소스 : 단순한 텍스트 파일, HTML 파일, …
    • 동적 콘텐츠 리소스 : 사용자 요청 정보, 시간대 등에 따라 다른 콘텐츠

3.2 미디어 타입(MIME)

  • 인터넷은 수 천가지의 데이터타입을 다룬다.
  • 이들 각각의 객체 각각을 분류하는 것이 미디어 타입이며, MIME 타입으로 불린다.
  • 웹 서버는 사용자에게 응답을 전달할 때, 모든 HTTP 객체에 MIME 타입을 붙여 전송한다.(Content-type 헤더)
    • Content-Type : image/jpeg
  • 웹 브라우저들은 잘 알려진 객체 타입 수백 가지를 다룰 수 있고, 렌더링 할 수 있다.
  • MIME은 사선(/)으로 주 타입과 부타입으로 이루어진 문자열 라벨이다.
  • 수 백 가지의 잘 알려진 MIME 타입, 그 외에도 실험용 혹은 특정 용도의 MIME 타입이 존재한다.

3.3 URI

  • 웹 서버 리소스는 각자 이름을 가지고 있기 때문에 클라이언트는 관심 있는 리소스를 지목할 수 있다.
  • 서버 리소스 이름을 식별할 수 있는 무언가가 필요한데 이를 URI(통합 자원 식별자)라고 한다.
  • URI를 통해 정보 리소스를 고유하게 식 별하고 위치를 지정할 수 있다.
  • URI는 URL, URN 두 종류가 있다

3.4 URL

  • URL(통합 자원 지시자)는 리소스 식별자의 가장 흔한 형태이다.
  • 특정 서버의 한 리소스에 대한 구체적인 위치를 서술한다.
  • 리소스가 정확히 어디에 있고 어디에 접근할 수 있는 지 분명히 알려준다.
  • 표준 포맷
    • 스킴 : 리소스에 접근하기 위해 사용되는 프로토콜을 서술(주로 http://)
    • 서버 : 서버의 인터넷 주소(예: www.joes-hardware.com)
    • 리소스 : 웹 서버의 리소스 (예: /epecials/saw-blade.gif)
  • 오늘 날의 대부분의 URI는 URL이다.

3.5 URN

  • 유니폼 리소스 이름
  • 리소스 하나에 대해서 어떤 고유한 이름을 붙인 개념으로 보면 좋을 듯.
  • 콘텐츠를 이루는 한 리소스에 대해 대해 그 리소스의 위치에 영향 받지 않는 유일무이한 ‘이름’ 역할
  • 위치 독립적이다. 리소스를 이곳 저곳 옮기더라도 문제 없이 동작한다.
  • 리소스가 이름을 변하지 않게 유지하는 한, 여러 종류의 네트워크 접속 프로토콜로 접근해도 문제 없다.
  • 효율적인 동작을 위해선, URN 기반으로 리소스 위치를 분석하기 위한 인프라 자원이 필요한데 그런 인프라가 부재하기에 URN 채택은 늦어지고 있다.
  • 이 책에서는 따라서, 특별한 언급이 없으면 통상적 관례에 따라 URL 과 URI를 같은 의미로 사용한다.

4. 트랜잭션

4.1 HTTP 트랜잭션

  • 요청 명령과 응답 결과로 구성되어 있다.
  • 이 상호작용은 HTTP 메시지라고 불리는 정형화된 데이터 덩어리를 이용해 이루어진다.

4.2 메서드

  • HTTP는 HTTP 메서드라고 불리는 여러 가지 종류의 요청 명령을 지원한다
  • 모든 HTTP 요청 메시지는 한 개의 메서드를 갖는다.
  • 메서드는 서버에게 어떤 동작이 취해져야 하는지를 말해준다.
  • 흔히 사용되는 HTTP 메서드
    • GET : 서버에서 클라이언트로 지정한 리소스를 보내라
    • PUT : 클라이언트에서 서버로 보낸 데이터를 지정한 이름의 리소스로 저장하라.
    • DELETE : 지정한 리소스를 서버에서 삭제하라.
    • POST : 클라이언트 데이터를 서버 게이트웨이 애플리케이션으로 보내라.
    • HEAD : 지정한 리소스에 대한 응답에서, HTTP 헤더부분만 보내라.
  • 이 부분은 3장에서 다룰 예정이다.

4.3 상태 코드

  • 모든 HTTP 응답 메시지는 상태코드와 함께 반환된다.
  • 클라이언트에게, 요청이 성공했는지 실패했는지, 아니면 추가적으로 어떤 조치가 필요한 지를 알려주는 세 자리 숫자이다.
  • 자주 쓰이는 상태코드
    • 200 : 좋다. 문서가 바르게 반환되었다
    • 302 : 다시 보내라. 다른 곳에 가서 리소스를 가져가라
    • 404 : 없음. 리소스를 찾을 수 없다
  • HTTP는 각 숫자 상태코드에 텍스트로 된 사유 구절도 함께 보낸다. HTTP 소프트웨어는 다음에 열거된 상태 코드와 사유 구절을 모두 같은 것으로 취급한다.
    • 200 OK
    • 200 Success
  • 이것은 3장에서 자세히 다룬다.

4.4 웹 페이지는 여러 객체로 이루어질 수 있다

  • 애플리케이션은 보통 하나의 작업을 수행하기 위해 여러 HTTP 트랜잭션을 수행한다.
  • 예를 들어 웹브라우저는 HTTP 웹 페이지를 가져올 때 한 번에 대량의 HTTP 트랜잭션을 수행한다.
    • HTML 뼈대 → 첨부된 이미지, CSS 파일, 자바스크립트 파일, …
  • 이렇게 웹 페이지는 보통 하나의 리소스가 아닌, 리소스의 모음이다.

5. 메시지

5.1 HTTP 메시지

  • HTTP 트랜잭션은 HTTP 메시지를 통해 이루어진다.
  • 단순한 줄 단위의 문자열이다.
  • 이진 형식이 아닌 일반 텍스트로 구성되어 있기 때문에 사람이 읽고 쓰기 쉽다
  • 요청 메시지 : 웹 클라이언트에서 웹 서버로 보낸 HTTP 메시지
  • 응답 메시지 : 웹 서버에서 클라이언트로 가는 HTTP 메시지

5.2 HTTP 메시지의 구성

  • 시작줄(Request Line, Status Line)
    • Request Line : 무엇을 해야하는 지 명시
    • Status Line : 무슨 일이 일어났는 지 명시
  • 헤더(Header)
    • 0개 이상의 헤더 필드가 위치해 있다.
    • 쉬운 구문 분석을 위해 쌍점(:)으로 구분되어 있는, 하나의 이름과 하나의 값으로 구성
    • 헤더 필드를 추가하려면 그저 한 줄을 더하기만 하면 된다.
    • 마지막에 빈 줄로 끝난다.
  • 본문(Body)
    • 어떤 데이터든 들어갈 수 있고, 데이터가 포함되지 않을 수 있음(빈 본문)
    • 요청 본문을 통해 서버에 데이터를 보낼 수 있다
    • 응답 본문을 통해 클라이언트에게 데이터를 반환할 수 있다.
    • 문자열이며 구조적인 시작줄, 헤더와 달리 본문은 임의의 이진 데이터(이미지, 비디오, 오디오, 응용 소프트웨어, …)를 포함할 수 있다. 물론 텍스트도 포함될 수 있다.

5.3 간단한 메시지의 예

  • 요청 → Http 메시지 작성 → 서버가 비즈니스 로직 수행 → Http 응답 메시지 작성 → 브라우저 렌더링
  • 책의 이미지 참고

6. TCP 커넥션

메시지가 어떻게 한 곳에서 다른 곳으로 옮겨가는가?

6.1 TCP/IP

  • HTTP는 애플리케이션 계층 프로토콜
  • HTTP는 네트워크 통신의 세부 사항에 대해서는 TCP/IP 프로토콜에 위임(존립의 의존, 기초)한다
  • TCP가 보장하는 것 : 신뢰성 있는 전송을 보장
    • 오류 없는 데이터 전송
    • 순서에 맞는 전달(데이터는 언제나 보낸 순서대로 도착)
    • 조각나지 않는 데이터 스트림(언제든 어떤크기로든 보낼 수 있다
  • TCP/IP 프로토콜은 TCP와 IP가 층을 이루는 패킷 교환 네트워크 프로토콜의 집합이다
  • 어떤 종류의 컴퓨터든, 네트워크든 서로 신뢰성 있는 의사소통을 하게 해줌
  • 네트워크나 하드웨어의 특성을 숨기고, 어떤 종류의 컴퓨터나 네트워크든 서로 신뢰성 있는 의사소통을 하게 해줌
  • 한번 TCP/IP 커넥션이 맺어지면 클라이언트-서버 컴퓨터 간에 교환되는 메시지가 손실되거나, 손상되거나, 순서가 뒤바뀌어 수신되는 일이 없어진다.

6.2 접속, IP 주소 그리고 포트번호

  • 클라이언트가 서버에 메시지를 전송할 수 있게 되기 전에, **인터넷 주소(IP)**와 포트번호를 이용해 클라이언트-서버 간 TCP/IP 커넥션을 맺어야 한다.
  • HTTP 서버의 IP와 포트번호를 알아내려면 URL을 이용해야한다.
    • URL에는 IP 주소와 포트 번호를 가지고 있다.
    • IP 주소가 도메인 이름 또는 호스트명으로 되어 있을 경우, **도메인 이름 서비스(DNS)**를 통해 쉽게 IP로 변환될 수 있다.
    • HTTP URL에 대해서, 포트번호가 누락된 경우 기본적으로 80번 포트라고 가정하면 된다.
  • IP 주소, 포트번호를 이용해 클라이언트는 TCP/IP 로 쉽게 통신할 수 있다.

6.3 웹 브라우저가 HTML 리소스를 얻어오고 화면에 보여주는 과정

  • 웹 브라우저는 서버의 URL에서 호스트 명을 추출한다
  • 웹 브라우저는 서버의 호스트명을 IP로 변환한다.
  • 웹 브라우저는 URL에서 포트번호(가 있다면) 추출한다
  • 웹 브라우저는 웹 서버와 TCP/IP 커넥션을 맺는다
  • 웹 브라우저는 서버에 HTTP 요청을 보낸다
  • 서버는 웹 브라우저에 HTTP 응답을 돌려준다
  • 커넥션이 닫히면 웹 브라우저는 문서를 보여준다

6.4 텔넷을 이용한 실제 예제

telnet www.google.com 80
Trying 172.217.161.228...
Connected to www.google.com.
Escape character is '^]'.
GET /index.html HTTP/1.1
Host: www.google.com

HTTP/1.1 200 OK
Date: Thu, 31 Aug 2023 07:48:55 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Content-Security-Policy-Report-Only: object-src 'none';base-uri 'self';script-src 'nonce-w5ERXjnR4k9td6PcYqEt3g' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2023-08-31-07; expires=Sat, 30-Sep-2023 07:48:55 GMT; path=/; domain=.google.com; Secure
Set-Cookie: NID=511=sQxHDUBWtzwlhDD1DEIQ1SlUTbLDTxMXrRQIEit0DaSPrtBFoQhaXBuOsPLKHAn_6rv90Yda5sdYPZTSBzkTuUHOiwpU9674hHg8a2cLFLxHa6U_26EzQak_69e2-ycTUzZrtK76c0kEfJE_XkvlqE4GKsxiwMzn6EZIosmmb_M; expires=Fri, 01-Mar-2024 07:48:55 GMT; path=/; domain=.google.com; HttpOnly
Accept-Ranges: none
Vary: Accept-Encoding
Transfer-Encoding: chunked

5b9b
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ko"><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script nonce="w5ERXjnR4k9td6PcYqEt3g">(function(){var _g={kEI:'50XwZOKyLaeA2roP3oGW6A0',kEXPI:'0,18167,1341242,6059,206,2415,2389,2316,383,246,5,1129120,1197767,124,510,302561,77529,16114,28684,22430,1362,284,12030,4751,12834,4998,17075,38444,2872,2891,8349,3405,606,30668,27618,2404,6397,9938,20583,4,3832,42127,11442,2216,4437,22592,6645,7596,1,42154,2,38003,1758,5679,1020,31122,4569,6258,23418,1252,25135,19,7910,2,2,1,6960,19672,8155,7381,15969,874,19633,6,1923,9779,22887,13398,6174,20198,928,16691,2518,14,82,20206,8377,13129,5831,5403,2266,764,5628,483,11509,13357,449,12601,6690,2171,5253,6561,1635,7948,5742,751,545,3147,8566,1992,1059,4717,146,12742,3,9,3687,442,1271,976,1437,5210494,113,711,2,195,47,197,22,5994601,2803117,3311,141,795,19735,1,7887,830,37,30,8,23942039,397,182,4043528,16672,39284,1619,642,1398395,23760156,3240,1040,2,257,3785,3589,6329,2079,2879,1598,1085,3338,836,2437,2286,239,731,674,2,287,273,2115,834,5070,284,2388,671,68,1599,1,472,271,1794,383,2095,282,3,3221,487,1254,1085,4,284,3362,3108,891,355,8,429,244,778,65,361,1488,392,494,500,100,203,42,584,515,394,1007,162,637,681,30,155,499,369,3486,90,429,884,779,101,224,6,505,2,483,143,54,524,835,297,381,41,833,769,427,249,463,465,39,502,4,44,182,2,30,187,77,823,191,772,93,60,343,498,169,227,42,1079,5,644,84,192,1562,106,3,1626,203,227,63,5,8,100,532,648,191,75,938,97,508,1224,74,760,420,324,238,569,96,323,21,20,1491,104,598',kBL:'eCkV',kOPI:89978449};(function(){var a;(null==(a=window.google)?0:a.stvsc)?google.kEI=_g.kEI:window.google=_g;}).call(this);})();(function(){google.sn='webhp';google.kHL='ko';})();(function(){
var h=this||self;function l(){return void 0!==window.google&&void 0!==window.google.kOPI&&0!==window.google.kOPI?window.google.kOPI:null};var m,n=[];function p(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));)a=a.parentNode;return b||m}function q(a){for(var b=null;a&&(!a.getAttribute||!(b=a.getAttribute("leid")));)a=a.parentNode;return b}function r(a){/^http:/i.test(a)&&"https:"===window.location.protocol&&(google.ml&&google.ml(Error("a"),!1,{src:a,glmm:1}),a="");return a}
function t(a,b,c,d,k){var e="";-1===b.search("&ei=")&&(e="&ei="+p(d),-1===b.search("&lei=")&&(d=q(d))&&(e+="&lei="+d));d="";var g=-1===b.search("&cshid=")&&"slh"!==a,f=[];f.push(["zx",Date.now().toString()]);h._cshid&&g&&f.push(["cshid",h._cshid]);c=c();null!=c&&f.push(["opi",c.toString()]);for(c=0;c<f.length;c++){if(0===c||0<c)d+="&";d+=f[c][0]+"="+f[c][1]}return"/"+(k||"gen_204")+"?atyp=i&ct="+String(a)+"&cad="+(b+e+d)};m=google.kEI;google.getEI=p;google.getLEI=q;google.ml=function(){return null};google.log=function(a,b,c,d,k,e){e=void 0===e?l:e;c||(c=t(a,b,e,d,k));if(c=r(c)){a=new Image;var g=n.length;n[g]=a;a.onerror=a.onload=a.onabort=function(){delete n[g]};a.src=c}};google.logUrl=function(a,b){b=void 0===b?l:b;return t("",a,b)};}).call(this);(function(){google.y={};google.sy=[];google.x=function(a,b){if(a)var c=a.id;else{do c=Math.random();while(google.y[c])}google.y[c]=[a,b];return!1};google.sx=function(a){google.sy.push(a)};google.lm=[];google.plm=function(a){google.lm.push.apply(google.lm,a)};google.lq=[];google.load=function(a,b,c){google.lq.push([[a],b,c])};google.loadAll=function(a,b){google.lq.push([a,b])};google.bx=!1;google.lx=function(){};var d=[];google.fce=function(a,b,c,e){d.push([a,b,c,e])};google.qce=d;}).call(this);google.f={};(function(){
document.documentElement.addEventListener("submit",function(b){var a;if(a=b.target){var c=a.getAttribute("data-submitfalse");a="1"===c||"q"===c&&!a.elements.q.value?!0:!1}else a=!1;a&&(b.preventDefault(),b.stopPropagation())},!0);document.documentElement.addEventListener("click",function(b){var a;a:{for(a=b.target;a&&a!==document.documentElement;a=a.parentElement)if("A"===a.tagName){a="1"===a.getAttribute("data-nohref");break a}a=!1}a&&b.preventDefault()},!0);}).call(this);</script><style>#gb{font:13px/27px Arial,sans-serif;height:30px}#gbz,#gbg{position:absolute;white-space:nowrap;top:0;height:30px;z-index:1000}#gbz{left:0;padding-left:4px}#gbg{right:0;padding-right:5px}#gbs{background:transparent;position:absolute;top:-999px;visibility:hidden;z-index:998;right:0}.gbto #gbs{background:#fff}#gbx3,#gbx4{background-color:#2d2d2d;background-image:none;_background-image:none;background-position:0 -138px;background-repeat:repeat-x;border-bottom:1px solid #000;font-size:24px;height:29px;_height:30px;opacity:1;filter:alpha(opacity=100);position:absolute;top:0;width:100%;z-index:990}#gbx3{left:0}#gbx4{right:0}#gbb{position:relative}#gbbw{left:0;position:absolute;top:30px;width:100%}.gbtcb{position:absolute;visibility:hidden}#gbz .gbtcb{right:0}#gbg .gbtcb{left:0}.gbxx{display:none !important}.gbxo{opacity:0 !important;filter:alpha(opacity=0) !important}.gbm{position:absolute;z-index:999;top:-999px;visibility:hidden;text-align:left;border:1px solid #bebebe;background:#fff;-moz-box-shadow:-1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2)}.gbrtl .gbm{-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2)}.gbto .gbm,.gbto #gbs{top:29px;visibility:visible}#gbz .gbm{left:0}#gbg .gbm{right:0}.gbxms{background-color:#ccc;display:block;position:absolute;z-index:1;top:-1px;left:-2px;right:-2px;bottom:-2px;opacity:.4;-moz-border-radius:3px;filter:progid:DXImageTransform.Microsoft.Blur(pixelradius=5);*opacity:1;*top:-2px;*left:-5px;*right:5px;*bottom:4px;-ms-filter:"progid:DXImageTransform.Microsoft.Blur(pixelradius=5)";opacity:1\0/;top:-4px\0/;left:-6px\0/;right:5px\0/;bottom:4px\0/}.gbma{position:relative;top:-1px;border-style:solid dashed dashed;border-color:transparent;border-top-color:#c0c0c0;display:-moz-inline-box;display:inline-block;font-size:0;height:0;line-height:0;width:0;border-width:3px 3px 0;padding-top:1px;left:4px}#gbztms1,#gbi4m1,#gbi4s,#gbi4t{zoom:1}.gbtc,.gbmc,.gbmcc{display:block;list-style:none;margin:0;padding:0}.gbmc{background:#fff;padding:10px 0;position:relative;z-index:2;zoom:1}.gbt{position:relative;display:-moz-inline-box;display:inline-block;line-height:27px;padding:0;vertical-align:top}.gbt{*display:inline}.gbto{box-shadow:0 2px 4px rgba(0,0,0,.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2)}.gbzt,.gbgt{cursor:pointer;display:block;text-decoration:none !important}span#gbg6,span#gbg4{cursor:default}.gbts{border-left:1px solid transparent;border-right:1px solid transparent;display:block;*display:inline-block;padding:0 5px;position:relative;z-index:1000}.gbts{*display:inline}.gbzt .gbts{display:inline;zoom:1}.gbto .gbts{background:#fff;border-color:#bebebe;color:#36c;padding-bottom:1px;padding-top:2px}.gbz0l .gbts{color:#fff;font-weight:bold}.gbtsa{padding-right:9px}#gbz .gbzt,#gbz .gbgt,#gbg .gbgt{color:#ccc!important}.gbtb2{display:block;border-top:2px solid transparent}.gbto .gbzt .gbtb2,.gbto .gbgt .gbtb2{border-top-width:0}.gbtb .gbts{background:url(https://ssl.gstatic.com/gb/images/b_8d5afc09.png);_background:url(https://ssl.gstatic.com/gb/images/b8_3615d64d.png);background-position:-27px -22px;border:0;font-size:0;padding:29px 0 0;*padding:27px 0 0;width:1px}.gbzt:hover,.gbzt:focus,.gbgt-hvr,.gbgt:focus{background-color:#4c4c4c;background-image:none;_background-image:none;background-position:0 -102px;background-repeat:repeat-x;outline:none;text-decoration:none !important}.gbpdjs .gbto .gbm{min-width:99%}.gbz0l .gbtb2{border-top-color:#dd4b39!important}#gbi4s,#gbi4s1{font-weight:bold}#gbg6.gbgt-hvr,#gbg6.gbgt:focus{background-color:transparent;background-image:none}.gbg4a{font-size:0;line-height:0}.gbg4a .gbts{padding:27px 5px 0;*padding:25px 5px 0}.gbto .gbg4a .gbts{padding:29px 5px 1px;*padding:27px 5px 1px}#gbi4i,#gbi4id{left:5px;border:0;height:24px;position:absolute;top:1px;width:24px}.gbto #gbi4i,.gbto #gbi4id{top:3px}.gbi4p{display:block;width:24px}#gbi4id{background-position:-44px -101px}#gbmpid{background-position:0 0}#gbmpi,#gbmpid{border:none;display:inline-block;height:48px;width:48px}#gbmpiw{display:inline-block;line-height:9px;padding-left:20px;margin-top:10px;position:relative}#gbmpi,#gbmpid,#gbmpiw{*display:inline}#gbg5{font-size:0}#gbgs5{padding:5px !important}.gbto #gbgs5{padding:7px 5px 6px !important}#gbi5{background:url(https://ssl.gstatic.com/gb/images/b_8d5afc09.png);_background:url(https://ssl.gstatic.com/gb/images/b8_3615d64d.png);background-position:0 0;display:block;font-size:0;height:17px;width:16px}.gbto #gbi5{background-position:-6px -22px}.gbn .gbmt,.gbn .gbmt:visited,.gbnd .gbmt,.gbnd .gbmt:visited{color:#dd8e27 !important}.gbf .gbmt,.gbf .gbmt:visited{color:#900 !important}.gbmt,.gbml1,.gbmlb,.gbmt:visited,.gbml1:visited,.gbmlb:visited{color:#36c !important;text-decoration:none !important}.gbmt,.gbmt:visited{display:block}.gbml1,.gbmlb,.gbml1:visited,.gbmlb:visited{display:inline-block;margin:0 10px}.gbml1,.gbmlb,.gbml1:visited,.gbmlb:visited{*display:inline}.gbml1,.gbml1:visited{padding:0 10px}.gbml1-hvr,.gbml1:focus{outline:none;text-decoration:underline !important}#gbpm .gbml1{display:inline;margin:0;padding:0;white-space:nowrap}.gbmlb,.gbmlb:visited{line-height:27px}.gbmlb-hvr,.gbmlb:focus{outline:none;text-decoration:underline !important}.gbmlbw{color:#ccc;margin:0 10px}.gbmt{padding:0 20px}.gbmt:hover,.gbmt:focus{background:#eee;cursor:pointer;outline:0 solid black;text-decoration:none !important}.gbm0l,.gbm0l:visited{color:#000 !important;font-weight:bold}.gbmh{border-top:1px solid #bebebe;font-size:0;margin:10px 0}#gbd4 .gbmc{background:#f5f5f5;padding-top:0}#gbd4 .gbsbic::-webkit-scrollbar-track:vertical{background-color:#f5f5f5;margin-top:2px}#gbmpdv{background:#fff;border-bottom:1px solid #bebebe;-moz-box-shadow:0 2px 4px rgba(0,0,0,.12);-o-box-shadow:0 2px 4px rgba(0,0,0,.12);-webkit-box-shadow:0 2px 4px rgba(0,0,0,.12);box-shadow:0 2px 4px rgba(0,0,0,.12);position:relative;z-index:1}#gbd4 .gbmh{margin:0}.gbmtc{padding:0;margin:0;line-height:27px}.GBMCC:last-child:after,#GBMPAL:last-child:after{content:'\0A\0A';white-space:pre;position:absolute}#gbmps{*zoom:1}#gbd4 .gbpc,#gbmpas .gbmt{line-height:17px}#gbd4 .gbpgs .gbmtc{line-height:27px}#gbd4 .gbmtc{border-bottom:1px solid #bebebe}#gbd4 .gbpc{display:inline-block;margin:16px 0 10px;padding-right:50px;vertical-align:top}#gbd4 .gbpc{*display:inline}.gbpc .gbps,.gbpc .gbps2{display:block;margin:0 20px}#gbmplp.gbps{margin:0 10px}.gbpc .gbps{color:#000;font-weight:bold}.gbpc .gbpd{margin-bottom:5px}.gbpd .gbmt,.gbpd .gbps{color:#666 !important}.gbpd .gbmt{opacity:.4;filter:alpha(opacity=40)}.gbps2{color:#666;display:block}.gbp0{display:none}.gbp0 .gbps2{font-weight:bold}#gbd4 .gbmcc{margin-top:5px}.gbpmc{background:#fef9db}.gbpmc .gbpmtc{padding:10px 20px}#gbpm{border:0;*border-collapse:collapse;border-spacing:0;margin:0;white-space:normal}#gbpm .gbpmtc{border-top:none;color:#000 !important;font:11px Arial,sans-serif}#gbpms{*white-space:nowrap}.gbpms2{font-weight:bold;white-space:nowrap}#gbmpal{*border-collapse:collapse;border-spacing:0;border:0;margin:0;white-space:nowrap;width:100%}.gbmpala,.gbmpalb{font:13px Arial,sans-serif;line-height:27px;padding:10px 20px 0;white-space:nowrap}.gbmpala{padding-left:0;text-align:left}.gbmpalb{padding-right:0;text-align:right}#gbmpasb .gbps{color:#000}#gbmpal .gbqfbb{margin:0 20px}.gbp0 .gbps{*display:inline}a.gbiba{margin:8px 20px 10px}.gbmpiaw{display:inline-block;padding-right:10px;margin-bottom:6px;margin-top:10px}.gbxv{visibility:hidden}.gbmpiaa{display:block;margin-top:10px}.gbmpia{border:none;display:block;height:48px;width:48px}.gbmpnw{display:inline-block;height:auto;margin:10px 0;vertical-align:top}
.gbqfb,.gbqfba,.gbqfbb{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;cursor:default !important;display:inline-block;font-weight:bold;height:29px;line-height:29px;min-width:54px;*min-width:70px;padding:0 8px;text-align:center;text-decoration:none !important;-moz-user-select:none;-webkit-user-select:none}.gbqfb:focus,.gbqfba:focus,.gbqfbb:focus{border:1px solid #4d90fe;-moz-box-shadow:inset 0 0 0 1px rgba(255, 255, 255, 0.5);-webkit-box-shadow:inset 0 0 0 1px rgba(255, 255, 255, 0.5);box-shadow:inset 0 0 0 1px rgba(255, 255, 255, 0.5);outline:none}.gbqfb-hvr:focus,.gbqfba-hvr:focus,.gbqfbb-hvr:focus{-webkit-box-shadow:inset 0 0 0 1px #fff,0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:inset 0 0 0 1px #fff,0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 0 0 1px #fff,0 1px 1px rgba(0,0,0,.1)}.gbqfb-no-focus:focus{border:1px solid #3079ed;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.gbqfb-hvr,.gbqfba-hvr,.gbqfbb-hvr{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.gbqfb::-moz-focus-inner,.gbqfba::-moz-focus-inner,.gbqfbb::-moz-focus-inner{border:0}.gbqfba,.gbqfbb{border:1px solid #dcdcdc;border-color:rgba(0,0,0,.1);color:#444 !important;font-size:11px}.gbqfb{background-color:#4d90fe;background-image:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#4787ed));background-image:-webkit-linear-gradient(top,#4d90fe,#4787ed);background-image:-moz-linear-gradient(top,#4d90fe,#4787ed);background-image:-ms-linear-gradient(top,#4d90fe,#4787ed);background-image:-o-linear-gradient(top,#4d90fe,#4787ed);background-image:linear-gradient(top,#4d90fe,#4787ed);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#4d90fe',EndColorStr='#4787ed');border:1px solid #3079ed;color:#fff!important;margin:0 0}.gbqfb-hvr{border-color:#2f5bb7}.gbqfb-hvr:focus{border-color:#2f5bb7}.gbqfb-hvr,.gbqfb-hvr:focus{background-color:#357ae8;background-image:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#357ae8));background-image:-webkit-linear-gradient(top,#4d90fe,#357ae8);background-image:-moz-linear-gradient(top,#4d90fe,#357ae8);background-image:-ms-linear-gradient(top,#4d90fe,#357ae8);background-image:-o-linear-gradient(top,#4d90fe,#357ae8);background-image:linear-gradient(top,#4d90fe,#357ae8)}.gbqfb:active{background-color:inherit;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.3);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.3);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.3)}.gbqfba{background-color:#f5f5f5;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f1f1f1));background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#f5f5f5',EndColorStr='#f1f1f1')}.gbqfba-hvr,.gbqfba-hvr:active{background-color:#f8f8f8;background-image:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),to(#f1f1f1));background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#f8f8f8',EndColorStr='#f1f1f1')}.gbqfbb{background-color:#fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#fbfbfb));background-image:-webkit-linear-gradient(top,#fff,#fbfbfb);background-image:-moz-linear-gradient(top,#fff,#fbfbfb);background-image:-ms-linear-gradient(top,#fff,#fbfbfb);background-image:-o-linear-gradient(top,#fff,#fbfbfb);background-image:linear-gradient(top,#fff,#fbfbfb);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff',EndColorStr='#fbfbfb')}.gbqfbb-hvr,.gbqfbb-hvr:active{background-color:#fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#fff,#f8f8f8);background-image:-moz-linear-gradient(top,#fff,#f8f8f8);background-image:-ms-linear-gradient(top,#fff,#f8f8f8);background-image:-o-linear-gradient(top,#fff,#f8f8f8);background-image:linear-gradient(top,#fff,#f8f8f8);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff',EndColorStr='#f8f8f8')}.gbqfba-hvr,.gbqfba-hvr:active,.gbqfbb-hvr,.gbqfbb-hvr:active{border-color:#c6c6c6;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);color:#222 !important}.gbqfba:active,.gbqfbb:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}

// 생략

</html>
  • HTTP는 TCP/IP를 사용하고 있으며, 이진 형식이 아닌 문자열 기반이기 때문에 웹 서버와 직접 대화하는 것도 가능하다.
  • 우선 텔넷을 통해 호스트 주소와 포트를 기입한다.
  • 텔넷 유틸리티는 우리를 대신해서 실제 TCP/IP 커넥션을 맺는다.
  • 이후 HTTP 요청을 타이핑해서 입력하고, 요청이 완료되면(빈줄 입력), 서버는 콘텐츠를 HTTP 응답에 담아 반환하고 커넥션을 끊는다.

7. 프로토콜 버전

  • HTTP/0.9
    • 결함이 다수 있고 구식 클라이언트하고만 같이 사용 가능
    • GET 메서드만 지원
    • MIME 타입, 헤더, HTTP 버전정보 지원 안 됨
    • 간단한 HTML 객체를 받아오기 위해 만들어졌고 금방 HTTP/1.0으로 대체
  • HTTP/1.0
    • 널리 쓰이기 시작한 버전
    • 버전 번호, HTTP 헤더, 추가 메서드, 멀티미디어 객체 처리 추가
    • 시각적으로 협력적인 웹페이지와 상호작용하는 폼을 실현
    • 월드 와이드 웹을 대세로 만듬
  • HTTP/1.0+
    • 웹 성장에 힘입어 여러 요구를 만족시키고자 HTTP에 기능 추가.
    • 지속 연결(Keep-alive 커넥션), 가상 호스팅 지원, 프락시 연결 지원…
    • 수 많은 기능들이 공식적이지는 않지만 사실상의 표준으로 HTTP에 추가됨
    • 이렇게 규격외 확장된 HTTP 버전을 흔히 HTTP/1.0+ 라고 부른다.
  • HTTP/1.1
    • HTTP 설계의 구조적 결함 교정, 두드러진 성능 최적화, 잘못된 기능 제거에 집중
    • 더 복잡해진 웹 애플리케이션과 배포를 지원.
  • HTTP/2.0
    • HTTP 1.1 성능 문제를 개선

8. 웹의 구성 요소

8.1 여러가지 웹의 구성요소

  • 프록시 : 클라이언트 - 서버 사이에 위치한 HTTP 중개자
  • 캐시 : 웹 페이지를 클라이언트 가까이에 보관하는(캐싱) HTTP 창고
  • 게이트웨이 : 다른 애플리케이션과 연결된 특별한 웹 서버
  • 터널 : 단순히 HTTP 통신을 전달하기만 함
  • 에이전트 : 자동화된 HTTP 요청을 만드는 웹 클라이언트
    • 예) 웹 브라우저, 봇 …

8.2 프록시

  • 웹 보안, 애플리케이션 통합, 성능 최적화를 목적으로 클라이언트-서버 사이에 위치
  • 클라이언트의 모든 HTTP 요청을 받아, 서버에 전달.
  • 사용자를 대신하여 서버에 접근
  • 주로 보안 등 부가 기능을 목적으로 중개자 역할을 수행.
  • 요청, 응답을 필터링할 수 있다.

8.3 캐시

  • 웹 캐시, 캐시 프락시
  • 자주 찾아지는 데이터의 사본을 저장해두는 특별한 종류의 HTTP 프락시 서버
  • 멀리 떨어진 웹 서버보다, 가까이에 있는 캐시에서 더 빠르게 문서를 다운받을 수 있음
  • HTTP 기술 차원에서, 캐시를 효율적으로 동작하게 하고 캐시된 콘텐츠를 최신버전으로 유지하면서 동시에 프라이버시도 보호하기 위한 많은 기능을 정의해둠

8.4 게이트웨이

  • 다른 서버들의 중개자
  • 스스로가 리소스를 가지고 있는 진짜 서버인 것처럼 요청을 다룸
  • 클라이언트는 자신이 게이트웨이와 통신하고 있음을 알기 힘듬
  • 예) 웹 서버 - 웹 애플리케이션 서버(게이트웨이) - 데이터베이스
  • 예) HTTP 클라이언트 - HTTP/FTP 게이트웨이 - FTP 서버

8.5 터널

  • 두 커넥션 사이에 날(raw) 데이터를 열어보지 않고 그대로 전달해주는 HTTP 애플리케이션
  • 주로 비 HTTP 데이터를 하나 이상의 HTTP 연결을 통해 그대로 전송해주기 위해 사용
  • 예) 암호화된 SSL 트래픽을 HTTP 커넥션으로 전송하기
    • HTTP/SSL 터널은 HTTP 요청을 받아들여, 목적지 주소, 포트번호로 커넥션을 맺은 뒤 암호화된 SSL 트래픽을 HTTP 채널을 통해 목적지로 전송

8.6 에이전트

  • 사용자를 위해 HTTP 요청을 만들어주는 클라이언트 프로그램
  • 웹 요청을 만드는 애플리케이션이면 모두 HTTP 에이전트
  • 웹 브라우저도 HTTP 에이전트
  • 자동화된 사용자 에이전트도 존재
    • 웹로봇, 스파이더
    • 웹을 돌아다니며 검색엔진의 데이터베이스, 유용한 웹 콘텐츠 보관소를 만듬

 


이어서

이상으로 HTTP 완벽가이드의 01장, HTTP 개관에 대해 살펴봤습니다.

이어지는 글에서는 '02장 URL과 리소스'에 대해 학습 내역을 정리해보겠습니다.

 

 

Comments