Requests & Responses

Requests & Responses

목차 - HTTP란? (HyperText Transaction Protocol) - 서버란? - URI (Uniform Resource Identifier) - Hostnames - Ports - HTTP GET requests - HTTP responses

HTTP란? (HyperText Transaction Protocol)

HTTP(HyperText Transaction Protocol)는 웹 브라우저와 웹 서버가 영상, 음성 파일 등을 주고받기 위한 프로토콜(통신 규약)입니다.

HTTP 처리 과정은 항상 client와 server를 수반합니다. 그리고, 간단한 웹페이지를 브라우저 화면에 띄우는 것도 client가 server에 많은 요청 메시지를 보내는 작업이 포함됩니다. 예를 들면, HTML page나 사진, 영상 등의 데이터를 요청하는 작업이 있습니다. 나아가 Google에서 링크를 클릭하는 일, 위키피디아에서 수정사항을 저장하는 작업, 스마트폰 어플리케이션으로 음식을 주문하는 일 등 모두 HTTP를 사용합니다.


##### Server란? 서버란 Network 상의 다른 프로그램의 연결을 허락하는 프로그램입니다. 여기서 프로그램이라고 했는데, 우리의 컴퓨터나 노트북이 이러한 프로그램의 역할을 하면, 우리의 컴퓨터 또한 서버가 될 수 있습니다. 단지, 인터넷상에서 client(웹브라우저)가 요청한 사진이나 데이터를 전달하기 위해서는 컴퓨터가 항상 켜져 있어야 하고 성능이 좋아야 하므로 서버 프로그램을 가동하기 위한 서버용 컴퓨터가 따로 있습니다.
##### URI (Uniform Resource Identifier) 통합 자원 식별자는 인터넷에 산재해 있는 자원을 나타내는 주소입니다. URI는 여러 파트로 구분할 수 있고, 각 파트별 고유 syntax가 있습니다. 그리고, URI 중 대부분의 파트는 선택 사항이고, 이것은 각각의 URI가 매우 다르게 보이는 이유입니다.

다음의 예제 URI를 살펴보겠습니다. https://en.wikipedia.org/wiki/Fish

이 예제는 punctuation으로 구분된 세 부분으로 나눌 수 있습니다.   - https는 scheme   - en.wikipedia.org는 hostname   - /wiki/Fish는 path


##### Scheme 위 주소의 첫 부분은 scheme을 나타냅니다. scheme은 온라인 자원에 접근하는 방식을 나타내며, http, https, file과 같은 것들이 있습니다. file scheme은 클라이언트가 local filesystem에 접근하는 것을 허락합니다. http와 https는 거의 같지만, https는 암호화된 연결을 사용하기 때문에 많은 웹사이트가 https를 사용합니다.

이 외에도 많은 종류의 scheme이 있고, 이곳에서 구체적인 사항들을 확인할 수 있습니다.

Hostname

Hostname은 client가 어떠한 서버에 접속할지를 나타냅니다. 웹브라우저로 특정 서버에 접근할 때 주소창에 hostname만 표시된 걸 볼 수 있습니다. 하지만, HTML의 anchor tag에 다음과 같이 표기할 수는 없습니다.

<a href="www.google.com">this</a>

hostname은 scheme 다음에 위치해야 그 기능을 하며 scheme과 hostname은 '://'로 연결을 합니다. 하지만, hostname 없이 사용하는 scheme도 있습니다. 예를 들면, mailto의 경우 hostname 없이 이메일 주소만 함께 사용합니다. (예, spam@example.net) 또, 위의 두 경우를 참고해 보면, scheme 다음에 ':'가 위치하고, hostname의 경우 추가로 '//'가 붙는 것을 알 수 있습니다.

Path

다음으로 서버의 특정 자원을 구분하는 Path가 있습니다. 서버에는 이미지, 영상, API, 웹페이지 등 다양한 자원이 있습니다. 그리고 이 Path는 client가 어떠한 자원을 찾고 있는지 보여줍니다.

그렇다고 하지만, Path가 꼭 특정 파일 이름으로 되어 있지는 않습니다. 구글을 검색했을 때 '/search?q=ponies'와 같은 path를 확인할 수 있습니다. 이것은 구글 서버에 'search?q=ponies'와 같은 파일이 있다는 것을 의미하지는 않습니다. 서버에서 path를 해석 후 어떠한 정보를 전달할지를 인지합니다.

그리고 path가 없이 주소를 입력하면 default path로 이동을 하게 되며, 이것을 root 폴더라고도 합니다. default folder는 하나의 slash만 있으며, 'https://google.com'과 'https://google.com/'은 같습니다.

다른 URI

아래의 두 링크를 한 번 살펴보겠습니다.

https://en.wikipedia.org/wiki/Oxygen https://en.wikipedia.org/wiki/Oxygen#Discovery

두 링크는 같은 웹페이지를 불러옵니다. 하지만, 아래쪽 링크는 웹페이지의 Discovery 부분으로 스크롤 된 화면을 출력합니다. URI의 '#'는 fragment라고 합니다. 브라우저는 이 정보를 서버에 보내지는 않고, 직접 웹페이지의 특정 이름의 부분으로 이동합니다. 이 이름은 id 값으로 구분합니다.

https://www.google.com/search?q=fish

위 링크의 '?q=fish'는 URI의 query 파트이며, 이 정보는 서버로 전달됩니다. 여러 종류의 URI가 있으며, 추가 사항은 아래의 위키피디아 링크를 참조해 주세요.

https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Generic_syntax


##### Hostnames 앞서 URI 상에 hostname이 포함된다고 언급했습니다. 이 hostname 표기는 IP address로 대신할 수도 있습니다. 예로 브라우저에 http://216.58.194.174/ 를 입력하면 구글 사이트가 나타납니다.

"Why is it called a hostname: In network terminology, a host is a computer on the netweork; one that could host services."

인터넷은 컴퓨터를 IP address로 분간합니다. 인터넷상 모든 Network traffic은 정보를 주고받는 컴퓨터에 IP address로 표기됩니다. 컴퓨터의 운영 체제 네트워크 환경은 hostname을 검색해서 IP address를 확인하기 위해 DNS(Domain Name Service)를 이용합니다. DNS는 Internet Service Providers(ISPs)와 Network user에 운영되는 서버입니다.

터미널상에서도 'host' 또는 'nshost'의 명령어를 통해 hostname을 검색해 IP address를 확인할 수 있습니다. 맥의 경우 'host'를 사용하면 됩니다. 구버전인 IPv4가 있고 신버전인 IPv6가 있습니다.

$ host www.google.com
www.google.com has address 216.58.220.196
www.google.com has IPv6 address 2404:6800:4005:803::2004

##### Localhost IPv4 address 127.0.0.1 또는 IPv6 address ::1은 'this computer itself'를 가리키는 특별한 주소입니다. 브라우저가 제가 사용하고 있는 컴퓨터의 서버에 접근할 수 있도록 하는 주소입니다. 이 주소의 hostname이 localhost 입니다.
##### Ports 대부분의 웹 주소에서 포트 넘버를 확인할 수 없을 것입니다. 이는 보통 client가 URI의 scheme에서 port number를 확인할 수 있기 때문입니다. 예로 HTTP URI는 port number가 80임을 나타냅니다. 반면, HTTPS URI는 port number가 443임을 나타냅니다.

그러면 port number란 무엇일까요? 이를 알기 위해서는 인터넷이 어떻게 동작하는지 살펴봐야합니다. 모든 network traffic은 'packets'이라 불리는 message로 나누어집니다. 각각의 packet은 그것을 보내는 컴퓨터와 받는 컴퓨터의 IP 주소를 포함합니다. 그리고 ping과 같은 low-level packet을 제외하고, packet은 sender와 recipient의 IP 주소를 가지고 있습니다. IP 주소로 컴퓨터를 분간하고, Port Number로 그 컴퓨터의 프로그램을 구분합니다.


##### HTTP GET requests 제 컴퓨터에 localhost 서버를 작동시키고, 웹브라우저에서 'http://localhost:8000/greatphoto.jpg' 와 같이 입력을 했으며, 터미널 창에 아래와 같은 message를 확인할 수 있습니다.

127.0.0.1 - - [25/Sep/2018 11:04:03] "GET /greatphoto.jpg HTTP/1.1" 404 -

위의 "GET /greatphoto.jpg HTTP/1.1"는 브라우저가 서버에 요청하는 request line을 나타내며, 세 부분으로 구성됩니다.

-'GET'은 메서드 또는 HTTP verb라고 하며, 어떤 종류의 request인지를 말해줍니다. 'GET'은 client가 서버 측에 웹페이지나 이미지 등의 전송을 원할 때 사용하는 verb입니다. 이후에 client가 form을 submit하거나 자원의 변경을 원할 때 발송하는 다른 verb에 대해서도 살펴보겠습니다.

-/greatphoto.jpg는 요청하는 자원의 path입니다. client가 전체 URI('http://localhost:8000/greatphoto.jpg') 가 아닌 path만 전달한 점을 주목해 주세요.

-HTTP/1.1은 request의 protocol입니다. 시간이 흐르며 HTTP가 작동하는 방식에 여러 변화가 있었습니다. 이 부분은 서버 측에 어떠한 버전의 HTTP를 사용하고 있는지를 말해줍니다.


##### HTTP responses 터미널에서 새 창을 키고, 위에서 작동시킨 localhost에 ncat을 이용해 접속했습니다. HTTP GET request를 전달하고 아래와 같이 응답을 받았습니다. 이러한 요청은 브라우저가 서버에 이미지나 웹페이지 등을 요청할 때마다 발생합니다. ```terminal $ ncat 127.0.0.1 8000 GET / HTTP/1.1 Host: localhost

HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.7.0 Date: Tue, 25 Sep 2018 03:16:43 GMT Content-type: text/html; charset=utf-8 Content-Length: 975

Directory listing for /

Directory listing for /

... ``` HTTP의 응답 메시지는 status line(응답 행), status header(응답 헤더), response body(본문) 세 부분으로 구성됩니다.

Status Line(응답 행) 위의 Response에서 응답 행은 'HTTP/1.0 200 OK' 입니다. Status Line은 클라이언트에게 서버가 요청 사항을 이해했는지, 요청한 자료를 서버가 가졌는지, 어떻게 처리를 할지 등을 알려줍니다. 또한, 어떠한 버전의 HTTP를 사용하고 있는지도 알 수 있습니다.

숫자 200은 HTTP status code이며, 다양한 종류가 있습니다. code의 첫 숫자는 HTTP 요청이 성공적으로 완료되었는지를 뜻합니다.

- 1xx - Informational. 요청 사항이 진행 중이며, 추가 작업이 있음. - 2xx - Success! HTTP 요청이 성공함. 서버는 클라이언트가 요청한 자원을 발송할 것임. - 3xx - Redirection 서버가 클라이언트에게 다른 URI를 전달함. Header에 location header가 포함되고, redirection이 영구적인지 일시적인지 구체적인 코드로 알려줌. - 4xx - Client error 서버가 클라이언트에서 요청한 내용을 파악하지 못함. 구체적인 코드로 URI가 잘 못 되었는지, 허가하지 않는 구역인지 등의 내용을 알려줌. - 5xx - Server error 서버 측에 문제가 있음. Status Code 관련 좀 더 자세한 사항은 이곳에서 확인 가능합니다.

Header 응답 메세지의 Header는 일종의 metadata입니다. 브라우저상에서 보이지는 않지만, Header에는 Location, Content-type 등과 같은 텍스트 형식의 여러 정보가 있습니다.

웹의 여러 기능은 이 header를 이용해 작동됩니다. Cookie는 서버가 브라우저에 어떠한 데이터를 저장하도록 허락합니다. 이 기능을 이용하면 유저가 특정 웹사이트에 계속 로그인이 돼 있게 할 수 있습니다. cookie를 설정하기 위해서, 서버는 Set-Cookie header를 발송합니다. 그리고 브라우저는 cookie data를 Cookie Header에 포함해서 다음 요청에 발송합니다.

위 서버의 응답 메시지 header에서 'Content-type: text/html; charset=utf-8'을 확인할 수 있습니다. 이것을 풀이해 보면, 서버가 클라이언트에 response body가 UTF-8 text로 쓰인 HTML document임을 나타냅니다.

Content-type은 서버가 발송하는 데이터의 종류를 나타냅니다. 데이터의 종류와 구체적인 format도 함께 명시됩니다. 예를 들어 PNG 이미지 파일을 요청하면, Content-type은 image/png가 됩니다.

Response Body Header 이후에 한 줄의 공백이 있습니다. 이 공백 라인 이후에는 모두 response body입니다. HTTP request가 성공하면, Response Body는 클라이언트 요청한 자원이 됩니다. (웹페이지, 이미지, 데이터 등)

하지만 HTTP request 중 에러가 발생하면, 에러 메세지가 바디에 그래도 출력이 됩니다. 예로, 서버에 존재하지 않는 경로로 접근을 하면 '404 Not Found'라는 메세지를 브라우저에서 볼 수 있습니다.