블로그 이전했습니다. https://jeongzero.oopy.io/
HTTP 메시지 포맷
본문 바로가기
컴퓨터 관련 과목/Network

HTTP 메시지 포맷

728x90

전에 검색창에 www.naver.com을 치면 사용자의 눈에는 네이버 화면이 딱!!! 등장하는 것처럼 단순하게 보이지만 그안에 수많은 과정이 들어있고 그 과정 중 하나가 HTTP 요청 및 응답으로 이루어진다고 설명했었다. 오늘은 이러한 요청 및 응답의 과정이 어떠한 메시지 형식으로 보내지는 가를 자세히 알아보는 시간을 갖도록 하겠다리우스.


우선 설명을 하기 전에 눈으로 보는게 가장 빠르다.




난 메인 홈페이지가 구글이기 때문에 크롬을 키면 딱 구글홈페이지가 보인다. 


        마우스 오른쪽을 클릭한후 검사를 클릭하여 상단에 보면 Network라고 적혀있는 탭을 누르거나


바로 F12를 누르면 저 위 화면이 나온다.


그 다음 주소창에 www.naver.com을 치고 엔터를 누르면




위 화면 같이 막 존나게 쭈르르르르르르르르~ㅡ~~ㅡ~ㅡ~ㅡ 막 뜨는데 좌측 Name 부분을 보면 개 많은 객체들이 보인다. 맨 위 상단에 www.naver.com을 클릭하면 오른쪽처럼 General, Response Headers, Request Headers 의 정보들이 보인다.


자!! 이제 우리가 볼것이 이부분이다. 우리는 단순히 그냥 주소창에 www.naver.com만 쳤지만 저렇게 보이듯이 존나게 많은 객체들이 왔따리 갔다리 한다.

우선 General 및에 Response Headers 이부분은 응답 메시지이고 그 밑에 스크롤로 내려보면 Request Headers 메시지가 있다.


크롬에서 쉽게 위와 같은 방식으로 HTTP 메시지를 확인할 수 있는데 정확한 HTTP 요청 메시지 포맷을 확인하려면 와이어샤크로 확인하는게 제일 좋다.




HTTP 요청 메시지


주소창에 우리학교 홈페이지를 치면 다음과 같은 HTTP 프로토콜의 헤더정보를 확인 할 수있다.

HTTP 요청 메시지의 포맷을 보면


GET / HTTP/1.1\r\n           -> 요청라인

--------------------------------------

Host : kpu.ac.kr \r\n

Connection : keep-alive\r\n

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

Accept-Language : ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7\r\n    -> 헤더라인

---------------------------------------------------------------------------


간단한 요청 메시지만 잘 분석하면 많은 것을 알 수 가 있다. 

첫번째 줄은 요청라인으로 3개의 필드로 이루어져있다. 방식필드, URL 필드, HTTP 버전 필드이다. 내가 캡쳐한 요청 메시지는 GET 방식으로 /(루트주소) 를 요청하고 있고 HTTP 버전은 HTTP/1.1 버전을 구현하고 있다.


헤더라인을 보면 Host 부분은 객체가 존재하는 호스트를 명시하고 있다. 무슨 말이냐면 kpu.ac.kr 서버에 요청하는 것을 뜻한다. 내가 우리학교 페이지를 원하기 때문에 호스트는 우리학교 주소가 된다. 이 부분은 뒤에 말할 웹 프록시 캐시에서 필요로한다.


Connection은 전시간에 설명한 지속연결인지 비지속 연결인지를 뜻한다. keep-alive으로 되어있기 때문에 지속연결 원한다는 뜻이다.

User-Agent는 서버에게 요청을 하는 브라우저 타입을 명시하고 있다. 근데 나는 크롬에서 접속했는데 왜 Mozilla나 AppleWebkit, Safari 이런것들이 붙여있지? 나도 잘 몰라서 검색해보다가 잘 설명되어 있는 블로그가 있어서 그부분은 여기를 참고하길 바란다. http://m.blog.daum.net/l1414/608?categoryId=66


마지막으로 Accept-Languate는 사용자가 객체의 한글, 영어를 원하고 있다는 것을 뜻한다. 그리고 저기 보이는 \r\n 이것은 캐리지리턴이라고 코딩하다보면 알텐데 \r 이게 맨앞으로 커서를 옮기는 것이고 그다음 \n이 한줄 밑으로 가는 것이다. 글을 쓰다가 엔터를 누르면 다음줄 맨처음 부분으로 커서가 가는것을 뜻한다. 


이제 요청 메시지의 일반 포맷을 알아보자. 객체의 몸체부분에는 GET 방식인 경우 비어있고 POST 방식에서 사용된다. POST 방식 같은 경우는 사용자가 검색창에 단어를 입력하고 엔터를 누를때 보통 사용한다. 사용자가 입력한 내용이 개체 몸체에 들어가게 된다.


하지만 반드시 form  형식으로 POST 방식을 사용해야 할 필요는 없다. 대신에 폼은 흔히 GET 방식을 사용하고 URL의 입력 데이터를 전송한다. 예를 들어, 만약 폼에 GET 방식을 사용하고 2개의 필드를 가지며 두 필드의 입력값이 monkeys와 bananas라면 URL은 www.naver.com/search?moneys&bananas 구조를 가지게 될 것이다. 이렇게 확장된 URL을 많이 봤을 것이다.





HTTP 응답 메시지


다음은 HTTP 응답 메시지를 알아보자. (이 응답은 앞서 요청에대한 응답이 아니다)



응답 메시지는 상태라인, 헤더라인, 개체 몸체로 이루어진다. 상태라인은 3개 필드(버전필드, 상태코드, 해당 상태 메시지)를 포함한다. 이 예에서는 HTTP/1.1 버전과 200 ok 상태코드 및 메시지로 이루어진다.


Data는 HTTP 응답이 서버에 의해 생성되고 보낸 날짜와 시간을 나타낸다

Connection 은 요청메시지와 마찬가지로 keep-alive이기 때문에 지속연결을 뜻한다. 

Last-Modified는 객체가 생성되거나 마지막으로 수정된 시간과 날짜를 나타낸다. 이 헤더부분은 객체를 로컬 클라이언트와 네트워크 캐시 서버 캐싱에 매우 중요하다.

Content-Length는 송신되는 객체의 바이트 수를 나타낸다.

Content-Type은 객체 몸체 내부의 객체가 자바스크립트인 것을 나타낸다.


응답 메시지의 일반 포맷은 요청 메시지와 동일하므로 생략하고 마지막으로 상태 코드와 연관 문장은 다음과 같다.


1. 200 ok : 요청이 성공되었고, 정보가 응답으로 보내졌다.

2. 301 Moved Permanently : 요청 객체가 영원히 이동되었다.

3. 400 Bad Request : 서버가 요청을 이해할 수 없다는 일반 오류 코드이다.

4. 404 Not Found : 요청 문서가 서버에 존재하지 않는다.

5. 505 HTTP Version Not Supported : 요청 HTTP 프로토콜 버전을 서버가 지원하지 않는다.




728x90

'컴퓨터 관련 과목 > Network' 카테고리의 다른 글

DNS란?  (1) 2019.01.05
쿠키란?(먹는거 아님)  (0) 2019.01.03
HTTP 비지속 연결과 지속 연결  (3) 2019.01.02
HTTP 개요  (0) 2019.01.02
프로토콜 계층과 서비스 모델  (0) 2019.01.01