SWjungle/#네트워크

web server

장영 2023. 9. 17. 19:25

HTTP


📌HTTP

  • 웹에서 웹 클라이언트와 서버는 http라고 하는 텍스트 기반 응용 계층의 프로토콜중 하나로, TCP/IP 프로토콜을 이용한다.
  • HTTP는 이미지, 텍스트 ,오디오 등 여러가지 유형의 데이터를 주고 받을 수 있다 .이런 웹 컨텐츠는 MINE 타입으로 인코딩됨

 

📌MINE타입

  • 웹 서버에서 전송되는 여러 종류의 컨텐츠 유형을 전달하기 위해 필요한 매커니즘

 

📌MINE타입 역할

  • 바이너리 파일의 송수신
    • ->웹은 텍스트 파일 뿐만 아니라 여러 바이너리 파일(오디오, 이미지, 비디오 등)을 전송하기도 한다.이런 바이너리 파일들을 문제 없이 전달하기 위해 파일을 mine타입 텍스트파일로 인코딩 한다.
  • 데이터의 유형 명시
    • ->클라이언트와 서버는 주고 받는 데이터의 본체의 MINE타입을 통해 데이터가 어떤 유형인지 파악하고, 어떻게 데이터를 해석할지 결정한다.
    • 예를들어) 서버에서 클라이언트에게 준 데이터의 본체 MINE 타입이 text/html이라면, 클라이언트는 이 데이터가 html 형식의 텍스트 데이터라는 것을 알 수 있다.

MINE 타입의 예

📌content-type

  • http 요청, 응답 메세지의 헤더중에는 MINE 타입으로 표현된 content-type 헤더라는 것이 있다. 이 http 메세지의 바디 데이터를 상대가 어떤 MINE타입으로 해석해야 할 지를 알려준다.

 

📌정적 콘텐츠, 동적 컨텐츠

웹에서 컨텐츠는 단지 파일이다. 웹 서버가 클라이언트에게 컨텐츠를 제공하는 유형을 크게 정적, 동적 컨텐츠로 나눌 수 있다.
  • 정적 컨텐츠 : 변화가 없는 컨텐츠, 미리 서버의 파일 시스템에 저장해 둔 내용을 클라리언트에 상관 없이 응답만 한다.
  • 동적 컨텐츠 : 실팽파일이 런타임에 만든 출력을 클라이언트에게 보낼 때, 그 출력을 동적 컨텐츠라고 한다. 클라이언트 요청에 따라 결과값이 달라지는 컨텐츠를 의미

 

📌URL

웹 네트워크 상에 있는 컨텐츠가 어디 있는지를 알려주는 주소이다.작게는 웹 페이지, 크게는 컴퓨터 네트어ㅜ크 상의 모든 자원의 위치를 나타낼 수 있다.
  • 해당 웹 자원의 주소에 접근하려면 해당 url에 맞는 프로토콜로 접속해야한다.
http://bluefish.ics.cs.cmu.edu:8000/cgi-bin/adder?15000&213

http://bluefish.ics.cs.cmu.edu:8000/cgi-bin/adder?15000&213  

✏️url의 prefix

  • 프로토콜 : http
    • 어떤 프로토콜을 사용하여 데이터를 교환할 것인가?
  • 도메인 이름 : bluefish.ics.cs.cmu.edu
    • 웹 서버가 어디에 있는가?
  • 포트번호 : 8000
    • 이 서버가 어느 포트를 듣고 있는가?
    • 각 프로토콜에 대한 표준 포트를 사용할 시에는 생략가능, http 프로토콜 표준 포트는 80

✏️url의 suffix

  • 웹 서버 안에서의 자원의 경로 : /cgi-bin/adder
    • 이 파일은 인터넷 호스트 bluefish.ics.cs.cmu.edu 안의 경로에 있다. 그리고 html유형이다.
  • 웹서버가 제공하는 추가 파라미터 : ?15000&213
  • 해당 url 이 정적 or 동적 컨텐츠인지
    • 특별한 방법은 없고, 만약 한 디렉토리를 만들어서 모든 동적 콘텐츠가 그 디렉토리에 저장되도록 할 수 있다.
    • 예) cgi-bin 디렉토리

📌HTTP 트랜젝션

  • 요청과 응답
웹 클라이언트와 서버는 요청과 응답의 형태로 리소스를 주고 받는다. 이런 요청과 응답은 htttp 메세지라는 형식을 통해 이루어 진다.

HTTP 요청과 응답

📌HTTP 요청

  • 요청 라인요청 헤더로 나뉜다.

✏️요청라인

<method> <uri> <version>의 형태를 가진다.
  • method : 서버가 어떤 동작을 해야 하는지를 정해준다. GET, POST 등 여러가지가 있지만 GET만을 사용, GET 메소드는 서버에서 클라이언트로 지정한 리소스를 보내라는 뜻이다.
  • uri : 브라우저가 컨텐츠를 요청할 때는 해당 리소스의 url 뒤의 suffix가 uri 이다.
  • version : 요청이 어떤 http 버전으로 포맷되어 있을지를 말해준다.

✏️요청헤더

  • host 헤더 : 꼭 있어야하는 헤더이다.
  • 같은 ip를 쓰는 하나의 서버 안에서 여러 사이트들을 만들 수 있기 때문이다. 따라서 서버의 도메인 네임을 명시해주어야 한다.
  • 이를 가상 호스팅이라고 한다.

📌HTTP 응답

  • 응답 라인응답 헤더로 나뉜다.
<version> <status code> <status message>의 형태를 가진다.
  • version : 응답의 http 버전을 정해준다.
  • status code 상태코드 : 요청이 성공했는지, 다른 조치가 필요한지 등의 요청 특성을 알려준다.
  • status message : 에러 코드를 영어로 알려준다

✏️응답헤더

  • Content-type : 응답 본체(body) 내 컨텐츠의 MIME 타입을 알려준다.
  • Content-legnth : 응답 본체 내 컨텐츠 길이를 알려준다.

 

📌동적 컨텐츠의 처리

  • 클라이언트가 요청을 보낼때 어떤 인자를 서버에 같이 보내면, 서버가 그 인자에 맞는 응답을 줄 수 있다. 이것이 동적 컨텐츠 이다.
  • 근데 어떻게 클라이언트가 요청을 주는 대로 서버가 때에 따라 다른 응답을 줄 수 있을까?
  • 이러한 질문들은 CGI라고 부르는 사실상의 표준으로 설명할 수 있다.

 

📌CGI

  • CGI는 웹 서버에서 동적인 페이지를 보여주기 위한 임의의 자식 프로세스를 실행할 수 있게 한다.
  • 원래 웹 서버는 서버에 저장되어 있는 고정된 문서를 보여준다 -> 정적 컨텐츠
  • 하지만 데이터베이스 조회, 정보 기록, 로직 처리 등의 요청을 수행하기 위해서는 웹 서버 만드로는 할 수 없었다.
  • 대신 웹 서버가 특정 url로 들어가 클라이언트의 요청을 특정한 프로그램에 넘겨줘서 이런 작업들을 수행할 수 있게 되었는데, 이 기술이 바로 CGI이다.

 

 

📌작동 방식

 

✏️클라이언트가 서버에 프로그램 인자를 전달하는 방법

  • GET 요청을 위한 인자들은 URI의 ? 과 &로 전달된다.
  • 요청 라인에 GET /cgi-bin/adder?15000&213 HTTP/1.1 과 같은 형태로 전달

✏️어떻게 서버는 인자들을 임의의 프로세스에 전달하는가?

  1. 서버가 GET /cgi-bin/adder?15000&213 HTTP/1.1  다음과 같은 요청을 받은 후에, fork() 시스템 콜을 통해 자식 프로세스를 생성
  2. 자식 프로세스가 CGI 환경 변수 QUERY_STRING 인자 "15000&213"으로 설정
  3. 서버가 execve() 시스템 콜을 호출해 /cgi-bin/adder 프로그램을 자식 프로세스의 컨텍스트에서 실행.
  4. adder 프로그램이 런타임에 gentv()를 써서 그 환경 변수의 값을 참조한다.

✏️서버가 자식 프로세스에 정보를 전달하는 방법

  • 자식 프로그램이 실행 될때 환경 변수에 값이 저장되어 있어야한다.

✏️자식 프로세스가 출력을 내보내는 방법

  • CGI 프로그램은 자신의 컨텐츠를 표준 출력으로 내보낸다.
  1. dup2 함수를 이용해 CGI 프로세스의 표준출력으로 클라이언트와 연결된 서버의 소켓 연결 식별자를 지정한다. 표준출력으로 CGI를 쓰는것들이 모두 클라이언트로 바로 가게된다.
  2. 자식 프로세스가 응답 헤더의 Content-type 과 Content-length, 헤더 종료 빈칸 까지 만들어준다.