HTTP
- 웹 브라우저와 웹 서버 사이의 데이터 통신 규칙
HTTP 모니터링
웹 브라우저와 웹 서버 사이에 주고받는 데이터를 들여다보려면 HTTP 프록시 프로그램이 필요함.
웹 브라우저 <-> HTTP 프록시 <-> 웹서버
프록시 서버는 클라이언트와 서버 사이에서 통신을 중계해 주는 컴퓨터나 프로그램.
- 빠른 전송을 위하여 서버의 응답 결과를 캐시에 저장
- 데이터를 검사하여 특정 단어 포함된 자료 송,수신 차단 (보안)
HTTP Request-Line [메서드, 요청 URI, HTTP 버전]
- 메서드 : GET POST HEAD PUT DELETE …
- 요청 URI : 요청하는 자원의 식별자. 즉 HTML이 있는 가상의 경로
- HTTP 버전 : 1.0, 1,1, 2.0 ..
HTTP Request-Header [헤더이름/헤더 값]
헤더 일반헤더 요청헤더 또는 응답헤더 엔티티 헤더
요청헤더 중 User-Agent는 클라이언트의 정보를 서버에게 알려주어 요청자의 OS와 브라우저를 구분할 수 있음.
공백 라인과 요청 데이터(message-body)
- GET 요청은 공백라인으로 끝나고, POST 요청은 공백 라인 다음에 서버에 보낼 데이터(message-body)가 옴.
상태 라인(Status-Line)
[HTTP버 전/상태코드/상태설명] ex) HTTP1/1200_OK
상태코드
- 200 : 요청이 성공적으로 처리되었다.
- 301 요청한 자원이 이동되었다. 헤더 정보에 이동 위치를 알려줄테니 다시 요청하라.
- 304 : 클라이언트가 임시 보관한 응답결과와 다르지 않다.
- 400 : 잘못된 요청이다.
- 404 : 요청한 자원을 못 찾았다.
- 500 서버 내부에서 오류가 발생하였다.
응답 헤더
- Content-Type 헤더는 서버가 웹브라우저에게 보내는 데이터의 형식
- Content-Length는 웹 브라우저에게 보내는 데이터(message-body)의 크기(Byte)이다.
공백라인과 응답 데이터(message-body)
- 15번 라인은 메시지 헤더와 응답 데이터를 구부하기 위한 공백 라인.
- 16번 라인부터 응답데이터.
주요 프로토콜
- FTP : 클라이언트와 서버 간에 파일을 주고받기 위해 만든 통신 규약.
- Telnet 프로토콜 : 인터넷이나 LAN 상에서 문자 기반으로 원격의 컴퓨터를 제어하기 위해 만든 통신 규약. 요즘은 보안때문에 SSH 많이 사용.
- XMPP: 인스턴트 메시지 및 접속 상태정보를 교환할 목적으로 만든 규약. ex) Google Talk
- SMTP : 인터넷 상에서 메일을 보내기 위한 통신 규약. POP3는 이메일을 가져오는데 사용. 이메일을 가져온 후 서버의 메일 삭제.
- IMAP : POP3와 달리 이메일을 가져온 뒤에 서버의 메일을 지우지 않으며, 여러 대의 장비에서 이메일을 조회하는데 적합.
- LDAP : 디렉터리 서비스에 등록된 자원들을 찾는 통신 규약
- IRC : 실시간 채팅을 위해 만든 통신 규약.
GET 특징
- URL에 데이터를 포함 (데이터 조회에 적합)
- 바이너리 및 대용량 데이터 전송 불가
- 요청라인과 헤드 필드의 최대크기
GET 요청 방법
- 웹브라우저 주소창에 URL을 입력하는 경우
- 링크를 클릭하는 경우
- 입력 폼의 method 속성값이 get인 경우
GET 요청 데이터 전달 형식
- 서버에 보낼 데이터를 URI에 붙임.
- “?” 문자는 서비스 주소와 데이터를 구별하는 구분자,
- “&” 문자는 데이터들을 구별하는 구분자.
- “=“ 문자는 매개변수 이름과 값을 구별하는 구분자.
GET 요청의 쓰임새
- 자료를 검색한다거나, 게시글의 상세 정보를 본다거나, 특정 상품의 정보를 조회하는 것과 같이 데이터를 조회하는 경우에 적합.
GET 문제점과 개선방안
- 보안에 좋지 않다.
- 바이너리 데이터를 전송할 수 없다. (URI나 헤더 정보가 너무 크면 웹 서버에서 처리 불가)
POST 특징
- URL에 데이터가 포함되지 않음 –> 외부 노출 방지
- 메시지 본문에 데이터 포함 –> 실행 결과 공유 불가
- 바이너리 및 대용량 데이터 전송 가능
문제점과 개선 방안
- GET과 마찬가지로 데이터를 전달할 때 ‘이름=값&이름=값’ 형태로 전송.
- 이미지나 동영상과 같은 바이너리 데이터를 보낼 때 문제가 발생할 수 있음.
- 멀티파트 전송방식의 Content-Type 헤더를 사용하면 됨. (Content-Type : multipart/form-data; boundary=—Web … Pyz)