정글사관학교 개발일지/웹 서버

정글사관학교 50일차 TIL: 웹서버 개념 정리

Woonys 2021. 12. 21. 23:30
반응형

웹서버

1. Web Basics

  • 클라이언트와 서버는 텍스트 베이스인 HTTP로 통신함.
  • HTTP: 매우 단순.
    • 클라이언트는 서버와 인터넷 연결을 open하고 콘텐츠를 요청한다.
    • 서버는 요청받은 콘텐츠에 대해 응답하고 연결을 종료한다.
    • 브라우저는 콘텐츠를 읽고 화면에 띄운다.
FTP와 HTTP와의 차이?
  • 가장 큰 차이는 웹 콘텐츠가 HTML 언어로 쓰여진다는 점.
  • HTML 프로그램은 태그를 갖고 있는데, 이 태그는 브라우저에게 어떻게 다양한 텍스트와 그래픽 요소들을 페이지에 띄울 것인지 알려준다. 반면 FTP는 파일을 전송하는 프로토콜.

 

2. Web content

  • 클라이언트와 서버에게 content란 MIME type을 지닌 바이트의 연속. MIME는 파일의 유형을 나타냄.(html, gif, png, jpeg)
  • 웹 서버는 클라이언트에게 콘텐츠를 두 가지 방식으로 제공
    1. 정적 콘텐츠
      • 서버 내 저장 공간에서 파일을 가져다가 그것을 클라이언트에게 반환.
      • 디스크 파일은 정적 콘텐츠라고도 하며, 파일을 클라이언트에게 반환하는 프로세스를 serving static content라고 한다.
    2. 동적 콘텐츠
      • 실행가능한 파일을 작동시키고 그것의 결과물을 클라이언트에게 제공한다. 런타임 시에 만들어지는 결과물을 동적 콘텐츠라 하며, 프로그램을 동작시키고 그 결과물을 클라이언트에게 반환하는 프로세스를 serving dynamic content라 한다.
  • 웹서버로부터 반환받는 모든 콘텐츠는 파일과 연관되어 있다. 각 파일은 URL이라는 고유한 이름을 갖고 있음.
  • 실행 가능한 파일에 대한 URL은 프로그램 인자를 파일 이름 뒤에 포함한다. “?” 기호는 파일 이름과 인자를 구분짓게 한다. 각 인자는 “&” 문자로 구분할 수 있다.(인자를 추가할 수 있다는 뜻)
  • 어떻게 서버가 URL의 접미사를 이해하는지에 대한 몇 가지 방법
    • URL만으로 이 요청사항으로 받게 될 콘텐츠가 정적인지 동적인지 구별하는 표준 규칙은 없음. 각 서버는 각자만의 방식으로 파일을 관리. 클래식한 접근 방식은 디렉토리 집합을 이름으로 유형화(구분). (ex-cgi-bin) ⇒ 디렉토리 이름만으로 특정지어서 모든 실행가능한 파일이 반드시 해당 디렉토리 내에 있게끔.
  • *주의: suffix에 오는 가장 첫 문자인 “/”는 리눅스에서 말하는 root 디렉토리를 의미하는 것이 아님. 이는 홈 디렉토리를 말하며 콘텐츠의 유형이 무엇이든 들어있을 수 있다.
    • 정적 콘텐츠 경로: /usr/httpd/html
    • 동적 콘텐츠 경로: /usr/httpd/cgi-bin
  • URL에 붙는 최소 단위 접미사는 “/’ ⇒ 모든 서버가 디폴트 홈페이지로 설정해놓음.

3. HTTP 트랜잭션

  • HTTP는 텍스트 라인을 기반으로 인터넷 연결을 통해 전송하기 때문에, 우리는 리눅스 텔레넷 프로그램을 이용해인터넷 상의 어떤 웹서버와도 트랜잭션을 수행할 수 있음.
    • 텔넷(TELNET): 원격 로그인 툴로써 SSH가 그 자리를 대체.
    • 텔넷을 통해 AOL 웹서버 홈페이지를 요청할 때의 코드
    • 1 linux> telnet [www.aol.com](http://www.aol.com) 80 
      2 Trying 205.188.146.23... 
      3 Connected to aol.com. 
      4 Escape character is ’^\]’.
      5 GET / HTTP/1.1 
      6 Host: [www.aol.com](http://www.aol.com) 
      7 
      8 HTTP/1.0 200 OK 
      9 MIME-Version: 1.0 
      10 Date: Mon, 8 Jan 2010 4:59:42 GMT 
      11 Server: Apache-Coyote/1.1 
      12 Content-Type: text/html 
      13 Content-Length: 42092 
      14 
      15
      16 ... 
      17
      18 Connection closed by foreign host. 
      19 linux> Client: open connection to server Telnet prints 3 lines to the terminal Client: request line Client: required HTTP/1.1 header Client: empty line terminates headers Server: response line Server: followed by five response headers Server: expect HTML in the response body Server: expect 42,092 bytes in the response body Server: empty line terminates response headers Server: first HTML line in response body Server: 766 lines of HTML not shown Server: last HTML line in response body Server: closes connection Client: closes connection and terminates
  • 리눅스 쉘에서 TELNET을 실행한 뒤 AOL 웹서버와 연결을 요청
  • TELNET은 터미널에게 3줄짜리 아웃풋을 출력. 커넥션을 오픈한 다음 텍스트를 출력하고 기다림.

HTTP 요청

  • HTTP 요청은 request line으로 구성
5 GET / HTTP/1.1 // request line
6 Host: www.aol.com // required HTTP/1.1 header

HTTP 응답

  • HTTP 응답은 요청과 비슷. 요청은 request line으로 구성되고 0 이상의 response header가 붙는다.
  • 전에 배웠던 2xx, 3xx, 4xx, 5xx 상태코드를 그때 상황에 따라 반환해서 클라이언트에게 전송,

4. Serving Dynamic content

CGI(Common gateway interface)

어떻게 Client가 프로그램 인자를 서버에게 넘겨주나?

  • GET 요청에 대한 인자는 URI를 통해 들어온다.
    • ?: 파일 이름과 인자를 구분
    • &: 각 인자를 구분
  • 스페이스는 허용되지 X ⇒ %20이라는 문자열로 스페이스가 변환됨.

서버는 어떻게 인자를 자식 프로세스에게 넘겨주나?

  • 서버가 요청을 받고나면 ex) GET /cgi-bin/adder?15000&213 HTTP/1.1
  • 서버는 fork 함수를 호출해 자식 프로세스를 생성한 뒤, execve 함수를 호출해 자식 프로세스 내에서 /cgi-bin/adder 프로그램을 실행한다.
  • adder 와 같은 프로그램을 CGI 프로그램이라 하는데, 이는 adder 프로그램이 CGI 표준을 따르기 때문.
  • execve 함수를 호출하기 전에, 자식 프로세스는 CGI 환경변수 QUERY_STRING을 15000&213으로 설정하는데, 이는 adder 프로그램이 런타임시에 참조할 수 있도록 하기 위함이다.

CGI: 웹 서버에서 동적인 페이지를 보여주기 위해 임의의 프로그램을 실행할 수 있도록 하는 기술 중 하나. 원래 웹서버는 서버에 저장되어 있는 고정된 문서를 보여주는 정적인 콘텐츠만 띄우는 역할을 했으나, 웹서버에서 정보를 찾거나 기록하려면 웹서버를 고쳐서 그런 기능을 넣어야 했다. 하지만 그럴 수 없으니, 대신 웹서버가 특정한 URL로 들어가면 요청을 원하는 프로그램에 적절히 넘겨주는 기술이 필요했는데 CGI가 그런 역할을 한다.

 

서버는 어떻게 다른 정보를 자식 프로세스에게 넘겨주나?

  • CGI는 CGI 프로그램이 작동할 때 설정할 수 있을 것으로 예상하는 다른 환경 변수를 정의한다.

자식 프로세스는 어떻게 결과물을 보내주나?

  • CGI 프로그램은 동적 콘텐츠를 표준 출력으로 보낸다. 자식 프로세스가 CGI 프로그램을 불러오고 작동시키기 전에, 자식 프로세스는 리눅스 dup2 함수를 사용해 표준 출력을 클라이언트와 연결된 연결 디스크립터로 리다이렉트한다.
  • 따라서, CGI 프로그램에서 표준 출력으로 작성하는 모든 것들은 다이렉트로 클라이언트한테 간다.
  • 이때, 부모 프로세스는 자식 프로세스가 만드는 콘텐츠의 타입이나 크기를 전혀 모르기 때문에, 자식 프로세스는 콘텐츠 타입과 콘텐츠 길이를 생성하는 Content-type, Content-length response header를 생성해줘야 한다.
반응형