IT 툴툴

[Django파이썬웹프로그래밍] 01 웹 프로그래밍의 이해 - 1.1~1.3

은듄 2021. 10. 27. 04:00
반응형

먼저

웹 프로그래밍이란,

'클라이언트-서버'로 이루어진다.

 

1장은 웹 클라이언트와 웹 서버, 통신규약인 HTTP 프로토콜, 주고받는 메시지 중에서 가장 중요한 URL,

웹 서버와 웹 어플리케이션 서버 간의 차이점과 각각의 특징을 알게됩니다.

 


1.1 웹 프로그래밍


웹 프로그래밍이란,

 

간단히 말하여 'HTTP(S) 프로토콜로 통신하는 클라이언트와 서버를 개발하는 것'

 

1) 웹 클라이언트와 웹 서버를 같이 개발

2) 웹 클라이언트 만 개발

3) 웹 서버 만 개발

 

보통은,

Django 같은 웹 프레임워크를 사용하여 3) 웹 서버 만 개발 하는 것을 떠올림.

 

아래는 웹 브라우져 ( 웹 클라이언트 )를 통하여 HTTP 프로토콜에 의거한 웹서버와의 통신을 그린 것!

1.1 웹서버 - 웹클라이언트 간 HTTP 통신

 

 


1.2 다양한 웹 클라이언트


1.2.1 웹 브라우져를 사용하여 요청

 

웹 브라우져에서 URL : http://www.example.com  결과 보기!

 

Example Domain

Example Domain This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission. More information...

www.example.com

 

1.2.2 리눅스 curl 명령을 사용하여 요청

 

리눅스 curl 명령은 HTTP/HTTPS/FTP 등 여러 가지 프로토콜을 사용하여 데이터를 송수신할 수 있는 명령이다.

 

shell prompt 에서 curl 명령을 입력한다!

 

Command  : $ curl http://www.naver.com 

 

네이버

네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요

www.naver.com

 

 

curl 명령은 인자로 넘어온 URL로 HTTP 요청을 보내는 웹 클라이언트의 역할을 수행한다.

 

1.2.2 윈도우 cmd 에서도 가능!

 

위 네이버 주소의 curl 명령 결과는 HTML 태그들로 보이는데, 

 

즉, 어떤 방법으로 호출하여도 웹 서버는 동일한 요청을 받을시 동일한 응답을 돌려준다!

 

 

1.2.3 Telnet을 사용하여 요청

 

리눅스의 telnet 프로그램을 사용하여 HTTP 요청도 가능하다!

 

$ telnet www.example.com  80

 

telnet 명령은 터미널 창에서 입력하는 내용을 그대로 웹 서버에 전송한다.

 

telnet 프로그램이 웹 클라이언트의 역할을 수행한다.

 

 

1.2.4 직접 만든 클라이언트로 요청

 

python 프로그램으로도 간단한 웹 클라이언트를 만들어 보겠다.

 

$ notepad example.py

> 결과 <

import urllib.request

print(urllib.request.urlopen("http://www.example.com").read().decode('utf-8'))

 

 

(직접 만드는 방법은 '2.2 웹 클라이언트 라이브러리' 에 나옴)

 

 


1.3 HTTP 프로토콜


HTTP(Hypertext Transfer Protocol)는 웹 서버아 웹 클라이언트 사이에서

 

데이터를 주고받기 위해 사용하는 통신 방식

 

TCP/IP 프로토콜 위에서 동작! -> IP가 필요!

 

HTTP는 HTML이나 XMl 과 같은 하이퍼텍스트 뿐만 아니라 영상, 이미지, 스크립트, PDF 같은 

 

컴퓨터에서 다룰 수 있는 데이터면 무엇이든 전송 가능하다.

 

 

1.3.1 HTTP 메시지의 구조

 

1.3.1 HTTP 메시지 구조

 

Start-line (요청메시지일때 : 요청라인 or 응답메시지일때 :상태라인)

Header (헤더는 생략 가능)

Blank Line (헤더의 끝을 빈 줄로 식별)

Body (바디는 생략 가능)

 

 

스타트라인에 이어 헤더는 줄바꿈 문자인 : CRLF(Carriage Return Line Feed) 가 있음

헤더와 바디는 빈 줄로 구분gka.

 

Body가 없는 요청메시지 예시

 


GET /book/shakespeare HTTP/1.1

Host: www.example.com:8080 


첫 번째 줄 : 요청라인 > '요청방식(method)-GET, 요청URL-/book/shakespeare, 프로토콜 버전-HTTP/1.1'으로 구성

두 번째 줄은 Header > '이름-Host : 값-www.example.com:8080

 

Host 항목은 필수이다.

Host를 요청URL에 넣어서

아래와 같이도 표시 가능.


GET http://www.example.com:8080/book/shakespeare HTTP/1.1


 

다음은 응답 메시지 예시


HTTP/1.1 200 OK

Content-Type: application/xhtml+xml; charset=utf-8

 

<html>

...

</html>


첫 번째 줄 : 상태라인 > '프로토콜 버전-HTTP/1.1, 상태코드-200, 상태 텍스트-OK'

두 번째 줄은 Header ~ HTML 포함

 

1.3.2 HTTP 처리 방식

 

HTTP 메소드를 통해서 클라이언트가 원하는 처리 방식을 서버에 알려준다.

총 8가지로 되어 있음.

1.3.2 HTTP method Type

GET, POST, PUT, DELETE 4개가 가장 많이 쓰임

CRUD와 매핑된다.

 

GET-Read (조회)

POST-Create (생성)

PUT-Update (변경)

DELETE-Delete (삭제)

 

** POST와 PUT 용도 구분은,

새롭게 생성한 리소스에 대한 URL 결정권이

서버 측에 있을 때 POST 사용.

클라이언트에 있을 때 PUT 사용.

 

예를 들어, 트위에 글 포스팅시 URL은 서버에서 결정하므로 POST 사용.

위키처럼 클라이언트가 결정한 타이틀이 그대로 URL이 되는 경우는 PUT 사용이 적합.

 

 

1.3.3 GET과 POST 메소드

 

실제 GET, POST 메소드가 가장 많이 쓰임.

HTML Form에서 지정할 수 있는 메소드가 둘 밖에 없는 이유가 가장 큼.

 

<GET 예시>

GET http://docs.djangoproject.com/search/?q=forms&release=1 HTTP/1.1

 

<POST 예시>

POST http://docs.djangoproject.com/search/ HTTP/1.1

Content-Type: application/x-www-form-urlencoded

 

q=forms&release=1

 

위와 같이 GET는 ? 물음표로 변수 이어 붙이기로 URL 길이 제한에 걸릴 수 있음

**보안에도 취약!

 

따라서,

폼을 사용하거나 추가적인 파라미터를 서버로 보내는 경우 GET보다 POST 방식을 선호

 

** 파이썬의 장고 프레임워크에서도 폼의 데이터는 POST 방식만을 사용하고 있다! **

 

위 단점들이 영향없을 경우만 GET 사용 무방

 

1.3.4 상태 코드

 

서버에서의 처리 결과는 응답 메시지의 상태라인에 있는 상태 코드를 보고 파악 가능

'200 OK'가 기본적인 정상 코드

 

코드는 별도 검색하여 참고 요망.

 

 

반응형