250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 자료구조
- 엔티티 그래프
- 스케줄링
- 연결리스트 종류
- 프로세스
- JVM
- posix
- 최소힙
- spring
- 연결리스트
- 완전이진트리
- SpringSecurity
- 알고리즘
- 최대 힙
- HTTP
- JPA
- Kruskal
- 힙트리
- MSA
- 백준장학금
- 이분탐색이란
- heapq
- 백준 장학금
- 멀티프로세서
- python
- 강화학습
- 운영체제
- 점근적 표기법
- jpa n+1 문제
- AVL트리
Archives
- Today
- Total
KKanging
[http 완벽 가이드] 5장 웹 서버 본문

이 내용은 http 완변 가이드란 책을 읽고 정리한 내용입니다.
더 자세한 내용이 궁금하시면 책을 직접 읽어보시는 걸 추천합니다.
5장 웹 서버
1. 다채로운 웹 서버
- 웹 서버라는 용어는 웹 서버 소프트웨어와 웹페이지 제공에 특화된 장비 양쪽 모두를 가리킨다.
- 웹서버는 HTTP 요청을 처리하고 응답을 제공한다.
1.1 웹 서버 구현
- 웹 서버란
- HTTP 및 그와 관련된 TCP처리를 구현
- 웹서버는 자신이 제공하는 리소스를 관리
- 웹서버를 설정, 통제 , 확장하기 위한 관리 기능을 제공한다.
- 웹서버는 TCP커넥션 관리에 대한 책임을 운영체제와 나눠 갖는다.
- 운영체제는?
- 컴퓨터 시스템의 하드웨어를 관리하고 TCP/IP 네트워크 지원
- 웹 리소스를 유지하기위한 파일시스템
- 현재 연산 활동을 제어하기 위한 프로세스 관리
- 웹서버는?
- 다목적 소프트웨어 웹 서버의 형태
- 임베디드 웹 서버의 형태
- 가 있다.
- 운영체제는?
1.2 다목적 소프트웨어 웹 서버
- 컴퓨터 프로그램에 설치하고 실행할 수 있는 다목적 소프트웨어인 웹서버
- 아파치나 W3C의 직소 같은 오픈 소스 소프트웨어도 있다.
- 마이크로소프트의 웹 서버 같은 상용 소프트웨어도 있다.
1.3 임베디드 웹 서버
- 임베디드 웹 서버는 일반 소비자용 제품에 내장될 목적으로 만들어진 작은 웹서버이다.
2. 간단한 펄 웹 서버
- 책에는 아주 간단한 펄로 웹서버를 구현한 예제가 있음
3. 진짜 웹 서버가 하는 일
- 커넥션을 맺는다 : 클라이언트의 접속을 받아들이거나, 원치 않는 클라이언트라면 닫는다.
- 요청을 받는다 : HTTP요청 메시지를 네트워크로부터 읽어 들인다.
- 요청에 처리한다: 요청 메시지를 해석하고 행동을 취한다.
- 리소스에 접근한다: 메시지에서 지정한 리소스에 접근한다.
- 응답을 만든다: 올바른 헤더를 포함한 HTTP 응답 메시지를 생성한다.
- 응답을 보낸다 : 응답을 클라이언트에게 돌려준다.
- 트랜잭션을 로그로 남긴다 : 로그파일에 트랜잭션 완료에 대한 기록을 남긴다.
4. 단계 1: 클라이언트 커넥션 수락
- 클라이언트는 이미 서버에 대해 열려있는 지속적 커넥션을 갖고 있다면, 클라이언트는 요청을 보내기 위해 커넥션을 사용할 수 있다.
- 그렇지 않으면 다시 커넥션을 연결해야함
4.1 새 커넥션 다루기
- 클라이언트가 TCP 커넥션을 맺고자 하면 서버는 맺고,
- TCP 커넥션에서 IP 주소를 추출하여 커넥션을 맺은 클라이언트가 어떤 클라이언트인지 확인한다.
- 만약 새 커넥션을 받아드리면 커넥션 목록에 추가하고 커넥션을 통해 응답을 받을 준비를 한다.
- 서버는 어떤 커넥션이든 거절하거나 즉시 닫을 수 있으며, 클라이언트의 IP나 호스트명이 인가되지 않거나 악의적이다 판달할 경유 커넥션을 직접 닫는다.
- 다른 시원 식별 기법 또한 사용할 수 있다.
4.2 클라이언트 호스트 명 식별
- 대부분의 웹서버는 클라이언트의 IP를 역방향 DNS를 통해 호스트명을 추출한다.
- 웹서버는 클라이언트의 호스트 명을 구체적인 접근 제어와 로깅을 위해 사용할 수 있다.
- 호스트명 룩업은 많은 시간이 소요될 수 있어서 대부분의 서버는 호스트명 룩업을 꺼두거나 특정 컨텐츠에서만 켜놓는다.
4.3 ident 를 통해 클라이언트 사용자 알아내기
- 서버는 IETF ident 프로토콜로 클라이언트를 식별하기도 한다.
- HTTP 커넥션을 맺으면(클라이언트 포트가 4235이라 가정)
- 서버는 113포트로 ident 커넥션을 맺는다 이에 4326,80 이라는 요청을 서버는 보낸다.
- 이에 응답줄에 클라이언트는 사용자가 누구인지 보낸다.
- 하지만 ident 커넥션은 조직 내부에서는 잘 사용할 수 있지만 공공 인터넷에서는 다음을 포함한 여러 이유로 잘 작동하지 않는다.
- 보안에 이유 트랜잭션 지연에 이유 방화벽이 ident 트래픽을 막는 등에 이유로 사용을 하지 않는다.
5. 단계 2: 요청 메시지 수신
- 커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성한다.
- 참고로 요청 본문이 있다면 읽지만 길이는 content-length헤더로 정의한다.
- 요청 메시지를 파싱할 때 웹서버는 입력 데이터를 네트워크로부터 불규칙적으로 받는다.
- 커넥션은 언제든지 무효화가 가능하다.
- 웹서버는 파싱해서 이해하는 것이 가능한 수준의 분량을 확보할 때까지 데이터를 네트워크로부터 읽어서 메시지 일부분을 메모리에 임시로 저장해 둘 필요가 있다.
5.1 메시지의 내부 표현
- 몇몇 웹 서버는 요청 메시지를 쉽게 다룰 수 있도록 내부의 자료 구조에 저장한다.
- 예) 헤더는 속도가 빠른 룩업 테이블에 저장되어 각 필드에 신속하게 접근할 수 있도록 할 수 있다.
5.2 커넥션 입력/출력 처리 아키텍처
- 고성능 웹서버는 수천 개의 커넥션을 동시에 열 수 있도록 지원한다.
- 웹 서버는 항상 언제라도 도착할 수 있는 새 요청을 주시해야한다.
- 웹서버는 아키텍처의 차이에 따라 요청을 처리하는 방식도 달라진다.
- 단일 스레드 웹서버
- 단일 스레드 웹 서버는 한 번에 하나씩 요청을 처리
- 트랜잭션이 완료 되면 다음 커넥션 처리
- 성능면에서 안좋다( 이유는 커넥션 한개가 처리 될동안 다른 커넥션은 처리가 안되기 때문
- 멀티프로세스와 멀티스레드 웹서버
- 멀티프로세스와 멀티스레드 웹서버는 여러 요청을 동시에 처리하기 위해 여러 개의 프로세스 혹은 고효율 스레드를 할당한다.
- 몇몇 서버는 이미 만들어질 수도 있고 매 커넥션마다 스레드와 프로세스를 할당 할 수도 있다.
- 하지만 서버가 수백 수천 심지어 수만 개의 동시 커넥션을 처리할 때 그로 인해 만들어진 수많은 프로세스나 스레드는 너무 많은 메모리나 시스템 리소스를 소비한다.
- 그래서 많은 멀티 스레드 웹 서비스가 스레드/프로세스의 최대 개수를 제한한다.
- 다중 I/O 서버
- 대량의 커넥션을 지원하기 위해, 많은 웹 서버는 다중 아키텍처를 채택했다.
- 다중 아키텍처에서는, 모든 커넥션은 동시에 그 활동을 감시당한다. 커넥션의 상태가 바뀌면(예: 데이터를 사용할 수 있게 되거나 에러가 발생), 그 커넥션에 대해 작은 양의 처리가 수행된다.
- 그 처리가 완료되면, 커넥션은 다음번 상태 변경을 위해 열린 커넥션 목록으로 돌아간다. 어떤 커넥션에 대해 작업을 수행하는 것은 그 커넥션에 실제로 해야 할 일이 있을 때 뿐이다.
- 스레드와 프로세스는 유휴 상태의 커넥션에 매여 기다리느라 리소스를 낭비하지 않는다.
- 다중 멀티스레드 웹 서버
- 몇몇 시스템은 자신의 컴퓨터 플랫폼에 올라와 있는 cpu 여러 개의 이점을 살리기 위해 멀티 스레딩과 다중화를 결합한다.
- 여러 개의 스레드는 각각 열려있는 커넥션을 감시하고 각 커넥션에 대해 조금씩 작업을 수행한다.
6. 단계 3: 요청 처리
- 웹 서버가 요청을 받으면, 서버는 요청으로부터 메서드, 리소스, 헤더 본문을 얻어내어 처리한다.
7. 단계 4: 리소스의 매핑과 접근
- 웹서버는 리소스 서버이다.
- 웹서버는 클라이언트 요청에 HTML, JPEG같은 이미 만들어진 파일이나 서버 위에서 동작하는 리소스 생성 애플리케이션을 통해 만들어진 동적 컨텐츠도 제공한다.
- 웹 서버가 클라이언트에 콘텐츠를 전달하기 위해 요청 메시지의 URI에 대응하는 알맞은 콘텐츠나 콘텐츠 생성기를 웹 서버에서 찾아서 그 콘텐츠의 원천을 식별해야 한다.
7.1 Docroot
- 리소스 매핑에 가장 단순한 형태로 URI 요청에 있는 리소스 위치와 동일하게 파일 이름을 사용하는 것
- 일반적으로 웹 서버는 파일 시스템의 특별한 폴더를 웹 콘텐츠를 위해 예약한다.
- 이 폴더를 문서 루트 혹은 Docroot라고 부른다.
- 요청 메시지에 있는 URL에 리소스 위치를 Docroot와 합친 위치에 리소스를 찾는다
- 하지만 Docroot를 사용할떄는 Docroot 외의 폴더에 접근하지 못하도록 해야한다.
- 가상 호스팅된 docroot
- 한 웹 서버는 다른 여러 개의 호스트를 가리킨다.
- 그래서 분리된 호스트에 각각 다른 docroot를 생성해서 두개의 사이트를 완전히 다른 콘테츠를 갖고 호스팅 되도록 할 수 있다.
- 사용자 홈 디렉터리 docroots
- docroot의 또 다른 대표적인 활용은, 사용자들이 한 대의 웹 서버에서 각자의 개인 웹 사이트를 만들게 해주는것이다.
- 보통 빗금과 물결표 다음에 사용자 이름이 오는 것으로 시작하는 URI는 그 사용자의 개인 문서 루트를 가리킨다.
7.2 디렉터리 목록
- 웹서버는 경로가 파일이 아닌 디렉터리를 가리키는, 디렉터리 URL에 대한 요청을 받을 수 있다.
- 디렉터리 요청을 받았을때 서버는 다음과 같은 행동을 취할 수 있다.
- 에러 반환
- 디렉터리 대신 특별한 색인 파일 반환
- 디렉터리를 탐색해서 그 내용을 담은 HTML페이지를 반환
- 디렉터리 요청을 받았을때 서버는 다음과 같은 행동을 취할 수 있다.
- 대부분의 웹서버는 요청한 URL에 대응되는 디렉터리 안에서 index.html 혹은 index.htm으로 이름 붙은 파일을 찾는다. → 만약 있다면 그 파일을 반환
- 아파치 웹서버에서는 DirectoryIndex 설정 지시자를 사용해서 기본 디렉터리 파일로 사용될 파일 이름의 집합을 설정할 수 있다.
- 만약 디렉터리 URL을 요청했을 때 기본 색인 파일이 없고 디렉터리 색인 기능이 꺼져 있다면 많은 웹 서버는 자동으로 그 디렉터리의 파일들을 크기, 변경일 및 그 파일에 대한 링크와 함께 열거한 HTML 파일을 반환한다.
- 하지만 일반적으로 발견할 수 없는 파일도 드러나게 된다는 단점이 있다.
7.3 동적 콘텐츠 리소스 매핑
- 웹 서버는 정적 콘텐츠 뿐만 아니라 동적 콘텐츠를 제공할 수 있다.
- 웹 서버는 흔히 복잡한 백앤드 애플리케이션과 연결하는 일을 한다.
- 즉 요청에 맞게 동적 콘텐츠를 생성하는 프로그램에 URI를 매핑하는것이다.
- 오늘날에 애플리케이션 서버는 자바 서블릿과 같은 한층 더 강력하고 효과적인 서버사이드 동적 콘텐츠 지원 기능을 갖고 있다.
7.4 서버사이드 인클루드(Server-Side Includes, SSI)
- 많은 웹 서버가 서버사이드 인클루드도 지원한다.
- 만약 어떤 리소스가 서버사이드 인클루드를 포함하고 있는 것으로 설정되어 있다면, 서버는 그 리소스의 콘텐츠를 클라이언트에게 보내기 전에 처리한다.
7.5 접근 제어
- 웹 서버는 접근 제어되는 리소스에 대한 요청이 돡할 때 웹 서버는 클라이언트의 IP 주소에 근거하여 접근을 제어할 수 있고 혹은 리소스에 접근하기 위한 비밀번호를 물어볼 수 있다.
8. 단계: 5 응답 만들기
- 한번 서버가 리소스를 식별하면, 서버는 요청 메서드로 서술되는 동작을 수행한 뒤 응답 메시지를 반환한다.
8.1 응답 엔터티
- 응답 본문을 포함하는 응답 메시지라면 주로 다음을 포함한다.
- 응답 본문의 MIME 타입을 서술하는 Content-Type 헤더
- 응답 본문의 길이를 서술하는 Content-Length 헤더
- 실제 응답 본문의 내용
8.2 MIME 타입 결정하기
- 웹 서버는 MIME 타입을 결정해야하는 책임이 있다.
- mime.types
- 엔터티 본문의 확장자를 이용
- 확장자별 MIME타입이 담겨 있는 파일을 탐색한다.
- 가장 흔한 방법
- 매직 타이핑
- 파일의 내용을 탐색함
- 알려진 패턴에 대한 테이블(매직 파일이라 부름)에 해당하는 패턴이 있는지 찾아 볼 수 있다.
- 표준 확장자 없이 이름 지어진 경우에 편하다. 하지만 느림
- 유형 명시
- 특정 파일이나 디렉터리 안의 파일들이 파일 확장자나 내용에 상관없이 어떤 MIME 타입을 갖도록 웹 서버를 설정할 수 있다.
- 유형 협상
- 어떤 웹 서버는 한 리소스가 여러 종류의 문서 형식에 속하도록 설정할 수 있다.
- 이때 웹 서버가 사용자와의 협상 과정을 통해 사용하기 가장 좋은 형식을 판별할 것인지의 여부도 설정 가능하다.
8.3 리다이렉션
- 웹 서버는 종종 성공 메시지 대신 리다이렉션 응답을 반환한다.
- 웹 서버는 요청을 수행하기 위해 브라우저가 다른 곳으로 가도록 리다이렉트 할 수 있다.
- 응답 코드는 3XX 상태코드이고 콘텐츠의 새로운 혹은 선호하는 위치에 대한 URI를 포함한다
- 리다이렉션이 유용한 경우
- 영구히 리소스가 옮겨진 경우
- 리소스가 새 URL이 부여되어 새로운 위치가 부여된 경우
- 임시로 리소스가 옮겨진 경우
- URL 증강
- 서버는 종종 문맥 정보를 포함시키기 위해 재 작성된 URL로 리다이렉트한다.
- 부하 균형
- 만약 과부하된 서버가 요청을 받으면, 서버는 클라이언트를 좀 걸 부하가 걸린 서버로 리다이렉트할 수 있다.
- 친밀한 다른 서버가 있을 때
- 웹 서버는 어떤 사용자에 대한 정보를 가질 수 있다.
- 서버는 그 클라이언트에 대한 정보를 갖고 있는 다른 서버로 리다이렉트할 수 있다.
- 디렉터리 이름 정규화
- 클라이언트가 디렉터리 이름에 대한 URL을 요청하는데 끝에 /을 빠트렸다면,
- 대부분의 웹 서버는 상대경로가 정상적으로 동작할 수 있도록 클라이언트를 슬래시를 추가한 URI로 리다이렉트한다.
- 영구히 리소스가 옮겨진 경우
9. 단계 6: 응답 보내기
- 웹 서버는 많은 커넥션을 가질 수 있는데 그중 일부는 아무것도 안하고 있는 상태이고, 일부는 서버로 데이터를 보내고 있으며, 또 다른 일부는 클라이언트로 돌려줄 응답 데이터를 실어 나르고 있을 것이다.
- 만약 비지속 커넥션이라면 메시지를 다보내고 끊을 것이고
- 지속 커넥션이라면 클라이언트가 응답이 언제 끝나는지 알 수 없는 경우에 커넥션은 열린상태를 유지 할 것이다.
10. 단계: 7 로깅
- 마지막으로 트랜잭션이 완료되었을 때 웹 서버는 트랜잭션이 어떻게 수행되었는지에 대한 로그를 로그파일에 기록한다. → 이는 21장에 다룬다.
'cs > http' 카테고리의 다른 글
[http 완벽 가이드] 7장 캐시 (0) | 2023.08.13 |
---|---|
[http 완벽 가이드] 6장 프락시 (0) | 2023.08.13 |
[http 완벽 가이드] 4장 커넥션 관리 (0) | 2023.07.28 |
[http 완벽 가이드] 3장 HTTP 메시지 (0) | 2023.07.28 |
[http 완벽 가이드] 2장 URL과 리소스 (0) | 2023.07.28 |