HTTP (Hypertext Transfer Protocol) Chapter 10: HTTP (Hypertext Transfer Protocol) 2003. 6.
HTTP 기능 WWW(World Wide Web) 상의 데이터 접근 시 사용되는 프로토콜 (TCP 80번 포트 사용) 하나의 페이지에서 다른 페이지로 이동하는 하이퍼텍스트 환경에서 효과적으로 이용됨 HTML, audio, video, … 웹 서버 웹 클라이언트 (browser) 하이퍼 텍스트 링크 TCP 포트 80
HTTP 메시지 구조 요청 메시지 : 정보, 자료 요청 응답 메시지 : 요청에 대한 응답 요청 라인, 헤더, 공백 라인, 본문으로 구성 응답 메시지 : 요청에 대한 응답 상태라인, 헤더, 공백라인, 본문으로 구성 요청 라인 헤더 (일반헤더 | 요청헤더 | 엔터티헤더) 공백 라인 엔터티 본문 (요청 메시지) 상태 라인 (일반헤더 | 응답헤더 | 엔터티헤더) (응답 메시지) HTTP 요청 메시지 HTTP 응답 메시지
요청 라인(Request Line) 메소드 : 서비스 수행 기능 명시 URL : 웹페이지 위치 정보 HTTP 버전 : HTTP 프로토콜 버전 정보 (현재 v1.1) <major>.<minor> Protocol ID PW Domain Port Directory File http:// shseo : xxx @ www.yahoo.com 8080 /temp /index.htm ftp:// ftp.yahoo.com 3000 / 메소드 (요청 타입) SP URL HTTP 버전 CR LF 프로토콜 :// 호스트 주소 : 포트 번호 / 경로
상태 라인 (Status Line) HTTP 버전 : 응답 메시지에서 사용하는 HTTP 버전 상태 코드 : 요청 수락 및 수행 시도의 결과를 나타내는 3자리의 십진수 코드 상태 설명 : 사용자를 위한 상태 코드의 설명 HTTP 버전 SP 상태 코드 상태 설명
상태 코드 상태코드의 첫번째 십진수 의미 승인된 상태코드 의미 1XX : 정보 2XX : 성공, 3XX :재전송 요구 200 OK 302 Found 404 Not Found 201 Created 304 Not Modified 500 Internal Server Error 202 Accepted 400 Bad Request 501 Not Implemented 204 No Content 401 Unauthorized 502 Bad GateWay 301 Moved Permanently 403 Forbidden 503 Service Unavailable
헤더 (Header) HTTP 송수신 메시지에서 모두 사용 클라이언트와 서버간의 추가적인 정보 교환 헤더 종류 일반 헤더 (General Header) 요청 헤더 (Request Header) 응답 헤더 (Response Header) 엔터티 헤더(Entity Header) 헤더 명 : SP 헤더 값 CR LF
헤더 (Header) 일반 헤더 요청 헤더 메시지에 대한 일반적인 정보 전달 Cache-Control, Connection, Date, Pragma, Transfer-Encoding, Upgrade, Via 요청 헤더 요청에 대한 추가 정보 및 클라이언트에 대한 정보 전달 요청 메시지에서만 이용 Accept, Accept-Charset, Accept-Encoding, Accept-Language, Authorization, From, Host, If-Modified-Since, If-Match, If-None-Match, If-Unmodified-Since, Max-Forwards, Proxy-Authorization, Range, Referer, Use-Agent
헤더 (Header) 응답 헤더 엔터티 헤더 서버의 구성과 응답에 대한 추가적인 정보 전달 응답 메시지에서만 이용 Age, Location, Proxy-Authenticate, Public, Retry-After, Server, Warning, WWW-Authenticate, Accept-Ranges 엔터티 헤더 문서의 본문에 대한 정보 전달 Allow, Content-Base, Content-Encoding, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Type, ETag, Expires, Last-Modified
메소드 (Method) GET HEAD POST URL에 지정된 정보 획득 일반적인 웹 서핑 시 주로 이용 본문은 제외하고 헤더만을 전달 받음 기타 사항은 GET 메소드와 같음 POST 클라이언트에서 서버로 정보를 전달 게시판, 카운터, 뉴스그룹, 메일링 리스트 등으로 메시지 전달 (CGI 프로그램에서 주로 사용)
DOS를 이용한 HTTP 동작 실험 아래 명령을 MS-DOS에서 입력 C:\>telnet www.aide.co.kr 80<엔터> GET /<엔터> HTTP v0.9 C:\>telnet www.aide.co.kr 80<엔터> GET / HTTP/1.0<엔터> <엔터> HTTP v1.0 C:\>telnet www.aide.co.kr 80<엔터> GET / HTTP/1.1<엔터> Host: www.aide.co.kr<엔터> <엔터> HTTP v1.1
HTTP 요청 메시지 분석(GET) HTTP 요청 메시지 (www.yahoo.co.kr)
HTTP 요청 메시지 분석(GET) 요청 라인 헤더 라인 Get 메소드 이용 HTTP 버전 1.1 사용 요청 헤더 : Accept, Accept-Language, Accept-Encoding, User-Agent, Host, 일반 헤더 : Connection 메소드 스페이스 URL HTTP 버전 라인의 끝 GET SP / (현재 디렉토리) HTTP/1.1 CR LF 47 45 54 20 2F 48 54 54 50 2F 31 2E 31 0D 0A
HTTP 응답 메시지 분석 HTTP 응답 메시지 (www.yahoo.co.kr)
HTTP 응답 메시지 분석 상태 라인 헤더 라인 HTTP 버전 1.1 이용 302 Found : 요청한 자원이 일시적으로 다른 URL로 옮김 헤더 라인 일반 헤더 : Date, Connection, Transfer-Encoding, Content-Type 응답 헤더 : Location 상태 라인 48 54 54 50 2F 31 2E 31 46 6F 75 6E 64 20 0D 0A 33 30 32 F o u n d H t t p / 1 . 1 SP CR LF 3 0 2
연습 문제 HTTP 메시지의 종류 헤더의 종류 본문 내용 송신/ 수신 구별 GET, HEAD, POST 47 45 54 20 2F 69 6E 64 65 78 2E 68 74 6D 6C 20 48 54 54 50 2F 31 2E 31 OD OA 41 63 63 65 70 74 3A 20 2A 2F 2A OD OA 48 6F 73 74 3A 20 77 77 77 2E 6A 6F 69 6E 73 2E 63 6F 6D OD OA OD OA (요청 라인? 상태 라인?) 헤더 (일반헤더? 요청/응답헤더? 엔터티헤더?) 본문 (유? 무?) 공백 라인? HTTP 메시지의 종류 송신/ 수신 구별 GET, HEAD, POST 헤더의 종류 일반 헤더, 요청 헤더, 응답 헤더, 엔터티 헤더 본문 내용 본문 유무 및 내용
아래 패킷을 분석하시오 08 00 46 18 BD C8 00 08 E2 44 76 3C 08 00 45 00 01 32 81 F8 40 00 31 06 EC A1 D3 20 77 97 D2 62 BD 11 00 50 0B 5E 1A 36 BE 0B 4D EA FF 00 50 18 44 70 31 FE 00 00 48 54 54 50 2F 31 2E 31 20 33 30 32 20 46 6F 75 6E 64 0D 0A 44 61 74 65 3A 20 4D 6F 6E 2C 20 30 39 20 4A 75 6E 20 32 30 30 33 20 30 35 3A 35 32 3A 33 32 20 47 4D 54 0D 0A 4C 6F 63 61 74 69 6F 6E 3A 20 68 74 74 70 3A 2F 2F 6B 72 2E 79 61 68 6F 6F 2E 63 6F 6D 2F 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 63 6C 6F 73 65 0D 0A 54 72 61 6E 73 66 65 72 2D 45 6E 63 6F 64 69 6E 67 3A 20 63 68 75 6E 6B 65 64 0D 0A 43 6F 6E 74 65 6E 74 2D 54 79 70 65 3A 20 74 65 78 74 2F 68 74 6D 6C 3B 20 63 68 61 72 73 65 74 3D 69 73 6F 2D 38 38 35 39 2D 31 0D 0A 0D 0A … 사용된 프로토콜 개수: 근원지 MAC 주소: 근원지 IP 주소: 근원지 Port 번호: 사용된 프로토콜 이름: 목적지 MAC 주소: 목적지 IP 주소: 목적지 Port 번호:
Guru를 이용한 HTTP 패킷 분석
HTTP 패킷 캡처 프로그램 작성
새 프로젝트 생성 및 환경설정 다이얼로그 기반의 프로젝트 생성 Include 경로 및 라이브러리 경로 설정 Include files : C:\AMAN2002\include Library files : C:\AMAN2002\lib Tools->Options 메뉴 이용 Ncap 라이브러리(Ncapd.lib)를 프로젝트에 포함 Project->Settings 메뉴 이용
대화상자 디자인 HttpViewer 메인 대화상자 디자인 List Control Edit Box Edit Box 7 8 1 List Control 2 Edit Box 3 Edit Box 4 5 6 Edit Box Edit Box Button
Control 속성 # 종류 ID 속성 변수 1 List Control IDC_LIST View: Report CListCtrl m_LIST_PacketInfo 2 Edit Box IDC_EDIT_AsciiResult Read-Only CString m_EDIT_strAsciiResult 3 IDC_EDIT_HexaResult CString m_EDIT_strHexaResult 4 EditBox IDC_EDIT_Monitoring int m_EDIT_iCountInput 5 IDC_EDIT_Monitored int m_EDIT_iCountOutput 6 Button IDC_BUTTON_StartCapture 7 IDC_BUTTON_About 8 IDCANCEL Default Button
이벤트 처리 # 종류 ID 메시지 함수명 1 List Control IDC_LIST NM_CLICK OnClickList() 6 Button IDC_BUTTON_StartCapture BN_CLICKED OnBUTTONStartCapture() 7 IDC_BUTTON_About OnBUTTONAbout() 8 IDCANCEL OnCancel()
어댑터 선택 및 어댑터 열기 void CEtherViewerDlg::OnBUTTONSelectAdaptor() { //Ncap lib.(Dialog based class lib.) 객체 생성. CSelectAdaptorDlg *pDlg = new CSelectAdaptorDlg; if(pDlg->DoModal() != IDOK) delete pDlg; return; } //선택된 네트워크 어뎁터를 사용할 수 있도록 초기화. TCP 기반의 패킷만 획득 if(pDlg->OpenAdaptor(2)) …
패킷 캡처 #define MaxBufferLen 2048 // 획득한 패킷을 저장하기 위한 버퍼 #define EtherHeaderLength 14 // 이더넷 헤더 길이를 14로 할당 UpdateData(TRUE); … int i = 0; unsigned char arrTemp[MaxBufferLen]; While(i < m_EDIT_iCountInput) { memset(arrTemp, 0, MaxBufferLen); //패킷을 하나 획득함. 음수가 return되면 에러가 발생한 것. if(pDlg->Ncap(arrTemp, MaxBufferLen) < 0) continue; //패킷 분석 }
패킷 분석 // 시작 지점 주소를 t_EtherHeader 구조체 주소로 대입 t_EtherHeader *tEtherHeader = (t_EtherHeader *)arrTemp; // 이더넷 데이터의 시작 지점을 t_IPHeader 구조체로 전달 t_IPHeader *tIPHeader = (t_IPHeader *) tEtherHeader->eth_data; // IP 헤더 길이 정보 획득 int iIpHeaderLength = tIPHeader->ip_hl << 2; int iIpOptionHeader = (iIpHeaderLength - 20); t_TCPHeader *tTcpHeader = (t_TCPHeader *) tIPHeader->ip_data + iIpOptionHeader; // 근원지 포트 번호 unsigned short iSourcePort = htons(tTcpHeader->tcp_sport); // 목적지 포트 번호 unsigned short iDestinationPort = htons(tTcpHeader->tcp_dport); // HTTP 패킷 구별 (슬라이드 25)
HTTP 패킷 구별 // TCP 헤더의 포트 필드 값이 80인 것만 골라냄. if(iSourcePort == 80 || iDestinationPort == 80) { // 일련번호 CString strNum = _T(""); strNum.Format(_T("%d"), i); m_LIST_PacketInfo.InsertItem(LVIF_TEXT, i, strNum, 0, 0, 0, 0 ); // 근원지 포트 CString strHttpSrcPort = _T(""); strHttpSrcPort.Format("%d", iSourcePort); m_LIST_PacketInfo.SetItem(i, 1, LVIF_TEXT, strHttpSrcPort, 0, 0, 0, 0); // 목적지 포트 CString strHttpDesPort = _T(""); strHttpDesPort.Format("%d", iDestinationPort); m_LIST_PacketInfo.SetItem(i, 2, LVIF_TEXT, strHttpDesPort, 0, 0, 0, 0); // TCP 헤더 길이 정보 획득 int iTcpHeaderLength = (htons(tTcpHeader->tcp_off) & 0xF000) >> 10; // HTTP 메시지 출력 (슬라이드 26번) … }
HTTP 메시지 출력 // TCP 헤더 길이 정보 획득 int iTcpHeaderLength = (htons(tTcpHeader->tcp_off) & 0xF000) >> 10; // 메시지 CString strHttpMessage = _T(""); CString strTemp = _T(""); // HTTP 메시지의 시작 지점 int iHttpDataStart = EtherHeaderLength + iIpHeaderLength + iTcpHeaderLength; // HTTP 메시지를 ASCII와 HEXA 형태로 변환 후 출력. for(int j=iHttpDataStart; j< iLengthOfPacket; j++) { strTemp.Format(_T("%c"), arrTemp[j]); m_strDataBuffer[i] +=strTemp; strTemp.Format(_T("%02X "), arrTemp[j]); strHttpMessage += strTemp; } m_LIST_PacketInfo.SetItem(i, 3, LVIF_TEXT, strHttpMessage, 0, 0, 0, 0);
HTTP 실행 모습
HttpViewer를 이용한 HTTP 패킷 분석
HttpViewer를 이용한 HTTP 패킷 분석 근원지 포트 : 1041 목적지 포트 : 80 메시지 종류 : 요청 메시지 Get 메소드 사용 HTTP 버전 1.1 사용 헤더 : Accept, Accept-Language, Accept-Encoding, User-Agent, Host, Connection, Cookie Accept : */* (모든 종류의 파일 수락) Accept-Language : ko (한국어) Host : www.joins.com 목적지로 접근 각 라인의 끝은 ‘OD OA’ 문자로 종료
참고 문헌 서승호 외, AMAN2002를 이용한 TCP/IP 프로토콜 분석 및 네트워크 프로그래밍, 정익사, 2002. RFC 1945, T.Berners-Lee(MIT/LSC), R. Fielding(UC Irvine), H. Frystyk(MIT/LCS), Hypertext Transfer Protocol -- HTTP/1.0, May 1996. RFC 2068, R. Fielding(UC Irvine), J. Gettys, J. Mogul(DEC), H. Frystyk, T. Berners-Lee(MIT/LCS), Hypertext Transfer Protocol -- HTTP/1.1, January 1997. RFC 2616, R. Fielding(UC Irvine), J. Gettys, J. Mogul(DEC), H. Frystyk, T. Berners-Lee(W3C/MIT), Hypertext Transfer Protocol -- HTTP/1.1, January 1999. RFC 2660, E. Rescorla(RTFM, Inc.), A. Schiffman(Terisa Systems, Inc.), The Secure HyperText Transfer Protocol, August 1999.