SWjungle/#네트워크
web server
장영
2023. 9. 17. 19:25
HTTP
📌HTTP
- 웹에서 웹 클라이언트와 서버는 http라고 하는 텍스트 기반 응용 계층의 프로토콜중 하나로, TCP/IP 프로토콜을 이용한다.
- HTTP는 이미지, 텍스트 ,오디오 등 여러가지 유형의 데이터를 주고 받을 수 있다 .이런 웹 컨텐츠는 MINE 타입으로 인코딩됨
📌MINE타입
- 웹 서버에서 전송되는 여러 종류의 컨텐츠 유형을 전달하기 위해 필요한 매커니즘
📌MINE타입 역할
- 바이너리 파일의 송수신
- ->웹은 텍스트 파일 뿐만 아니라 여러 바이너리 파일(오디오, 이미지, 비디오 등)을 전송하기도 한다.이런 바이너리 파일들을 문제 없이 전달하기 위해 파일을 mine타입 텍스트파일로 인코딩 한다.
- 데이터의 유형 명시
- ->클라이언트와 서버는 주고 받는 데이터의 본체의 MINE타입을 통해 데이터가 어떤 유형인지 파악하고, 어떻게 데이터를 해석할지 결정한다.
- 예를들어) 서버에서 클라이언트에게 준 데이터의 본체 MINE 타입이 text/html이라면, 클라이언트는 이 데이터가 html 형식의 텍스트 데이터라는 것을 알 수 있다.
📌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 요청
- 요청 라인과 요청 헤더로 나뉜다.
✏️요청라인
<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 과 같은 형태로 전달
✏️어떻게 서버는 인자들을 임의의 프로세스에 전달하는가?
- 서버가 GET /cgi-bin/adder?15000&213 HTTP/1.1 다음과 같은 요청을 받은 후에, fork() 시스템 콜을 통해 자식 프로세스를 생성
- 자식 프로세스가 CGI 환경 변수 QUERY_STRING 인자 "15000&213"으로 설정
- 서버가 execve() 시스템 콜을 호출해 /cgi-bin/adder 프로그램을 자식 프로세스의 컨텍스트에서 실행.
- adder 프로그램이 런타임에 gentv()를 써서 그 환경 변수의 값을 참조한다.
✏️서버가 자식 프로세스에 정보를 전달하는 방법
- 자식 프로그램이 실행 될때 환경 변수에 값이 저장되어 있어야한다.
✏️자식 프로세스가 출력을 내보내는 방법
- CGI 프로그램은 자신의 컨텐츠를 표준 출력으로 내보낸다.
- dup2 함수를 이용해 CGI 프로세스의 표준출력으로 클라이언트와 연결된 서버의 소켓 연결 식별자를 지정한다. 표준출력으로 CGI를 쓰는것들이 모두 클라이언트로 바로 가게된다.
- 자식 프로세스가 응답 헤더의 Content-type 과 Content-length, 헤더 종료 빈칸 까지 만들어준다.