파이썬-장고

웹 프로그래밍의 이해

threegopark 2021. 6. 21. 13:42
728x90

웹 프로그래밍

  • HTTP(S) 프로토콜로 통신하는 클라이언트서버를 개발하는 것
  • 클라이언트(IE, Chrome, FireFox,,,)가 요청하고 서버(네이버 서버,,,)가 응답하는 클라이언트 - 서버 프로그램 동작

 

다양한 웹 클라이언트

  • 웹 브라우저

    1. 웹 브라우저는 주소창에 입력된 문장을 해석하여 웹 서버에 HTTP 요청을 보내는 웹 클라이언트의 역할 수행
    2. 요청을 받은 www.example.com 도메인의 웹 서버는 그 결과를 웹 브라우저로 전송
    3. 웹 브라우저는 전송받은 결과를 사용자가 볼 수 있도록 HTML 텍스트 해석하여 출력
  • 리눅스 curl 명령
    HTTP/HTTPS/FTP 등 여러 가지의 프로토콜을 사용하여 데이터를 송수신할 수 있는 명령어
    curl 명령은 인자로 넘어온 URL로 HTTP 요청을 보내는 웹 클라이언트의 역할 수행

  • Telnet
    curl 명령과 비슷하게 터미널 창에서 입력하는 내용을 그대로 웹 서버에 전송

  • 직접 만든 클라이언트
    사용자가 직접 웹 클라이언트를 만들어 서버에 요청
    import urllib.request
    
    print(urllib.request.urlopen("http://www.example.com").read().decode('utf-8'))​

--> 웹 클라이언트의 형태는 달라도 동일한 요청에 대해서 동일한 응답을 받고, 반드시 웹 브라우저가 아니더라도 웹 클라이언트의 요청을 보낼 수 있다.

 

HTTP 프로토콜

  • 웹 서버와 클라이언트 사이에서 데이터를 주고받기 위해 사용하는 통신 방법
  • TCP/IP 프로토콜 위에서 동작 (즉, 서버와 클라이언트는 TCP/IP 동작에 필수적인 IP 주소를 가져야 한다.)
  • 하이퍼 텍스트 전송용 프로토콜 (HTML, XML, 이미지, 음성, 동영상, Js 등등 어떠한 형태의 데이터라도 전송 가능)

  • HTTP 메세지의 구조


    • 요청라인 - 요청 방식, 요청 URL, 프로토콜 버전으로 구성
    • 헤더 - KEY : VALUE 형식으로 표현, Host 헤더로 표시 가능
      GET /book/shakespeare HTTP/1.1
      방식/요청URL        /프로토콜 버전
      
      Host: www.example.com:8080
      Host 헤더​
       (요청라인과 헤더)
      아래와 같이 Host 헤더를 요청라인과 합칠 수 있음
      GET http://www.example.com:8080/book/shakespeare HTTP/1.1​
  • HTTP 처리 방식
    • HTTP 메소드를 통해서 서버에 전달
      • GET (리소스 취득, 지정한 URL의 정보를 가져오는 메소드)
      • POST (리소스 생성, 데이터 추가, 블로그에 글 등록하는 경우)
      • PUT (리소스 변경, 등록된 글 수정하는 경우)
      • DELETE (리소스 삭제)
      • HEAD (헤더 = 메타데이터 취득)
      • OPTIONS (리소스가 서포트하는 메타데이터 취득)
      • TRACE (루프백 시험에 사용)
      • CONNECT (프록시 동작의 터널 접속으로 변경)
  • GET / POST 메소드
    • GET - URL 부분의 ? 뒤에 "이름 = 값" 쌍으로 이여붙여 송신
      GET http://docs.django123.com/search/?q=form&release=1  HTTP/1.1​
    • POST - GET에서 URL에 포함시켰던 파라미터들을 바디에 넣어서 보냄 (은닉의 기능)
      POST http://docs.django123.com/search/ HTTP/1.1
      Content-Type: application/x-www-form-urlencoded
      
      q=forms&release=1
      GET 방식은 많은 양의 데이터를 보내기 어려움. (URL 길이제한 + 정보 노출)

 

URL 설계

http://www.example.com:80/services?category=2&kind=patents#n10
url스킴://호스트명 :포트번호/ 경로 ? 쿼리스트링          #프라그먼트
  • URL 구성요소
    • url스킴 - URL에 사용된 프로토콜 
    • 호스트명 - 웹 서버의 호스트명(도메인명 or IP 주소로 표현)
    • 포트번호 - 서버 내 서비스 포트번호
    • 경로 - 어플리케이션의 경로
    • 쿼리스트링 - 질의 문자열. &(앰퍼샌드)로 구분된 이름=값 쌍 형식으로 표현
    • 프라그먼트 - 문서 내의 앵커 등 조각 지정

  • URL을 바라보는 측면
    • URL은 웹 서버에 존재하는 애플리케이션에 대한 API이다.
    • RPC 
      • 클라이언트가 네트워크상에서 원격에 있는 서버가 제공하는 API 함수 호출
      • URL의 경로를 API 함수명으로, 쿼리 파라미터를 함수의 인자로 간주함
        http://blog.example.com/search?q=test&debug=true​
    • REST
      • 웹 서버에 존재하는 요소들을 모두 리소스라고 정의하고, URL을 통해 웹 서버의 특정 리소스를 표현한다는 개념
      • 리소스는 시간에 따라 상태가 변할 수 있으므로 클라이언트-서버 간 데이터 교환을 리소스 상태의 교환으로 간주함
      • HTTP 메소드로 리소스에 대한 조작 수행
        http://blog.example.com/search/test​

 

 

웹 애플리케이션 서버

 

  • 웹 서버는 웹 서버와 웹 애플리케이션 서버로 분류할 수 있다.

    구분 역할 프로그램 명
    웹 서버 웹 클라이언트의 요청 처리 및 응답
    주로 정적 페이지인 HTML, 이미지, CSS, Js 파일 처리
    Apache httpd, Nginx, lighttpd, IIS 등
    웹 애플리케이션 서버 웹 서버로부터 동적 페이지 요청을 받아 처리 및 결과를 웹 서버로 반환
    동적 페이지 생성을 위한 프로그램 실행과 데이터베이스 연동 기능 처리
    Apache Tomcat, JBoss, WebLogic, Jeus, Gunicorn 등
  • 정적 페이지 vs 동적 페이지
    • 정적 페이지 - 누가, 언제 요구하더라도 항상 같은 내용을 표시하는 웹 페이지, 동일한 리소스의 요청에 대해서 항상 동일한 내용의 페이지 반환
    • 동적 페이지 - 누가, 언제, 어떻게 요구하였는지에 따라 각각 다른 내용이 반환되는 웹 페이지, 페이지 요청 시점에 HTML 문장을 만들어냄

  • CGI 규격
    • 과거 정적 페이지에서 동적인 페이지에 대한 요구사항을 만족시키기 위해 마련된 별도의 프로그램과 웹 서버 사이에 정보를 주고받는 규칙을 정의한 것
    • 정식 프로그래밍 언어나 스크립트가 아니라, 웹 서버와 독립적인 프로그램(프로세스) 사이에 정보를 주고받는 규격

      전통적인 cgi 방식의 요청 처리
    • C, Python 등으로 만들어진 CGI 프로그램을 직접 호출하여 개별 프로세스를 생성하는 방식
    • 각각의 클라이언트 요청에 대하여 독립적인 별도의 프로세스가 생성되므로 요청이 많아질수록 프로세스가 많아진다. 즉, 메모리 요구량이 매우 커지므로 시스템 부하의 요인이 된다.

웹 서버와 CGI 의 변화과정

  • CGI 대안 기술
    • CGI 프로그램과 같은 역할을 하는 프로그램을 Perl, PHP 등의 스크립트 언어로 작성하고, 스크립트를 처리하는 스크립트 엔진 (인터프리터)을 웹 서버에 내장시켜 CGI의 단점이었던 별도의 프로세스를 기동시키는 오버헤드를 줄이는 방식
    • 애플리케이션을 처리하는 프로세스를 미리 데몬으로 기동시켜 놓은 후, 웹 서버의 요청을 데몬에서 처리하는 방식
  • 웹 애플리케이션 서버 방식
    • 웹 서버가 직접 프로그램을 호출하기보다는 웹 애플리케이션 서버를 통해서 간접적으로 웹 애플리케이션 프로그램을 실행함

 

'파이썬-장고' 카테고리의 다른 글

Django (4)  (0) 2021.07.11
Django (3)  (0) 2021.07.07
Django (2)  (0) 2021.07.07
Django (1)  (0) 2021.07.07
파이썬 웹 표준 라이브러리  (0) 2021.07.03