HTTP(Hypertext Transfer Protocol)
- 인터넷에서 웹 서버와 사용자의 인터넷 브라우저 사이에 하이퍼텍스트(hypertext) 문서를 교환하기 위하여 사용되는 통신규약이다.
- 하이퍼텍스트 : 문서 중간중간에 특정 키워드를 두고 문자나 그림을 상호 유기적으로 결합하여 연결시킴으로써, 서로 다른 문서라 할지라도 하나의 문서인 것처럼 보이면서 참조하기 쉽도록 하는 방식을 의미한다.
- 웹 브라우저는 사용자가 요청하는 자원을 가리키는 URL 주소에 사용할 응용 프로토콜을 표현할 수 있다.
(HTTP 서버로부터 웹 정보를 얻으려면 http://www.xxx.com과 같이 URL 주소에 HTTP를 사용한다고 명시, FTP 서버에 접근하려면 ftp://www.xxx.com로, 텔넷(Telnet) 서버를 사용하려면 telnet://www.xxx.com로 표현한다.)
[HTTP 특징]
1. 메세지 기반으로 동작한다.
2. TCP 기반 프로토콜이다.
- HTTP 패킷 송/수신 전에 TCP 3way handshake가 선행된다.
3. Stateless방식이다.
- TCP위에서 동작하지만 Stateless방식을 지향한다.
- HTTP가 요청하고 응답하면 연결을 끊어버린다. 따라서 TCP 3way handshake부터 다시 시작해야 하기 때문에 속도가 느려진다.
- 따라서 서버에서 응답을 할 때 Cookie값(사용자 정보를 기억하기 위해 만든 인위적인 값)을 만들어서 클라이언트에게 전달하고 클라이언트가 서버에게 Cookie값을 넘겨줌으로써 세션을 유지한다.
[HTTP 패킷 분석 1]
-> 클라이언트 : Windows XP - IP : 10.10.10.10 -> 서버 : Windows 2000 Server - IP : 10.10.10.20 |
- 아래는 Windows XP에서 웹 서버인 Windows 2000 Server로 접속했을 때의 모습을 wireshark로 캡처한 것이다.
- HTTP 통신이 이루어지기 전에 TCP 3way-handshake과정이 먼저 선행된다.
- Client에서 Server로 GET요청을 한다.(Request)
- 참고로 Header와 Body는 개행문자(\r\n)으로 구분된다.
* Header - GET / HTTP/1.1 : 요청방식/ 도메인명 /HTTP의 버전 (도메인명 : 서버의 도메인이 들어오는 위치, 요청하고자하는 실제 서버의 경로. HOST필드에 나타나 있음) - Accept : 지원하고 있는 데이터 타입(* : 모든 문서 처리 가능) - Accept-Language : 지원하는 언어 - Accept-Encoding : 지원하는 인코딩(데이터를 원하는 형식으로 변환) - User-Agent : 지원하고 있는 클라이언트의 웹브라우저 - Host : 요청한 도메인 (서버는 도메인이 없기 때문에 여기서는 ip주소로 나옴) - Connection : 연결이 되는 상태 (여기서는 연결이 되어있는 상태) - Cookie : 최초로 요청했기 때문에 여기서는 Cookie값이 존재하지 않음(할당받은 것이 없어서) |
* Body - 여기서는 body가 존재하지 않는다. |
- 다시 새로고침을 하고 패킷을 살펴보면 Cookie값이 생겼다.
- 이번에는 Server가 응답한 Response패킷을 살펴본다.
* Header - HTTP/1.1 : HTTP의 버전/상태코드 - Server : 서버의 버전 (정보 수집 단계에서 중요) - Data : 시간 (GMT : 세계 표준시) - Content-Length : 메시지 바디의 길이 - Content-Type : 메시지 바디의 타입 - Cache-control : 캐시의 사용여부 |
* body - 위와 같이 body가 존재한다. |
- 이후에 Client에서 Server로 HTML 구성요소 요청을 하고,
- Server는 이에 대한 HTML 정보를 Client에게 전송한다.
[HTTP 패킷 분석 2]
- 다음은 301응답이 왓을 때의 상황을 캡처한 것이다.
(6)-> 사용자가 페이지를 요청한다.
(7)-> 301 응답을 한다
- 요청한 페이지가 영구적으로 변경됐으므로 변경된 위치를 알려준다(Location)
(8)-> 301 응답에 대한 응답을 한다.
(9, 10)-> DNS질의를 한다.
(11~14)-> 다시 3way handshake 후 웹 페이지를 요청한다.