[취업반 스터디 1달 1주차]

Minseok Jo·2023년 10월 26일
post-thumbnail

[1달 1주차 주제 : 웹 서버에 대한 이해]


1. 웹서버 : 파일 요청과 응답

웹서버란?
파일을 전달하는 역할을 하는 소프트웨어이다.


  • 그렇다면 웹서버에게 어떻게 파일을 달라고 할까?
    : 웹 브라우저를 통해서 파일을 요청할 수 있다.
브라우저 화면
위에 보이는 URL이 웹 서버로 자료를 요청하는 링크이다



  • URL을 사용하는 데에는 규칙이 있다.
    [Protocol]://[Domain 이름 or IP주소]:[Port번호]/[파일경로]
    의 형태이다.

    이 형태 그대로 URL의 예를 들어보자면, http://192.168.00.00:80/test.txt 가 될 수 있다.



  • 만약 test.txt의 현재경로가 /home/student/testfile 이라면..?
    만일 현재 경로가 /home/student/testfile 로 구성된다면, 파일을 요청하는 URL 경로도 ~/home/student/testfile/test.txt 로 써주어야 하는 것일까? 결론부터 말하자면 아니다.

    이 경로는 웹 서버가 실행된 위치를 기준으로 하며, 이것을 웹 루트 경로라고 부른다.

    Web Root 경로
    : 해당 사이트의 index.html 이 위치하는 장소, 즉 해당 웹 서비스가 개시되는 홈디렉토리 경로를 의미한다.
    보통 root의 웹 서버 기본 경로로 /var/www/html 가 지정되어 있다.



그렇다면 한번 웹 서버를 실행하고, 브라우저를 통해 파일을 요청해보자.


  • 리눅스에서 웹 서버 실행
    리눅스에서 웹 서버를 실행하고자 한다면 python3 -m http.server 80 명령어를 사용할 수 있다.
    이는 80번 포트로 http 웹서버를 실행하겠다는 의미이다.
● 명령어를 이용하여 test.txt 가 있는 위치에서 웹 서버를 실행하였다.
○ python을 이용하여 웹 서버를 실행한 경우, 명령어를 실행한 위치가 웹 루트 경로가 된다.
● 따라서 파일은 현재 경로에 있으므로, ~/text.txt 로 요청할 수 있게 된다.


  • 웹 브라우저에서 파일 요청
URL에 링크 입력파일 응답 결과
URL형식에 맞춰 파일을 요청한다현재 경로에 위치한 test.txt 파일이 응답되었다




  • 이번에는 다른 디렉토리에 위치한 파일을 요청해보자.
명령어 입력생성된 디렉토리 구조
testfile 디렉토리를 만들어 test.txt 를 복사하였다생성된 디렉토리 구조는 다음과 같다


이 경우, 어떻게 URL을 입력하면 testfile 디렉토리 안에 있는 test.txt 를 요청할 수 있을까?
웹 서버를 실행한 위치가 웹루트 경로가 된다했으므로, 뒤에 test.txt의 절대경로만 추가해주면 된다.

URL에 링크 입력파일 응답 결과
복사한 test.txt가 위치한 경로를 입력한다복사된 test.txt 파일이 응답되었다



  • 웹 루트경로 추가 내용 1
    위에 생성된 구조에서 testfile 디렉토리에서 웹 서버를 실행시킨다면, 원본 test.txt에 접근할 수 있는 방법이 있을까? 그림으로 다시 쉽게 그려보자면 아래와 같은 구조가 될것이다.
testfile 디렉토리에서 웹서버 명령어 실행현재의 디렉토리 구조

리눅스를 사용해보았다면, 다음과 같이 상위 디렉토리를 의미하는 .. 를 넣어 생각할 수도 있다. http://127.0.0.1:80/../test.txt
하지만 이는 불가능하다.
웹서버를 실행한 위치가 루트 경로가 되므로, 웹 서버 입장에서는 이 루트 경로가 끝이 되어 넘어가지 못하게 된다.
즉, 그 상위에 있는 파일들은 요청할 수 없는 것이다.



  • 웹 루트경로 추가 내용 2
    만약 파일의 웹루트 경로가 실제 리눅스 시스템의 웹 루트경로라면 어떤 일이 발생할까?
    http://127.0.0.1:80/etc/passwd 이런식으로 모든 파일을 요청할 수 있게 된다. 즉, 모든 정보가 누구에게나 보여질 수 있다. 그래서 웹 서버가 어디에서 실행되는지 또한 중요하다.

2. 웹서버 : Port 번호와 index 페이지

위에서 URL 규칙을 이야기 하였다. 그런데, 흔히 사용하는 네이버의 주소를 보면 https://www.naver.com/ 으로, 규칙과는 다른 모습이다.
규칙에 의거하면 https는 프로토콜, www.naver.com은 도메인 이름인것으로 보이나, 포트번호와 요청하는 파일이 명시 되어있지 않다. 여기서 '웰논포트' 라는 것을 이야기해볼 수 있다.

웰 노운포트(Well-know Port)란?
특정한 쓰임새를 위해서 IANA에서 할당한 TCP 및 UDP 포트 번호의 일부이다.

http 프로토콜은 80번 포트로, https 프로토콜은 443번 포트로 띄우자고 약속이 되어있는 것이다.

따라서 위에서 test.txt파일을 요청할때에도 http://127.0.0.1:80/test.txt 와 같이 80번 포트라고 명시하였지만, 이를 명시하지 않고 http://127.0.0.1/test.txt 와 같이 URL을 입력하여도 파일을 요청할 수 있다. 이것이 가능한 이유는 포트 번호가 없다면, 브라우저가 http프로토콜은 80번이 약속되어 있기 때문에 80번 포트를 알아서 넣어주기 때문이다
(그러나 위에서와 달리 웹서버를 열때 포트번호를 80이 아닌 9999로 열었다면, URL에 포트 번호 9999를 명시해주어야만 한다)

따라서 Well-known 포트에 의거하여, 네이버에는 포트번호 443이 생략되었구나라는 것을 알 수 있다. https://www.naver.com:443/


그러나 아직도 규칙과는 달리 요청하는 파일이 명시되어 있지 않다. 이것 또한 약속으로 요청하는 파일이 명시되어 있지 않는 경우, 웹서버는 index 파일을 응답한다
파일을 명시하지 않고 요청을 보내면, 만들어둔 index.html이 요청된다

이 내용들을 토대로 아까의 네이버 주소를 다시 살펴보면
https://www.naver.com/ == http://www.naver.com:443/index.html
과 같은 형태인 것이다.


3. 정적 페이지와 동적 페이지

인터넷을 이용하면서 접속하게 되는 웹 페이지는 크게 2가지로 나뉜다.
누가 요청하든 같은 페이지를 제공해주는 정적 페이지와, 누가 요청하느냐에 따라 다르게 보이는 동적페이지가 있다.
그렇지만 사용자 입장에서는 서버에서 처리된 HTML로 이루어진 웹 페이지만 전달받게 된다.

1) 정적 웹 페이지

  • 웹 서버에 이미 저장된 html 문서를 클라이언트에게 전송하는 웹 페이지
  • 사용자는 서버에 저장된 데이터가 변경되지 않는 한 고정된 웹 페이지를 보게됨
  • 모든 사용자는 같은 결과의 웹 페이지를 서버에 요청하고 응답받음

장점:

  • 요청에 대한 파일만 전송하면 되므로 서버간 통신이 거의 없고 속도가 빠름
  • 단순한 문서들로만 이루어져 있어 어떤 호스팅 서버에서도 동작 가능

단점:

  • 저장된 정보만 보여주므로 서비스가 한정적

2) 동적 웹 페이지

  • 요청 정보를 처리한 후에 제작된 HTML 문서를 클라이언트에게 전송하는 웹 페이지
  • 사용자는 상황, 시간, 요청 등에 따라 달라지는 웹 페이지를 보게 됨
  • 같은 페이지라도 사용자마다 다른 결과의 웹 페이지를 서버에 요청하고 받을 수 있음

장점:

  • 다양한 정보를 조합하여 웹 페이지를 제공하기 때문에 서비스가 다양하다
  • 웹 사이트 구조에 따라 추가, 수정, 삭제를 사용자 측에서 가능

단점:

  • 사용자에게 웹 페이지를 전달하기 전에 처리하는 작업이 필요하므로 상대적으로 느림
  • 웹 서버 외에 추가적으로 처리를 위한 어플리케이션 서버가 필요

4. 웹 서버의 구조

웹 서버는 크게 3가지 부분으로 나누어져 있다. 흔히 3-tier 구성이라고 이야기 하는데 웹서버, WAS, DB로 이루어지는 구조이다.

1) 웹 서버 (Web Server)

  • 웹 브라우저(클라이언트)로부터 요청을 받아 정적인 컨텐츠(html, css, jpeg)를 처리하는 시스템
  • HTTP Request를 받아 HTTP Response를 주며, 이를 위해 JSP, 서블릿, ASP 등이 이용된다. 요청에 대한 단순 응답을 반환하는 간단한 구조이다.
  • 인터넷 발달 초기, 단순히 인터넷을 통한 문서 조회만 가능하던 시절의 HTTP 서버들은 주로 정적인 동작만 하는 Web Server 였다고 할 수 있다.

2) WAS (Web Application Server)

  • DB조회나 다양한 로직을 처리하는 동적인 컨텐츠를 처리하는 시스템
  • 웹 서버에 동적인 데이터를 이용하게끔 하는 Container를 엮으면 WAS가 된다.
  • 클라이언트가 동적 페이지를 요청하면 웹서버가 WAS에게 전달해주고, WAS가 동적페이지를 처리해 웹서버에게 주면 웹서버가 다시 클라이언트에게 전달한다.

3) DB (DataBase)

  • 데이터가 저장되는 서버

5. GET/POST 방식

클라이언트가 서버에 요청을 할 때 제공해야 하는 자원이 있는 경우, 요청을 보내는 메소드 방식으로 GET방식POST방식이 존재한다.

1) GET 방식클라이언트의 데이터를 URL뒤에 붙여서 보낸다.

http://localhost:3000/login?id=admin&pw=1234

이처럼 URL뒤에 ?를 통해 URL의 끝과 데이터 표현의 시작을 알리며 &를 붙여 여러개의 Parameter를 구분하게 된다.

특징

  • 데이터를 Header(헤더)에 포함하여 전송하므로, Bpdy 데이터를 설명하는 Content-Type이라는 헤더필드는 들어가지 않는다.
  • URL에 데이터를 실어 보내기 때문에 대용량 데이터 전송을 하기에 제한 사항이 있다
  • URL에 정보들이 그대로 노출되기 때문에 POST 방식보다 상대적으로 보안에 취약하다
  • 캐싱이 가능 ( Cashing: 한번 접근 후 또 요청할 시 빠르게 접근하기 위해 레지스터에 데이터를 저장시켜 놓는 것)
  • POST 방식보다 상대적으로 전송 속도가 빠름


2) POST 방식
POST 요청시 HTTP패킷의 헤더에는 Body 컨텐츠 타입을 명시하는 Context-Type 헤더 필드를 포함하고, 패킷의 Body에는 데이터를 담아 서버로 데이터가 전송된다.

http://localhost:3000/login

POST방식은 GET방식과 달리 데이터들이 URL에 표시되지 않으며, HTTP 패킷 Body에 담겨 서버로 데이터가 전송된다.

특징

  • 요청 헤더의 Context-Type에 컨텐츠 타입을 명시
  • 데이터들이 URL에 노출되지 않기 때문에 GET방식보다 상대적으로 보안적
  • 데이터들을 Body에 담기 때문에 서버로 보내는 데이터의 양은 제한이 없음
  • URL에 데이터가 노출되지 않으므로 캐싱 불가능

0개의 댓글