PHP HTTP 리퀘스트 메세지와 리스폰스 메세지

웹 페이지는 어떻게 표시되는 것일까?

브라우저에 URL을 입력하면 웹 페이지가 표시됩니다.

웹은 클라이언트와 서버가 데이터를 주고받는 것으로 웹 페이지를 표시하게 됩니다.

 

클라이언트와 서버

클라이언트란, 자신이 사용하고 있는 컴퓨터(브라우저)라고 생각하면 됩니다.

서버란, 웹 페이지의 데이터(HTML 파일이나 이미지 파일 등)가 저장되어 있는 컴퓨터라고 생각하면 됩니다.

 

클라이언트가 서버에 

“입력한 URL 웹 페이지의 데이터를 주세요”

라고 요청하는 것을 리퀘스트라고 합니다.

 

클라이언트가 요청한 것에 대해, 서버로부터 클라이언트에 웹 페이지 데이터를 전달하는 것을 리스폰스라고 합니다.

 

아래의 이미지처럼 웹 페이지에 접속할 때에 어떻게 정보를 주고받는지 확인해보도록 하겠습니다.

 

대부분의 웹페이지는 다음과 같이 클라이언트와 서버가 정보를 주고받습니다.

 

위의 이미지처럼 리퀘스트와 리스폰스를 반복하여 웹페이지를 표시하도록 합니다.

주목할 것은, 서버로부터 HTML 파일을 받은 후, 표시할 사진 개수만큼 리퀘스트와 리스폰스를 반복하고 있습니다.

하나의 페이지처럼 보이기 때문에 사진이나 영상이 포함되어 한 번에 클라이언트와 서버가 데이터를 주고받을 거라 생각이 들지만 HTML 파일 안에서 읽어 들이는 파일 수만큼 리퀘스트와 리스폰스를 반복하고 있습니다.

클라이언트와 서버가 정보를 주고받을 때에 클라이언트가 마음대로 작성해서 리퀘스트를 하면 서버측은 내용을 이해할 수 없습니다.

반대의 경우도 마찬가지입니다.

그렇기 때문에 리퀘스트 또는 리스폰스를 할 때에는, ○번째 행에는 어떠한 정보를 작성하고 어떤 것이 기술되어 있는지 규칙을 정하고 있습니다.

이것이 HTTP입니다.

 

 

HTTP(Hypertext Transfer Protoclo)란?

HTTP는 인터넷을 하다 보면 자주 보는 단어입니다.

다음이나 구글 등 웹 페이지에 접속할 때 주소 앞에 http라고 적혀있는 것을 보셨을 겁니다.

HTTP는 리퀘스트와 리스폰스를 사용할 때 쓰이는 규칙입니다.

HTTP에 대해 조금 더 자세하게 살펴보겠습니다.

HTTP란, Hypertext Transfer Protoclo 의 약자입니다.

HTTP는 Hypertext와 Transfer와 Protoclo 크게 3개로 나눠서 생각할 수 있습니다.

Hypertext란 간단하게 설명하면 HTML 등과 같은 곳에 작성한 파일을 말합니다.

Transfer란 전달한다는 의미입니다.

Protoclo이란 규약 또는 규칙이라는 의미입니다.

즉 HTTP란 HTML 파일 등을 전달하기 위한 규칙을 의미합니다.

 

HTTP는 아래와 같은 버전이 있습니다.

버전RFC
 HTTP/0.9 HTTP가 처음으로 RFC로써 공개된 것은 HTTP/1.0부터이며, HTTP/0.9는 RFC가 아닙니다. HTTP/0.9는 RFC로서 공개된 HTTP/1.0이전의 것을 의미합니다.
 HTTP/1.0  1995년 5월 RFC 1945 발표
 HTTP/1.1 1997년 1월 RFC 2068 초판 발표. 그 후 2회 개정
 HTTP/2  2015년 6월 RFC 7540 발표


HTTP/0.9을 시작으로, 더욱 편리하고, 더욱 빠른 버전을 발표했습니다.

지금은 HTTP/1.1으로 통신을 많이 합니다.

2015년 5월에 RFC가 공개한 HTTP/2는, 이제부터 보편화될 것으로 보입니다.

HTTP/2는, 리퀘스트와 리스폰스의 반복을 효율적으로 하여 웹 페이지 표시 속도를 개선하고 있는 거 같습니다.

각 버전별 상세한 설명은 하지 않도록 하겠습니다.

본 포스팅에서 주로 설명하는 내용은 HTTP/1.1까지의 내용을 다루도록 하겠습니다.

 

리퀘스트와 리스폰스 

위에서 설명했던 웹 페이지를 표시할 때에 어떻게 리퀘스트와 리스폰스가 사용되었는지 살펴보도록 하겠습니다.

위에서 사용한 웹 페이지의 코드입니다.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>나는 고양이</title>
</head>
<body>
<h1>내가 고양이다</h1>
<p>이름을 알려줄께냥</p>
<ul>
    <li><img src="cat1.jpg"></li>
    <li><img src="cat2.jpg"></li>
</ul>
</body>
</html>

 

리퀘스트와 리스폰스의 내용을 확인하기 위해서는 브라우저에서 제공하는 개발 툴 기능을 이용하면 됩니다.

대부분 브라우저에서 F12 키를 누르면 개발 툴이 표시됩니다.

개발 툴은 리퀘스트와 리스폰스의 내용을 알기 쉽게 보여주는 기능입니다.

본 포스팅에서는 리퀘스트와 리스폰스의 내용을 보기 위해 [Fiddler]라는 프리소프트를 사용해서 리퀘스트와 리스폰스 내용을 확인하겠습니다.

PHP는 로컬 환경에서 실행이 되지 않습니다.

로컬 환경에서 실행이 가능하도록 Microsoft에서 제공하는 WebMatrix를 설치했습니다.

클라이언트에서 서버에 리퀘스트 한 내용을 리퀘스트 메세지라고 부릅니다.

반대로 서버에서 클라이언트에 리스폰스 한 내용을 리스폰스 메세지라고 부릅니다.

이 2개를 HTTP 메세지라고 부릅니다.

 

 

 

리퀘스트와 리스폰스

리퀘스트 메세지

리퀘스트 메세지입니다.

GET http://localhost:45612/cat.html HTTP/1.1
Host: localhost:54734
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://localhost:45612/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: kr,en-US;q=0.8,en;q=0.6,ru;q=0.4,zh-CN;q=0.2,zh;q=0.2,fr;q=0.2,it;q=0.2,zh-TW;q=0.2,pt;q=0.2

내용만 보면 어렵게 느낄 수도 있지만, 전부 외울 필요는 없습니다.

리퀘스트 메세지는 크게 3개로 나눌 수 있습니다.

리퀘스트 라인

헤더

메세지 바디

 

각각 어떠한 내용이 작성되어 있는지 살펴보겠습니다.

리퀘스트 라인

GET http://localhost:45612/cat.html HTTP/1.1

 

첫 번째 줄은 리퀘스트 라인입니다.

GET이라고 적혀있지만, 이것은 HTTP의 함수입니다.

함수란 간단하게 설명하면 기능이라고 생각하면 됩니다.

GET 함수는 클라이언트가 서버 측에 파일을 요구(GET) 하는 기능(함수)입니다.

HTML 파일이나 사진 파일을 요구할 때 자주 사용됩니다.

첫 번째 줄에는 사용한 함수 외에도 표시하고 싶은 페이지의 URL과 HTTP의 버전이 기술되어 있습니다.

첫 번째 줄을 해석하면 

“HTTP/1.1 버전을 사용해서 http://localhost:45612/cat.html에 있는 파일을 요구”

라는 의미로 볼 수 있습니다.

 

헤더

다음은 헤더 부분입니다. 

Host: localhost:54734
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://localhost:45612/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: kr,en-US;q=0.8,en;q=0.6,ru;q=0.4,zh-CN;q=0.2,zh;q=0.2,fr;q=0.2,it;q=0.2,zh-TW;q=0.2,pt;q=0.2

두 번째 줄부터 헤더 부분입니다.

위의 리퀘스트 메세지의 경우는 두 번째 줄부터 마지막까지 헤더 부분이 됩니다.

여기에는 이용 가능한 언어나 사용하고 있는 브라우저의 정보 등이 담겨있습니다.

헤더에는 리퀘스트 할 때 필요한 정보들이 작성되어 있다고 기억해 두는 정도면 괜찮습니다.

 

메세지 바디

위 샘플에서는 리퀘스트 메세지에 메세지 바디는 없습니다.

메세지 바디가 있는 경우는 헤더 아래에 작성됩니다.

위 샘플에서는 GET 함수를 사용했기 때문에 메세지 바디는 없습니다.

POST 함수를 사용할 경우 메세지 바디에 내용이 담겨 있는 경우가 있습니다.

예를 들어 메일 주소나 패스워드등 사용자가 입력한 내용을 서버 측에 전송해야 하는 경우가 있습니다.

GET 함수로도 POST 함수로도 입력한 내용을 서버에 전송하는 것은 가능하지만, 전송 방법이 다릅니다.

GET 함수의 경우는 첫 번째 줄의 리퀘스트 라인에 작성된 내용이 서버 측에 전송됩니다.

반면, POST 함수는 메세지 바디에 작성된 내용을 서버에 전송합니다.

위 샘플에서는 GET 함수를 사용했기 때문에 메세지 바디가 만들어지지 않았다고 볼 수 있습니다.

 

 

리스폰스 메세지

샘플 페이지를 표시할 때 사용된 리스폰스 메세지입니다.

HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Sun, 2 Dec 2018 18:19:56 GMT
Accept-Ranges: bytes
ETag: "015dc757c3d11:0"
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcaGFrb3pha2lcRG9jdW1lbnRzXE15IFdlYiBTaXRlc1xuZWtvXG5la28uaHRtbA==?=
X-Powered-By: ASP.NET
Date: Sun, 2 Dec 2018 18:21:32 GMT
Transfer-Encoding: chunked

  <!DOCTYPE html>
  <html>>
  <head>>
  <meta charset="utf-8">
  <title>나는 고양이</title>
  </head>
  <body>
  <h1>내가 고양이다</h1>
  <p>이름을 알려줄께냥</p>
  <ul>
      <li><img src="cat1.jpg"></li>
      <li><img src="cat2.jpg"></li>
  </ul>
  </body>
  </html>

 

리스폰스 메세지도 크게 3곳으로 나눌 수 있습니다.

스테이터스 라인

헤더

메세지 바디

 

스테이터스 라인

HTTP/1.1 200 OK

 

첫 번째 줄이 스테이터스 라인입니다.

스테이터스란 상태를 의미합니다.

클라이언트의 요구에 대해 서버 측은 파일이 존재하는지 존재 안 하는지, 에러가 발생했는지 등의 상태를 알려줍니다.

이 상태에 대해서도 번호가 정해져있습니다.

이 번호를 스테이터스 코드라도 부릅니다.

OK는 결과 프레즈라고 불립니다.

스테이터스 코드 번호만으로 판단하기가 어렵기 때문에 결과 프레즈를 보는 것으로 상태를 쉽게 알 수 있습니다.

위 샘플에서는 200이라는 스테이터스 코드가 담겨있습니다.

결과 프레즈도 OK이기 때문에 어떠한 상태인지 알 수 있습니다.

“리퀘스트를 성공했기 때문에 요구에 대한 정보를 리스폰스 합니다”

라는 의미로 볼 수 있습니다.

웹 페이지가 문제없이 표시되면, 반환값으로 스페이스 코드 200이 돌아오는 경우가 많습니다.

참고로 스테이터스 코드는 100번대, 200번대, 300번대, 400번대, 500번대로 나누어져 있어, 몇 번대의 스테이터스 코드인가를 보고 어떠한 상태인가를 파악할 수 있습니다.

 

스테이터스 코드내용설명
 1XX Informational 정보 리퀘스트는 접수. 처리를 계속.
 2XX Success 성공 리퀘스트를 접수, 처리됨.
 3XX Redirection 리다이렉션 리퀘스트를 완료하기 위해 추가적인 처리가 필요.
 4XX Client Error 클라이언트 에러 클라이언트 리퀘스트에 문제가 있음.
 5XX Server Error 서버 에러 서버 측에서 리퀘스트 처리 실패

 

일반적으로 자주 보는 스테이터스 코드로 404 Not Found 가 있습니다.

이것은 페이지가 없어졌거나, 이동했거나, 요구한 페이지가 존재하지 않을 경우에 반환되는 스테이터스 코드입니다.

이외에도 여러 스테이터스 코드가 존재합니다.

 

헤더

Content-Type: text/html
Last-Modified: Sun, 2 Dec 2018 18:19:56 GMT
Accept-Ranges: bytes
ETag: "015dc757c3d11:0"
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcaGFrb3pha2lcRG9jdW1lbnRzXE15IFdlYiBTaXRlc1xuZWtvXG5la28uaHRtbA==?=
X-Powered-By: ASP.NET
Date: Sun, 2 Dec 2018 18:21:32 GMT
Transfer-Encoding: chunked

 

두 번째 줄부터 헤더 부분에 해당됩니다.

여기에는 이용 가능한 언어나 사용하고 있는 브라우저 정보들이 담겨있습니다.

헤더에는 리퀘스트 할 때 필요한 정보가 담겨있다고 보면 됩니다.

 

메세지 바디

 <!DOCTYPE html>
  <html>>
  <head>>
  <meta charset="utf-8">
  <title>나는 고양이</title>
  </head>
  <body>
  <h1>내가 고양이다</h1>
  <p>이름을 알려줄께냥</p>
  <ul>
      <li><img src="cat1.jpg"></li>
      <li><img src="cat2.jpg"></li>
  </ul>
  </body>
  </html>

 

헤더 아랫부분이 메세지 바디입니다.

메세지 바디에 담겨있는 내용이 클라이언트에 표시됩니다.

이것으로 리퀘스트 메세지와 리스폰스 메세지를 살펴보았습니다.

다음에는 HTTP 함수에 대해 살펴보도록 하겠습니다.

댓글