Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[5장] 웹 서버 #7

Open
eunbc opened this issue Nov 21, 2023 · 7 comments
Open

[5장] 웹 서버 #7

eunbc opened this issue Nov 21, 2023 · 7 comments
Labels

Comments

@eunbc
Copy link

eunbc commented Nov 21, 2023

No description provided.

@eunbc eunbc added the 2주차 label Nov 21, 2023
@annahxxl
Copy link

진짜 웹 서버가 하는 일

클라이언트 커넥션 수락

  • 클라이언트가 이미 서버에 대해 열려있는 지속적 커넥션을 갖고 있다면, 클라이언트는 요청을 보내기 위해 그 커넥션을 사용할 수 있다
  • 그렇지 않다면, 클라이언트는 서버에 대한 새 커넥션을 열 필요가 있다

요청 메시지 수신

  • 커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성한다

  • 웹 서버는 파싱해서 이해하는 것이 가능한 수준의 분량을 확보할 때까지 데이터를 네트워크로부터 읽어서 메시지 일부분을 메모리에 임시로 저장해 둘 필요가 있다

  • 커넥션 입력/출력 처리 아키텍처

    IMG_9699 크게

    • 단일 스레드 웹 서버
      • 한 번에 하나씩 요청을 처리
    • 멀티프로세스와 멀티스레드 웹 서버
      • 여러 요청을 동시에 처리하기 위해 여러 개의 프로세스 혹은 고효율 스레드를 할당
      • 스레드/프로세스는 필요에 따라 만들어질 수도 있고, 미리 만들어 둘 수도 있다
      • 수 많은 커넥션을 동시에 처리할 떄는 너무 많은 프로세스나 스레드가 메모리나 시스템 리소스를 소비하지 않도록 최대 개수에 제한을 두어야 한다
    • 다중 I/O 서버
      • 모든 커넥션을 동시에 감시하며, 커넥션의 상태가 바뀌면, 그 커넥션에 대한 처리가 수행된다
      • 커넥션이 처리되면 다음번 상태 변경을 위해 열린 커넥션 목록으로 돌아간다
    • 다중 멀티스레드 웹 서버
      • 여러 개의 스레드는 각각 열려있는 커넥션을 감시하고 각 커넥션에 대해 작업을 수행한다

요청 처리

  • 웹 서버가 요청을 받으면, 서버는 요청으로부터 메서드, 리소스, 헤더, 본문을 얻어내어 처리한다

리소스 매핑과 접근

  • 요청 메시지의 URI에 대한 알맞은 정적 or 동적 콘텐츠를 제공한다

응답 만들기

  • 요청 메서드로 서술되는 동작을 수행한 뒤 응답 메시지를 반환한다

응답 보내기

  • 서버는 커넥션 상태를 추적해야 하며, 비지속적인 커넥션이라면 모든 메시지를 전송한 후에 커넥션을 닫을 것이다
  • 지속적인 커넥션이라면 서버가 Content-Length 헤더를 바르게 계산하기 위해 특별한 주의를 필요로 하는 경우나, 클라이언트가 응답이 언제 끝나는지 알 수 없는 경우에 커넥션은 열린 상태를 유지할 것이다

로깅

  • 트랜잭션이 완료되었을 때, 웹 서버는 트랜잭션이 어떻게 수행되었는지에 대한 로그를 로그 파일에 기록한다

@eunbc
Copy link
Author

eunbc commented Nov 22, 2023

웹 서버

  1. 웹 서버는 HTTP 요청을 처리하고 응답을 제공한다
  2. 웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현한 것이다

단계 1 : 클라이언트 커넥션 수락

  1. 클라이언트가 지속 커넥션을 갖고 있다면, 클라이언트는 그 커넥션을 사용할 수 있다. 그렇지 않다면, 새 커넥션을 열 필요가 있다

단계 2: 요청 메시지 수신

  1. 커넥션에 데이터가 도착하면, 데이터를 읽고 파싱하여 요청 메시지를 구성한다
  2. 커넥션 입출력 처리 아키텍처
    1. 단일 스레드 웹 서버
    2. 멀티프로세스와 멀티스레드 웹 서버
    3. 다중 I/O 서버
    4. 다중 멀티스레드 웹 서버

단계 3 : 요청 처리

  1. 웹 서버가 요청을 받으면, 서버는 요청으로부터 메서드, 리소스, 헤더, 본문을 얻어내어 처리한다

단계 4 : 리소스의 매핑과 접근

  1. 정적 콘텐츠, 동적 콘텐츠 제공

단계 5 : 응답 만들기

  1. 서버가 리소스를 식별하면, 서버는 요청 메서드로 서술되는 동작을 수행한 뒤 응답 메시지를 반환한다
  2. 상태 코드, 헤더, + (본문)이 있는 경우 응답 메시지에 포함되는 내용
    1. 응답 본문의 MIME 타입을 서술하는 Content-Type 헤더
    2. 응답 본문의 길이를 서술하는 Content-Length 헤더
    3. 실제 응답 본문의 내용

단계 6 : 응답 보내기

단계 7 : 로깅

  1. 트랜잭션이 완료되었을 때 웹 서버는 트랙잰셕이 어떻게 수행되었는지에 대한 로그를 로그파일에 기록한다

@park0jae
Copy link
Member

park0jae commented Nov 22, 2023

다채로운 웹서버


웹 서버는 HTTP 요청을 처리하고 응답을 제공하며, 웹 서버 소프트웨어웹 페이지 제공에 특화된 장비 모두를 가리킨다.

[ 웹 서버 구현 ]

  • 웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현한 것

[ 웹 서버의 형태 ]

  • 다목적 소프트웨어 (웹 서버를 표준 컴퓨터 시스템에 설치하고 실행 가능)
  • 마이크로프로세서 (사용자에게 판매할 전자기기 안에 몇 개의 컴퓨터 칩만으로 구현된 것)

다목적 소프트웨어 웹서버

  • 일반적인 컴퓨터에서 실행되는 서버를 말함
  • nginx, Apache 서버 등이 있음

임베디드 웹서버

  • 일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹서버

진짜 웹서버가 하는 일


모든 웹서버가 공통적으로 하는 일이 있다.

  1. 커넥션 맺기 : 클라이언트의 접속을 받아들이거나, 원치 않는 클라이언트라면 닫는다.
  2. 요청 받기 : HTTP 요청 메시지를 네트워크로부터 읽어들인다.
  3. 요청 처리 : 요청 메시지를 해석하고 행동을 취한다.
  4. 리소스에 접근 : 메시지에서 지정한 리소스에 접근한다.
  5. 응답 생성 : 올바른 헤더를 포함한 HTTP 응답 메시지를 생성
  6. 응답 반환 : 응답을 클라이언트에게 돌려준다.
  7. 트랜잭션을 로그로 남김 : 로그 파일에 트랜잭션 완료에 대한 기록을 남긴다.

→ 단계별로 자세히 알아보자.

클라이언트 커넥션 수락

  • 클라이언트가 이미 서버에 열려있는 지속 커넥션이 있다면 그것을 사용하고, 없다면 새 커넥션을 연다.
  • 웹서버는 클라이언트의 정체를 밝혀 커넥션을 맺을지 말지를 결정할 수 있다.
    • 클라이언트의 IP 주소나 호스트명이 인가되지 않았거나 악의적이라고 판단된 경우 커넥션을 닫는다.
  • 라이언트의 호스트명을 알아내기 위해 역방향DNS를 사용하여 클라이언트의 IP주소로부터 호스트 명을 변환하도록 한다.
    • 이를 구체적인 접근 제어와 로깅을 위해 사용할 수 있다.
  • ident 프로토콜을 사용하여 클라이언트 사용자를 알아낼 수도 있다. (공공 인터넷에서는 보안상의 문제로 잘 동작하지 않음)
    • 서버에게 어떤 사용자 이름이 HTTP 커넥션을 초기화했는지 찾아낼 수 있게 해준다.
    • 웹 서버 로깅에 유용

[ 역방향 DNS와 DNS ]

  • DNS : 도메인 이름 → IP 주소
  • 역방향 DNS : IP 주소 → 도메인 이름

→ 역방향 DNS는 IP 주소를 거꾸로 뒤집어주고 [in-addr.arpa] 라는 특별한 형식의 도메인을 이용해 새로운 도메인을 구성한다.

ex) 192.168.1.1 → [1.1.168.192.in-addr.arpa] 를 통해 해당 IP 주소에 대한 호스트 이름을 얻을 수 있음

요청 메시지 수신

  • 요청 메시지 파싱 → 요청 메서드 , URI , 버전 번호를 찾고 CRLF를 기준으로 읽는다.
  • 커넥션 입력/출력 처리 아키텍처
    • 단일 스레드 웹서버
      • 한번의 하나의 요청 처리
      • 처리 도중 다른 커넥션 무시
    • 멀티프로세스와 멀티스레드 웹 서버
      • 여러 개의 프로세스 혹은 고효율 스레드를 할당
      • 보통 너무 많은 프로세스나 스레드를 생성하지 않도록 최대 개수를 제한을 걸어둠
    • 다중 I/O 서버
      • 특정 커넥션에 대해 작업을 수행하는 것은 실제로 해야할 일이 있을 때 해당 커넥션에 대해 작업을 수행한다.
    • 다중 멀티스레드 웹 서버
      • 멀티스레딩과 다중화를 결합
      • 여러 개의 스레드가 각각 열려있는 커넥션을 감시하고, 각 커넥션에 대해 조금씩 작업을 수행한다.

요청 처리

  • HTTP 메서드에 따라 요청을 처리하는 단계

리소스의 매핑과 접근

  • 요청 메시지의 URI에 대응하는 콘텐츠를 식별하는 과정

[ docroot ]

  • 웹서버 파일 시스템의 특별한 폴더로, 웹 콘텐츠를 위해 예약해 둔 것을 docroot라고 함
  • 간단히 말하자면, 웹 서버가 웹 페이지와 관련된 파일들을 찾는 기본 폴더를 의미함
docroot와 유사한 개념은 스프링에서 'classpath' 해당하는데, 스프링 부트 애플리케이션에서 정적 자원(HTML, CSS, 이미지)
 기본적으로 'src/main/resources/static' 폴더 아래에 위치한다.  폴더가 스프링 부트에서의 'classpath' 일부이며,
정적인 자원을 찾는 기본 위치로 사용된다.

src
|-- main
    |-- resources
        |-- static
            |-- index.html

위와 같은 구조에서 'static' 폴더는 'docroot' 유사한 역할을 한다. 클라이언트가 "/index.html" 접근하면 내장 또는 
외부  서버는 이를 스프링 부트 애플리케이션의 'classpath'에서 찾아 해당 파일을 반환한다.

결국 요약하면?.. 스프링에서 ‘docroot’에 해당하는 개념은 정적인 자원이 위치하는 기본 폴더이며, 스프링 부트에서는 ‘classpath’의 static 폴더에 해당한다고 한다.

응답 만들기

  • 응답 메시지는 응답 상태코드, 헤더, 본문을 넣는 과정
  • 본문이 있다면 MIME 타입과 분몬의 길이를 알려주는 Content-Type, Content-Length 헤더가 각각 필요
  • 한편, 성공 메시지 대신 리다이렉션 응답을 반환해야하는 경우도 있다.
    • 임시/영구로 리소스가 옮겨진 경우
    • URL 증강 (URL에 추가 정보를 포함하여 URL을 확장하거나 구체화)
    • 부하 균형 (부하가 덜 걸린 서버로 리다이렉트)
    • 친밀한 서버 (특정 사용자에 대한 정보를 가지고 있는 다른 서버로 리다이렉트)
    • 디렉터리 이름 정규화 (URI 요청 시 / 를 빠뜨린 경우 이를 추가하여 리다이렉트)
    • 결국 Location 응답 헤더에 리다이렉션의 목적지 주소를 넣어 보낸다.

응답 보내기

  • 서버는 커넥션 상태를 추적하여 비지속적인 커넥션이면 메시지 전송 후 커넥션을 닫는다.
  • 지속적인 커넥션이라면 ?
    • 서버가 Content-Length를 바르게 계산하기 위해 특별한 주의를 해야함
    • 클라이언트가 응답이 언제 끝나는지 알 수 없는 경우, 커넥션을 열린 상태로 유지해야함

로깅

  • 트랜잭션이 완료되었을 때 웹서버는 트랜잭션의 수행에 관한 로그를 로그 파일에 기록한다.

@byulcode
Copy link

역방향 DNS (Reverse DNS)

  • IP → 호스트명 변환 프로세스
  • 클라이언트의 IP 주소를 사용하여 해당 IP 주소에 대응하는 호스트명을 찾는 과정을 포함한다.
  • 동작 원리
    • 클라이언트 IP 주소 확인
    • 서버는 클라이언트의 IP 주소를 사용하여 역방향 DNS 쿼리를 생성한다. 이 쿼리는 주로 PTR (Pointer) 레코드를 사용하여 IP 주소를 호스트명으로 변환한다.
      • DNS 쿼리 : 클라이언트가 특정 정보를 얻기 위해 DNS 서버에 보내는 요청
      • PRT record : 특정 IP 주소에 대응하는 도메인 이름을 매핑하는데 사용되는 레코드
    • 서버는 역방향 DNS 쿼리를 로컬 DNS 서버에 전송한다.
    • DNS 서버는 IP 주소에 해당하는 호스트명을 찾아내고, 이 정보를 서버에 반환한다.

참고 : https://somaz.tistory.com/172

서버사이드 인클루드 (Server-Side Includes, SSI)란?

  • 웹 서버에서 동적으로 웹 페이지를 생성하는 데 사용되는 기술 중 하나로, 주로 정적인 HTML 문서에 동적인 내용을 삽입할 때 사용한다.
  • SSI는일반적으로 HTML 파일 내에서 **<!--#**와 **-->**로 둘러싸인 명령어를 사용하여 구현되며, SSI 문장을 포함하고 있는 파일들은 "*.shtml" 확장자를 사용하도록 정의된다.
<!--#include virtual="/includes/header.html" -->
<p>This is the main content of the page.</p>
<!--#echo var="DATE_LOCAL" -->
  • 만약 어떤 리소스가 서버사이드 인클루드를 포함하고 있는 것으로 설정되어 있다면 서버는 그 리소스의 콘텐츠를 클라이언트에게 보내기 전에 처리한다.

@cloudwi
Copy link
Contributor

cloudwi commented Nov 22, 2023

https://www.notion.so/5-ca7f1e7fcd1d4abd9cb1a2adc96f7d9b?pvs=4

Untitled

다채로운 웹 서버

모든 웹 서버는 리소스에 대한 HTTP 요청을 받아서 콘텐츠를 클라이언트에게 돌려준다.

웹 서버 구현

웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현한 것이다. 웹 서버는 자신이 제공하는 리소스를 관리하고 웹 서버를 설정, 통제, 확장하기 위한 관리 기능을 제공한다.

클라이언트 호스트 명 식별

??

단일 스레드 웹 서버

node.js

Untitled

@KarmaPol
Copy link
Member

웹 서버는 HTTP 프로토콜 구현, 웹 리소스 관리 및 웹 서버 관리 기능 제공
TCP 커넥션 관리를 OS와 담당

  • 다목적 소프트웨어 웹 서버 - 아파치, 엔진 엑스 등
  • 임베디드 웹 서버 - 가전 제품 탑재용 간단한 웹 서버

웹 서버가 하는 일

  1. 커넥션을 맺는다
  2. 요청을 받는다
  3. 요청을 처리한다
  4. 리소스에 접근한다
  5. 응답을 만든다
  6. 응답을 보낸다
  7. 트랜잭션을 로그로 남긴다

1. 커넥션 수락

  • 지속 커넥션 vs 새 커넥션 맺기
  • 역방향 DNS - 클라이언트 IP 주소를 호스트 명으로 변환
  • ident 프로토콜 - 클라이언트에서 커넥션 초기화 시 사용자 정보 담은 ident 응답 반환
    이때 http 커넥션와 ident 커넥션은 별개로 연결
    방화벽이 ident 트래픽을 막거나, 성능 저하 및 보안 이슈로 내부망이 아니면 잘 사용하지 않음

2. 요청 메시지 수신

  1. 요청 메시지를 파싱하여 메서드, URI, 버전 번호를 찾는다 (스페이스, CRLF)
  2. 메시지 헤더를 읽는다, 헤더 끝을 의미하는 CRLF를 찾는다
  3. 요청 본문이 있으면 읽어 들인다
  • 파싱된 메시지는 읽기 쉬운 내부 자료구조에 저장

커넥션 IO 처리 아키텍처

  • 단일 스레드 웹서버
    한번에 커넥션 요청 한개만 처리, 처리 도중엔 다른 요청은 무시 -> 성능 문제 발생 가능
  • 멀티프로세스 / 멀티스레드 웹 서버
    여러 요청을 동시에 처리하여 효율적
    하지만 너무 많은 동시 커넥션을 처리할 경우, 지나치게 많은 메모리나 시스템 자원 소모 -> 최대 개수 제한

(추가 예정)

@kimday0326
Copy link
Member

웹 서버는 HTTP 및 그와 관련된 TCP 처리를 구현한 것이다. 웹서버는 자신이 제공하는 리소스를 관리하고 웹 서버를 설정, 통제, 확장하기 위한 관리 기능을 제공한다.

웹 서버의 종류

  • 다목적 소프트웨어 웹 서버
    -> 네트워크에 연결될 표준 컴퓨터 시스템에서 동작하는 웹서버 (Nginx, Apache)
  • 임베디드 웹 서버
    -> 일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹서버 (프린터, 가전제품)

진짜 웹 서버가 하는 일

단계 1: 클라이언트 커넥션 수락

  • 커넥션을 맺고, 닫는 역할을 한다.
  • 역방향 DNS를 사용해서 클라이언트의 IP주소를 클라이언트의 호스트명으로 변환한다.
  • ident 프로토콜을 이용해 클라이언트 사용자를 알아낸다.

단계 2: 요청 메세지 수신

  • 요청 메세지의 요청줄을 파싱해 메서드, URI, 버전 번호를 찾고, 헤더와 본문을 읽어온다.
  • 몇몇 웹서버는 이를 내부의 자료구조에 저장한다
  • 고성능 웹 서버는 수천 개의 커넥션을 동시에 열 수 있도록 지원한다.
    1. 단일 스레드 웹 서버
      • 한 번에 하나씩 요청을 처리하는 서버
    2. 멀티 프로세스와 멀티 스레드 웹 서버
      • 여러 개의 프로세스 혹은 고효울 스레드를 할당하는 방식
      • 프로세스나 스레드가 늘어날수록 많은 리소스를 소비해야하므로 최대 개수에 제한을 둔다.
    3. 다중 I/O 서버
      • 비동기 I/O 작업을 사용하여 효율적으로 요청을 처리하는 방식
    4. 다중 멀티스레드 웹 서버
      • 멀티쓰레드와 다중화를 결합한 방식

단계 3: 요청 처리

웹서버가 메서드, 리소스 헤더, 본문 등을 이용해 실제 요청을 처리하는 단계

단계 4: 리소스의 매핑과 접근

  1. Docroot
    -> 웹 서버 파일 시스템의 특별한 폴더를 웹 콘텐츠를 위해 예약하는 방식. 가상호스팅과 사용자 홈 디렉터리 방식이 있다.
  2. 디렉터리 목록
  3. 동적 콘텐츠 리소스 매핑
    요청에 맞게 콘텐츠를 생성하는 프로그램에 URI를 매핑하는 것. 이런 역할을 하는 웹서버를 웹 애플리케이션 서버라고 칭하기도 한다.
  4. 서버사이드 인클루드
    -> 주로 HTML 파일 내에서 특정 코드나 명령어를 사용하여 다른 파일의 내용을 현재 파일에 삽입하거나, 서버의 정보를 웹 페이지에 동적으로 포함시킨다.
  5. 접근 제어
    -> 각각의 리소스에 접근 제어를 할당하는 방식

단계 5: 응답 만들기

  1. 응답 엔터티
    -> 응답 메시지에 본문이 있다면, Content-Type, Content-Length, 본문 내용을 함께 포함해서 전송한다.
  2. MIME 타입 결정
  3. 리다이렉션

단계 6: 응답 보내기

비 지속적인 커넥션이라면 모든 메세지를 전송했을 때 자신의 커넥션을 닫게 된다.

단계 7: 로깅

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

7 participants