HTTP

42_Cursus·2022년 6월 15일
0

HTTP

목록 보기
1/1

HTTP

  • 웹브라우저, 서버, 웹 어플리케이션은 모두 HTTP를 통해서 서로 대화한다.
  • HTTP는 현대 인터넷의 공용어이다.
  • HTTP는 신뢰성을 보장한다. 따라서 데이터의 전송 중에 손상되거나 꼬이지 않음을 보장한다.
  • 웹서버는 HTTP프로토콜로 의사소통을 하기때문에, 보통 HTTP 서버 라고 불린다.

웹 리소스

  • 웹서버는 웹 리소스를 관리하고 제공한다.
  • 웹 서버를 통해서 클라이언트가 요청하고 받을수있는
    모든 파일, 그림, 게이트웨이등을 뜻한다.

MIME

Mulitipurpose Internet Mail Extensions
  • 인터넷은 수천가지의 데이터타입을 다루기때문에, HTTP는 웹에서 전송되는 객체 각각에 MIME타입이라는 데이터 포맷 라벨을 붙인다.
  • 웹서버는 모든 HTTP객체 데이터에 MIME 타입을 붙인다.
    웹브라우저는 서버로부터 객체를 돌려받을때, 다룰수있는 객체인지 MIME 타입을 통해서 확인한다.
Content-type: image/jpeg	// MIME
Content-length: 12984
  • MIME 타입은 "/"으로 구분된 주타입(primary object type)과
    부타입 (specific subtype)으로 이루어진 문자열 라벨이다.
    - HTML로 이루어진 텍스트문서 : text/html
    - plain ASCII 텍스트 문서 : text/plain
    - JPEG 이미지 : image/jpeg
    - GIF 이미지 : image/gif

URI

Uniform Resource Identifier
  • 웹서버 리소스는 각자 이름을 가지고있다. 따라서 클라이언트는 관심있는 리소스를 지목할수있다.
  • URI는 URL과 URN으로 나뉜다.
    • URL (uniform resource locator) : 통합자원 지시자, URL은 특정서버의 한 리소스에 대한 구체적인 위치를 지정함
    • URN (uniform resouce name) : URN은 콘텐츠를 이루는 한 리소스에 대해, 그 리소르의 위치에 영향 받지않는 이름 역활을 한다.
  • 아래의 URI에서, 클라이언트는 HTTP프로토콜을 이용하여,
    www.test.com으로 이동한후, 그 서버의 test_dir안에있는
    test.html이라는 객체를 요청한다.
    즉, "URL (URI)는 프로토콜(어떻게), 서버(어디에), 리소스(무엇을)를 명시한다."
http://www.test.com/test_dir/test.html

트랜잭션

  • HTTP 트랜잭션은 요청 명령과 응답 결과로 구성되어있다.
  • 요청 명령 (클라이언트에서 서버로 보냄 : 인바운드)
    HTTP 요청 메세지는 명령과 URI을 포함
GET /test_dir/test.html HTTP/1.0
Host: www.test.com
  • 응답 결과 (서버에서 클라이언트로 보냄 : 아웃바운)
    HTTP 응답 메세지는 트랜잭션의 결과를 포함한다.
HTTP/1.0 200 OK
Content-type: image/gif
Content-length: 12345
  • 한개의 페이지에 한번의 트랜잭션만 존재하지않는다.
    만약, 요청하는 페이지에 이미지, 그래픽, 자바 등등 여러 리소스가
    필요할때에는 페이지의 레이아웃을 담당하는 html을 가져온뒤, 여러번의 트랜잭션을 통해 페이지를 완성한다.
    즉, "웹 페이지"는 "리소스의 모음"이다.

메서드 (트랜잭션의 요청 부분)

  • HTTP는 HTTP메서드라고 불리는 여러 종류의 요청명령을 지원한다. 모든 HTTP 요청메서지는 "한개의 메서드"를 갖는다.
  • 메서드는 서버에게 어떤동작을 실행해야하는지 알려준다.
    - GET : 서버에서 클라이언트로 지정한 리소스를 요청
    - PUT : 서버에 문서를 쓴다. 서버는 클라이언트가 요청한 리소스를 갱신 또는 생성하고 디스크에 저장한다. PUT은 콘텐츠를 변경할수있게 해주기때문에, 많은 웹 서버 PUT을 수행하기전에 사용자에게 로그인을 요구한다.
    - DELETE : 지정한 리소스를 서버에서 삭제해라
    - POST : POST 메서드는 서버에 입력 데이터를 전송하기위해서 설계되었다. 요청메세지에 보낼 데이터를 입력하면, 서버에서 확인후 응답을 보낸다.
    - HEAD : GET처럼 작동하지만, 서버는 응답으로 헤더만을 돌려준다. 그로인하여, 리소스를 가져오지않고도 타입과 같은 정보를 얻을수있다. 또한 응답의 상태코드를 통해서 개체가 존재하는지에 대한 여부를 확인할수있다. 마지막으로 헤더를 확인하며 리소스가 변경되었는지 확인할수있다.

POST와 PUT의 차이

POST는 서버에 데이터를 보내기위해서 사용된다.
반면에, PUT은 서버에있는 리소스에 데이터를 입력하기위해서 사용된다.


상태코드 (트랜잭션의 응답부분)

  • 모든 HTTP 응답 메세지는 상태 코드와 함께 반환된다.
    상태코드는 클라이언트에게 요청이 성공했는지 아니면 추가조치가
    필요한지 알려주는 세 자리의 숫자이다.
    - 200 : 문제없음
    - 302 : 다시 요청을 보내라
    - 404 : 리소스를 찾을수 없다.
  • HTTP 응답 메세지는 숫자 상태코드에 텍스트로된 "사유구절"도 함께 보낸다. 이 구문은 단지 설명을 위한것일뿐, 실제 응답처리에서는 상태코드의 숫자로된 코드만 사용된다.

요청과 응답메세지의 구조

  • HTTP 메세지는 단순한 줄 단위의 문자열로 구성되어있다.
  • HTTP 요청 명령 메세지
GET	/test_dir/test.html HTTP/1.0	//시작줄
Accept: test_dir/*					//혜더
Accept-Language: en, fr				//헤더
  • HTTP 응답 메세지
HTTP/1.0 200 OK						//시작줄
Content-type: text/html				//헤더
Content-lenght:	1234				//헤더

<HTML>
<HEAD><TITLE>hello world</TITLE></HEAD>
/* ... */							//본문

TCP 커넥션

Transmission control Protocol (전송 제어 프로토콜)
  • HTTP 요청과 응답 메세지는 TCP 커넥션을 통해 이동한다.
    HTTP는 애플리케이션 계층의 프로토콜이다. 그러므로, 네트워크 통신의 세부 사항에 대해서는 신경쓰지않는다. 신뢰성을 보장하는것은 TCP/IP (전송/네트워크 계층)이다.
    TCP/IP는 다음 세가지를 보장한다.
    1. 오류없는 데이터 전송
    2. 순서에 맞는 전달
    3. 조각나지않는 데이터 스트림
  • HTTP 클라이언트가 서버에 요청 명령 메세지를 전송하기위해
    클라이언트와 서버사이에 TCP/IP 커넥션을 맺어야한다.
    그러기위해서는 IP주소와 PORT번호가 필요하다.
    이 두가지 정보는 URI에 나와있다.
http://www.test.com:80				// port번호가없다면, 기본값을 80으로 가정.

http://								// scheme (프로토콜)
www.test.com						// DNS를 통해서 IP주소 추출
  • HTTP 요청과 응답의 순서는 다음과같다.
    1. 클라이언트(웹 브라우저)는 서버의 URL에서 호스트명을 추출
    2. 웹브라우저는 호스트명을 IP주소로 변환
    3. URL에서 포트번호를 추출
    4. 클라이언트는 서버와 TCP커넥션을 맺음
    5. 클라이언트는 서버에 HTTP 요청을 보냄
    6. 서버는 클라이언트에서 HTTP 응답을 보냄
    7. 커넥션이 닫히면, 웹브라우저는 문서를 모니터에 출력함

  • TCP커넥션은 네가지 값으로 식별한다.
    <발신지 IP, 발신지 port, 수신지 IP, 수신지 port>
    따라서, 서로다른 두개의 TCP커넥션은 같을수 없다.


Telent / netcat

실습을 위한 도구

telnet [host] [port]

인자로 들어간 host 와 port로 tcp 연결을 한다.

telnet www.google.com 80

// TCP 커넥션이 연결된후에
// 요청을 보낸다.
GET /test.html HTTP/1.1
Host: www.google.com

netcat [host] [port]

telnet와 비슷함.

printf "GET /nc.1 HTTP/1.1\r\nHost: man.openbsd.org\r\n\r\n" | nc man.openbsd.org 80

Webserver

웹서버는 HTTP 및 그와 관련된 TCP처리를 구현한것이다.
  • 웹서버는 클라이언트의 요청에 응답하기위한 리소스를 관리한다.
  • TCP 커넥션 관리에 대한 책임을 운영체제와 나눠갖는다.
    운영체제는 컴퓨터시스템의 하드웨어를 관리하고 TCP/IP 네트워크지원, 웹 리소스를 유지하기위한 파일 시스템, 연산활동을 제어하기위한 프로세스관리를 제공한다.

웹서버 수행 순서

1. 클라이언트 커넥션 수락

클라이언트와 서버사이에 이미 TCP커넥션이 연결되어있다면, 연결되어있는 커넥션을
사용한다. 그것이 아니라면, 커널영역의 네트워크 인터페이스와 TCP/IP 네트워크 스택을 통해 
서버에 대한 새 커넥션을 열어야한다.

2. 서버에서의 TCP 커넥션

클라이언트가 웹 서버에 TCP커넥션을 요청하면, 웹서버는 그 커넥션을 맺고 TCP커넥션에서
IP주소를 추출하여, 클라이언트를 확인한다. 또한 서버는 새 커넥션을
커넥션 목록에 추가하고, 요청메세지를 기다린다.
TCP 커넥션을 조작하는 인터페이스와 자료구조는 운영체제마다 다르다.
유닉스 환경에서 TCP커넥션은 소켓으로 표현되며 클라이언트의 IP주소는 getpeername을 
호출하여 그 소켓으로부터 추출가능하다.

3. 요청처리

웹서버가 요청을 받으면, 서버는 요청으로부터, 메소드, 리소스, 헤더, 분문을
얻어내어 처리한다.
POST를 비롯한 몇몇 메서드는 요청메세지에 엔터티 본문이 있을것을 요구한다.
하지만 GET과 같이 요청메세지에 엔터티 본문이 있는것을 금지하는 경우도 있다.

4. 리소스에 접근

메세지에서 지정한 리소스에 접근한다.
웹 서버는 리소스 서버이다. 웹서버는 HTML페이지나 JPEG와 같은 미리 만들어진
콘텐츠를 제공하며, 마찬가지로 서버 위에서 동작하는 리소스 생성 어플리케이션을 통해
만들어진 동적 콘텐츠도 제공한다. (WAS)
또한, 웹서버는 여러 종류의 리소스 매핑을 지원한다. 가장 단순한 형태의
리소스 매핑은 요청 URI를 웹서버의 파일 시스템안에 있는 파일 이름으로 사용하는것이다.
일반적으로 웹서버 파일시스템의 특별한 폴더를 웹 콘텐츠를 위해 예약해둔다.이 파일은 "문서루트" 혹은  "docroot"로 불린다. 
웹서버는 요청메세지에서 URI를 가져와서 문서루트 뒤에 붙인다.

GET /test_dir/test.html HTTP/1.0
에 대한 요청에, docroot를 /usr/local/httpd/files라고 설정해두었다면,
웹서버는
/usr/local/httpd/files/test_dir/test.html 파일을 반환한다.
이러한 docroot는 htttpd.conf설정파일에서 추가할수있다.

5. 응답을 만든다

HTTP 응답 메세지를 생성한다.
상태코드, 응답헤더, 그리고 응답본문등이 있다.

6. 응답을 보낸다

응답을 클라이언트에게 돌려준다.
웹서버는 요청메세지를 받을때처럼, TCP커넥션을 통해서 클라이언트에게
응답메세지를 보낼때에도, 많은 커넥션을 가질수있다.
그렇기때문에, 서버는 커녁션 상태를 추적해야하며, 지속적커넥션 또는 
비지속적커넥션인지에 따라 모든 메세지를 전송한후에 커넥션을 닫을지 정해야한다.

7. 트랜잭션을 로그에 남긴다.

로그파일에 트랜잭션 완료에 대한 기록을 남긴다.
로깅이라고하며, 트랜잭션이 완료되었을때, 웹서버는 트랜잭션이
어떻게 수행되었는지에 대한 로그를 로그파일에 기록해야한다.
profile
etudiant_42

0개의 댓글