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 (프록시 동작의 터널 접속으로 변경)
- HTTP 메소드를 통해서 서버에 전달
- GET / POST 메소드
- GET - URL 부분의 ? 뒤에 "이름 = 값" 쌍으로 이여붙여 송신
GET http://docs.django123.com/search/?q=form&release=1 HTTP/1.1
- POST - GET에서 URL에 포함시켰던 파라미터들을 바디에 넣어서 보냄 (은닉의 기능)
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 프로그램과 같은 역할을 하는 프로그램을 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 |