HTTP 이해하기

3 분 소요

HTTP

네트워크는 그 양이 방대하여 네트워크에 대한 내용을 쉽게 설명해 주는 사이트를 첨부한다.

www.net-intro.com

서로 다른 컴퓨터 간의 연결은 전화를 걸어서 부서 번호를 연결하는 것과 같다. 이 연결을 소켓이라고 부른다.

파이썬에서는 단 세줄로 쉽게 전화를 걸 수 있다.

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect( ('data.pr4e.org', 80) )

위에서 data.pr4e.org는 전화를 거는 대상인 Host, 80은 내선번호라고 생각하면 된다.

소켓이 작동했다면, 그 다음 문제는 어떤 것을 보내고, 어떤 것을 받을거냐이다. 이것을 Apllication protocol이라고 한다. 그리고 가장 많이 쓰는 프로토콜이 HTTP이다. (HyperText Transfer Protocol)

프로토콜은 전화에서 누가 먼저 말하냐와 같다. “여보세요?” “들립니까” 와 같은..양쪽이 합의를 본 규칙 같은 것이다.

http://www.dr-chuck.com/page1.htm

여기서 http는 Protocol, www.dr-chuck.com은 host, page1.htm은 document다. 90년대에 들어서서는 이를 암호화 하기 시작했다.

어떤 페이지에 링크가 있다면 앱(브라우져)가 클릭을 감지하고 해당 포트로 요청을 보낸다. 그러면 웹서버가 어떤 마법의 작용을 해서, 우리의 전화에 대한 답을 만들어 답변하는 것이고, 이 경우에는 바로 html로 된 정보이다. 브라우저는 html을 받아서 렌더링을 해서 웹페이지를 만들어내는 것이다. 이것이 요청-응답 반응이다.

파이선을 이용해 간단한 웹브라우져 만들기

import socket 

# 소켓 만들기 
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 소켓 연결하기 
mysock.connect(('data.pr4e.org',80))
# 연결된 소켓에 명령 보내기 
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode()
mysock.send(cmd)

# 응답 받기 
while True:
	# 512 자 까지 받은 후에 
	data = mysock.recv(512)
	# data에 더이상 값이 들어오지 않을 경우 break
	if (len(data) <1):
		break
	# 디코딩해서 출력
	print(data.decode())
# 소켓 닫기 
mysock.close()

첫번쨰 세 줄은 소켓을 가져오고 만드는 작업이다. 3번쨰줄에서 data.pr4e.org에 포트 80번에 연결한다.

우리가 이번에는 웹브라우져 입장에서 요청을 보낼 차례다. cmd에 GET명령어를 넣고 socket.send()를 통해 보낸다.

이제 받을 차례인데, mysock.recv()명령어를 통해 받은 데이타를 data에 저장한다. 512는 한번에 받을 데이타 숫자이다. data의 길이가 0이 될 떄까지 data를 받게 된다.

HTTP/1.1 200 OK
Date: Sun, 14 Mar 2010 23:52:41 GMT
Server: Apache
Last-Modified: Tue, 29 Dec 2009 01:31:22 GMT
ETag: "143c1b33-a7-4b395bea"
Accept-Ranges: bytes
Content-Length: 167
Connection: close
Content-Type: text/plain

But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief

받은 내용은 HTTP헤더(메타데이타)와 바디로 나뉘는데, 이를 구분하는것은 중간에 있는 빈 줄임을 명심하자.

댓글남기기