2018년 10월 17일 수요일

[파이썬 웹 프로그래밍] 웹 프로그래밍의 이해

   요약


   웹 프로그래밍이란?
웹 프로그램이란 기본적으로 클라이언트-서버로 이루어진다. 웹 클라이언트와 웹 서버는 통신 규약인 HTTP 프로토콜을 기준으로 정보를 주고 받는데, 웹 클라이언트는 요청하고 웹 서버는 응답하는 방식이다.

보통은 웹 브라우저가 웹 클라이언트로 사용되고, 우리는 주로 웹 프레임워크를 활용하여 웹 서버를 개발한다.

웹 클라이언트의 역할은 웹 서버로 요청을 보내는 것이기 때문에 웹 브라우저 외에도 다양하게 만들 수 있다.

웹 브라우저
웹 브라우저는 사용자가 주소창에 접속하고자 하는 웹 서버의 URL을 입력하면, 입력된 문장을 해석하여 웹 서버에게 HTTP 요청을 보낸다. 그럼 요청을 받은 웹 서버는 그 결과를 웹 브라우저로 전송하고, 웹 브라우저는 전송받은 결과를 사용자가 볼 수 있도록 HTML 텍스트를 해석하여 화면에 보여준다.

리눅스 curl 명령을 사용한 요청
curl 명령은 command line 용 data transfer tool 로써, download/update가 모두 가능하다. HTTP/HTTPS/FTP/LDAP/SCP/TELNET/SMT 등 여러 가지의 주요한 프로토콜을 지원하며 주요한 OS에서 구동되므로 여러 플랫폼와 OS에서 유용하게 사용할 수 있는 명령이다. 인자로 넘어온 URL로 HTTP 요청을 보낸다.

Telnet을 사용한 요청
텔넷은 자신이 사용권한을 가지고 있다는 전제하에 다른 사람의 호스트 컴퓨터를 원격지에서 액세스할 수 있도록 해주는 방법이다. 원격지 컴퓨터를 액세스하기 위한 사용자 명령들과 TCP/IP 기반의 프로토콜을 말한다. telnet 명령은 터미널 창에서 입력하는 내용을 그대로 웹 서버에 전송하기 때문에 URL을 통해 HTTP 요청을 보낼 수 있다.

물론 다양한 방법이 있지만, 어떤 방법을 사용하는지와 상관없이 웹 서버는 동일한 요청을 받을 경우 동일한 응답을 준다.


   HTTP 프로토콜
HTTP(Hypertext Transfer Protocol)은 웹 서버와 웹 클라이언트 사이에서 데이터를 주고받기 위해 사용하는 통신 방식으로, TCP/IP 프로토콜 위에서 동작한다. 즉, 웹을 이용하려면 웹 서버와 웹 클라이언트는 각각 TCP/IP 동작에 필수적인 IP 주소를 가져야 한다는 의미이다.


클라이언트인 웹 브라우저의 주소창에 URL을 입력하고 전송하면 다음과 같이 동작한다.


이 때, 요청과 응답은 HTTP 규정에 맞춘 메시지로 전달된다.


                                 

* 빈 줄은 헤더와 바디를 구분하는 구분자이다.

요청메시지
--------------------------------------------------------------------------------------------
GET /book/shakespeare HTTP/1.1  요청라인 [요청방식 요청URL 프로토콜 버전]
Host: www.example.com:8080      헤더 [이름: 값]
                                                    여러 줄도 가능하다.
--------------------------------------------------------------------------------------------

Host 항목은 필수로 표시해줘야 하는데, Host 헤더로 표현할 수도 있고, 요청라인의 URL에 Host를 표시하면 Host 헤더는 생략할 수 있다.

--------------------------------------------------------------------------------------------
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>
--------------------------------------------------------------------------------------------

**수정


많은 메소드가 있지만, 가장 많이 사용하는 메소드는 HTML의 폼을 지정할 수 있는 GET과 POST이다. 두 메소드는 사용자가 입력한 데이터를 받아 서버로 전달하여 폼을 지정하는데, 입력 데이터를 전달하는 방법이 각기 다르다. 예시를 살펴보자.

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 방식을 이용하면 많은 데이터를 보내기가 어렵다. 또한 전달되는 사용자의 데이터가 주소창에 노출되므로 보안 측면에서도 불리하다.
따라서 폼을 사용하거나 추가적인 파라미터를 서버로 보내는 경우에는 POST 방식을 사용하는 것이 좋다.

클라이언트가 서버에 요청한 것의 처리 결과는 응답 메시지의 상태라인에 있는 상태 코드를 보고 파악할 수 있다. 상태 코드는 세 자리 숫자로 되어 있고, 첫 번째 숫자는 HTTP 응답의 종류를 나타내고 나머지 두 숫자는 세부적인 으답 내용의 구분을 위한 번호이다.





   URL 설계





   웹 애플리케이션 서버






댓글 없음:

댓글 쓰기