IT지식/나머지

[IT지식] 웹 프로그래밍과 HTTP 프로토콜 - 웹 클라이언트와 웹 서버

매 석 2022. 11. 1. 23:26
반응형

1. 웹 프로그래밍이란?

- 간단히 설명하자면, HTTP 프로토콜로 통신하는 클라이언트와 서버를 개발하는 것이다.

- 웹 클라이언트와 서버를 같이 개발할 수도 있고, 웹 클라이언트 또는 서버 하나만 개발할 수도 있다.

- 보통은 웹 서버를 개발하는 경우가 많아서 파이썬에서는 웹 프레임워크인 '장고'를 자주 사용한다.

 

출처 : 클라이언트와 서버의 통신 (velog.io)

- 웹 클라이언트 : 보통은 웹 브라우저가 사용되나, 개발자가 직접 개발 가능하다.

EX) 웹 브라우저를 사용하여 요청(네이버 등)

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

       Telnet을 사용하여 요청

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

 

- 웹 서버 : 주로 웹 프레임워크를 활용하여 웹 서버를 개발한다.

EX) 파이썬 - Django, Flask 등

 

- HTTP 프로토콜 : 클라이언트와 서버 사이에서 서로의 요청과 응답을 주는 역할을 한다.

 

2. HTTP 프로토콜

- HTTP는 웹 서버와 웹 클라이언트 사이에서 데이터를 주고받기 위해 사용하는 통신 방식으로,

  TCP/IP 프로토콜 위에서 작동한다.

  즉 우리가 웹을 사용하려면 웹 서버와 웹 클라이언트는 각각 TCP/IP 동작에 필수적인 IP 주소를 가져야 한다.

- HTTP는 하이퍼텍스트 전송용 프로토콜이지만, 실제로는 HTML이나 XML과 같은 하이퍼텍스트뿐만 아니라,

  이미지, 음성, 동영상, 자바스크립트, PDF와 각종 오피스 도큐먼트 파일 등을 데이터로 전송할 수 있다.

 

  (아래 사진은 HTTP 메시지의 구조이다.)

출처 : HTTP 기본 이론 정리 (velog.io)

EX)요청 메시지
GET /book/shakespeare HTTP/1.1 #요청방식, 요청URI, 프로토콜 버전
Host: example.com:8080 #이름 : 값
또는
GET http://example.com:8080/book/shakespeare HTTP/1.1 #HOST 헤더 생략

EX)응답 메시지
HTTP/1.1 200 OK #프로토콜 버전, 상태 코드, 상태 텍스트
Content-Type : application/xhtml+xml; charset=utf-8
<html>
.....
</html>

 

3. HTTP 처리 방식

 메소드명 의미 CRUD와 매핑되는 역할
GET 리소스 취득 Read(조회)
POST 리소스 생성, 리소스 데이터 추가 Create(생성)
PUT 리소스 변경 Update(변경)
DELETE 리소스 삭제 Delete(삭제)
HEAD 리소스의 헤더(메타데이터) 취득  
OPTIONS 리소스가 서포트하는 메소드 취득  
TRACE 루프백 시험에 사용  
CONNECT 프록시 동작의 터널 접속으로 변경  

 

- GET : 지정한 URI의 정보를 가져오는 메소드로, 웹 페이지, 이미지, 도영상 등을 가져온다고 할 때 요청한다.

- POST : 대표적인 기능은 리소스를 생성하는 것으로, 블로그에 글을 등록하는 경우가 이에 해당된다.

- PUT : 리소스를 변경하는데 사용된다. 예시로 블로그에서 글을 업로드한 작성자를 변경한 경우가 이에 해당된다.

- DELETE : 리소스를 삭제하는 메소드로 요청에 대한 응답은 바디가 없다.

 

+ GET과 POST 메소드

1. GET : 예시처럼 URI 부분의 ? 뒤에 키=값 쌍으로 이어붙여 보낸다.

EX) GET http://www.example.com/search/?q=forms&release=1 HTTP/1.1

 

2. POST : GET에서 URI에 포함시켰던 파라미터들을 바디에 넣는다.

EX) POST http://www.example.com/search/ HTTP/1.1  

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

 

       q=forms&release=1

- 이러한 차이로 GET에는 URI의 길이 제한으로 많은 데이터를 보내지 못하고, 보안 측면에서도 불리하다.

 

 

4. HTTP 상태 코드

 

출처 :&nbsp;HTTP #7 상태코드 (200,300,400,500) (tistory.com)

 

5. URL 설계

- 웹 애플리케이션을 개발할 때, 디자인 측면에서는 화면 UI를 설계하고, 프로그램 로직 측면에선 URL을 설계한다.

  즉 URL 설계는 웹 서버 로직 설계의 첫걸음이고, 사용자 또는 웹 클라이언트에게 웹 서버가 가진 기능을 명시해준다.

http://www.example.com:80/services?category=2&kid=patents#n10
URL스킴   호스트명  포트번호 경로      쿼리스트링         프리그먼트

- URL스킴 : URL에 사용된 프로토콜을 의미한다.

- 호스트명 : 웹 서버의 호스트명으로, 도메인명 또는 IP 주소로 표현한다.

- 포트번호 : 웹 서버 내의 서비스 포트번호이다. 생략 시에는 디폴트 포트번호로, http는 80, https는 443을 사용한다.

- 경로 : 파일이나 애플리케이션 경로를 의미한다.

- 쿼리스트링 : 질의 문자열로, 앰퍼샌드(&)로 구분된 키=값 쌍 형식으로 표현한다.

- 프리그먼트 : 문서 내의 앵커 등 조각을 지정한다.

 

6. URL을 바라보는 측면

- URL은 웹 클라이언트에서 호출한다는 시점에서 보면, 웹 서버에 존재하는 애플리케이션에 대한 API라고 할 수 있다.

  이러한 API의 명명 규칙을 정하는 방법을  RPC, REST 두 방식으로 분류할 수 있다.

 

- RPC : 클라이언트가 네트워크상에서 원격에 있는 서버가 제공하는 API 함수를 호출하는 방식이다.

EX) http://blog.example.com/search?q=test&debug=true

- REST : 웹 서버에 존재하는 요소들을 모두 리소스라고 정의하고, URL을 통해 웹 서버의 특정 리소스를 표현하는 것이다.

EX) http://blog.example.com/search/test

- 요즘에는 더 간편한 REST 방식을 자주 사용한다. 이런 식으로 간편하게 URL을 정의하기 위해 정규표현식도 사용한다.

  (정규표현식 내용은 아래 링크를 참조)

 

[IT지식]정규 표현식 - 기초 및 사용 예시

1. 정규 표현식이란? 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하

maeseok.tistory.com

 

7. 웹 애플리케이션 서버

- 웹 클라이언트(보통 웹 브라우저)의 요청을 받아서 처리하는 서버를 통칭하여 웹 서버라고 부르지만,

  좀 더 세분화하면 웹 서버와 웹 애플리케이션 서버로 분류할 수 있다.

 

구분 역할 프로그램명
웹 서버 웹 클라이언트의 요청을 받아서 요청을 처리하고,
그 결과를 웹 클라이언트에게 응답한다.
주로 정적 페이지인 HTML, 이미지, CSS, JS 파일을
웹 클라이언트에 제공할 때 웹 서버를 사용한다.
만약 동적 페이지 처리가 필요하면 웹 애플리케이션
서버에 처리를 넘긴다.
Apache httpd, Nginx, lighttpd, IIS 등
웹 애플리케이션 서버 웹 서버로부터 동적 페이지 요청을 받아서 요청을 처리하고, 그 결과를 웹 서버로 반환한다.
주로 동적 페이지 생성을 위한 프로그램 실행과
데이터베이스 연동 기능을 처리한다.
Apache Tomcat, JBoss, WebLogic, 
WebSphere, Jetty, Jeus 등

출처 : Django - 웹 서버 :: Edward Moon : Developer (tistory.com)

 

8. 정적 페이지 vs 동적 페이지

- 정적 페이지란 누가 언제 요구하더라도 항상 같은 내용을 표시하는 웹 페이지를 말한다.

  해당 웹 서비스의 제공자가 사전에 준비하여 서버 측에 배치한 것으로, 동일한 리소스의 요청에 대해서는

  항상 동일한 내용의 페이지를 반환한다.

 

- 동적 페이지란 동일한 리소스의 요청이라도 누가 언제 어떻게 요구했는지에 따라 각각 다른 내용이 반환되는 페이지다.

  예시로 현재 시각을 보여주는 페이지나 온라인 쇼핑 사이트에서 사용자마다 다른 카드 내용을 보여주는 페이지이다.

  즉 동적 페이지는 프로그래밍 코드가 포함되어 있어서 페이지 요청 시점에 HTML 문장을 만들어내는 것이다.

  이러한 별도의 프로그램과 웹 서버 사이에 정보를 주고받는 규칙을 정의한 것이 바로 CGI 규격이다.

 

9. CGI 방식

- CGI 자체는 정식 프로그래밍 언어나 스크립트가 아니라, 웹 서버와 독립적인 프로그램 사이에 정보를 

  주고받는 규격을 의미하며, 이 규격을 준수하면 어떤 언어를 사용해도 CGI 프로그램을 개발할 수 있다.

출처 :&nbsp;WAS(Web Application Server) 와 WEB SERVER 그리고 CGI :: hisLibrary (tistory.com)

- CGI 방식의 근본적인 문제는 각각의 클라이언트 요청에 대하여 독립적인 별도의 프로세스가 생성되는 것이다.

  즉 메모리 요구량도 커져서 시스템에 많은 부하를 주는 요인이 된다.

 

- 대안 기술 중 하나는 별도의 애플리케이션을 Perl, PHP 등의 스크립트 언어로 작성하고, 스크립트를 처리하는

  스크립트 엔진을 웹 서버에 내장시켜서 CGI 방식의 단점이었던 오버헤드를 줄이는 방식이다.

 

- 또 다른 방식은 애플리케이션을 처리하는 프로세스를 따라 미리 데몬으로 기동시켜 놓은 후, 웹 서버의 요청을

  데몬에서 처리하는 것이다.(JSP, ASP -> 애플리케이션 서버 방식을 사용)

 

10. 애플리케이션 서버 방식

- 애플리케이션 서버 방식은 웹 서버가 직접 프로그램을 호출하기보다는 웹 애플리케이션 서버를 통해서

  간접적으로 웹 애플리케이션 프로그램을 실행한다.

출처 :&nbsp;웹 애플리케이션 아키텍처의 특징 (velog.io)

- 이러듯 웹 서버와 애플리케이션 서버가 분리됨에 따라, 서로의 역할도 구분하여 사용하는 것이 좋다.

  정적 페이지와 동적 페이지를 처리하는 경우 서로 메모리 소비가 다르기에 역할을 분담하는 것이

  더욱 효율적으로 처리하여 더 많은 요청을 처리할 수 있다.

 

- 이 두 개의 서버를 동일한 하드웨어 박스에서 기동시키는 것도 충분히 가능하다.

  서비스 운용 관리 측면에서 하나의 하드웨어 박스에 구성하는 것이 좀 더 간편한 방식이다.

- 물론 하드웨어 박스를 분리하여 구성하면 메모리 효율을 더 높일 수 있다는 장점이 있다.

  이를 위해서는 해당 웹 사이트의 트래픽 중 정적 페이지와 동적 페이지 요청 건수 비율을 분석해야 한다.

 

- 대형 웹 사이트에서는 하드웨어 증설에 의해 웹 처리 용량을 높이는 작업이 용이하도록,

  웹 서버를 탑재하는 하드웨어 박스와 웹 애플리케이션 서버를 탑재하는 하드웨어 박스를 분리하여

  구성하는 것이 보통이다.