원문 보기: https://dawoum.duckdns.org/wiki/Client%E2%80%93server_model
클라이언트–서버 모델은 자원 또는 서비스 제공자 (서버라고 함)와 서비스 요청자 (클라이언트라고 함) 사이에 작업 또는 워크로드를 분할하는 분산 응용 프로그램 구조입니다. 종종 클라이언트와 서버는 별도의 하드웨어에서 컴퓨터 네트워크를 통해 통신하지만, 클라이언트와 서버는 모두 같은 장치에 있을 수 있습니다. 서버 호스트는 하나 이상의 서버 프로그램을 실행하고, 클라이언트와 자원을 공유합니다. 클라이언트는 보통 자원을 공유하지 않지만, 서버에 컨텐츠나 서비스를 요청합니다. 따라서, 클라이언트는 들어오는 요청을 기다리는 서버와 통신 세션을 시작합니다. 클라이언트-서버 모델을 사용하는 컴퓨터 응용 프로그램의 예로는 이메일, 네트워크 인쇄, 및 월드 와이드 웹이 있습니다.
Client and server role
서버 구성 요소는 하나 이상의 클라이언트에게 기능이나 서비스를 제공하며, 클라이언트는 그러한 서비스에 대한 요청을 시작합니다. 서버는 제공하는 서비스에 따라 분류됩니다. 예를 들어, 웹 서버는 웹 페이지를 제공하고 파일 서버는 컴퓨터 파일을 제공합니다. 공유 자원은 프로그램과 데이터에서 프로세서와 저장 장치에 이르기까지 서버 컴퓨터의 소프트웨어와 전자 구성 요소 중 하나일 수 있습니다. 서버의 자원의 공유는 서비스를 구성합니다.
컴퓨터가 클라이언트인지, 서버인지, 아니면 둘 다인지는 서비스 기능을 필요로 하는 응용 프로그램의 본성에 따라 결정됩니다. 예를 들어, 단일 컴퓨터는 웹 서버와 파일 서버 소프트웨어를 동시에 실행하여 다양한 종류의 요청을 하는 클라이언트에 다양한 데이터를 제공할 수 있습니다. 클라이언트 소프트웨어는 역시 같은 컴퓨터 내의 서버 소프트웨어와 통신할 수 있습니다. 데이터 동기화와 같은 서버 사이의 통신은 때때로 서버-사이(inter-server) 통신 또는 서버-에서-서버(server-to-server) 통신이라고 합니다.
Client and server communication
일반적으로, 서비스는 컴퓨터 자원의 추상화이고 클라이언트는 요청을 이행하고 응답을 전달하는 동안 서버가 어떻게 수행되는지에 대해 걱정할 필요가 없습니다. 클라이언트는 관련 응용 프로그램 프로토콜, 즉 요청된 서비스에 대한 데이터의 컨텐츠와 형식에 따라 응답만 이해하면 됩니다.
클라이언트와 서버는 요청-응답 메시징 패턴으로 메시지를 교환합니다. 클라이언트는 요청을 보내고, 서버는 응답을 반환합니다. 이러한 메시지 교환은 프로세스-사이 통신의 한 예입니다. 통신을 위해, 컴퓨터는 공통 언어를 가져야 하고, 클라이언트와 서버 모두가 무엇을 기대해야 하는지 알 수 있도록 규칙을 따라야 합니다. 통신 언어와 규칙은 통신 프로토콜에 정의되어 있습니다. 모든 프로토콜은 응용 계층에서 작동합니다. 응용 계층 프로토콜은 대화의 기본 패턴을 정의합니다. 데이터 교환을 더욱 공식화하기 위해, 서버는 응용 프로그램 프로그래밍 인터페이스 (API)를 구현할 수 있습니다. API는 서비스에 접근하기 위한 추상화 계층입니다. 통신을 특정 컨텐츠 형식으로 제한함으로써, 구문 분석을 용이하게 합니다. 접근을 추상화함으로써, 플랫폼-사이 데이터 교환을 용이하게 합니다.
서버는 짧은 기간에 여러 개의 개별 클라이언트로부터 요청을 받을 수 있습니다. 컴퓨터는 한 번에 제한된 수의 작업만 수행할 수 있고, 클라이언트로부터 그것들에 들어오는 요청을 우선 순위를 정하여 수용하기 위해 스케줄링 시스템에 의존합니다. 남용을 방지하고 가용성을 최대화하기 위해, 서버 소프트웨어는 클라이언트의 가용성을 제한할 수 있습니다. 서비스 거부 공격은 과도한 요청 속도로 과부하를 일으켜 서버가 요청을 처리해야 하는 의무를 악용하도록 설계되었습니다. 클라이언트와 서버 사이에 민감한 정보를 전달하려면 암호화를 적용해야 합니다.
Example
은행 고객이 웹 브라우저 (클라이언트)로 온라인 뱅킹 서비스에 접속할 때, 클라이언트는 은행의 웹 서버에 요청을 시작합니다. 고객의 로그인 자격 증명은 데이터베이스에 저장될 수 있고, 웹 서버는 클라이언트로서 데이터베이스 서버에 접속합니다. 응용 프로그램 서버는 은행의 비즈니스 로직을 적용함으로써 반환된 데이터를 해석하고 출력을 웹 서버에 제공합니다. 마지막으로, 웹 서버는 결과를 클라이언트 웹 브라우저에 반환하여 표시합니다.
클라이언트-서버 메시지 교환의 이 순서열의 각 단계에서, 컴퓨터는 요청을 처리하고 데이터를 반환합니다. 이것이 요청-응답 메시징 패턴입니다. 모든 요청이 충족될 때, 순서열이 완료되고 웹 브라우저가 고객에게 데이터를 제공합니다.
이 예는 클라이언트-서버 모델에 적용 가능한 디자인 패턴, 즉 관심사 분리를 보여줍니다.
Server-side
서버-측은 서버에서 실행되는 프로그램과 연산을 말합니다. 이것은 클라이언트에서 실행되는 클라이언트-측 프로그램과 연산과 대조됩니다. (아래 참조)
General concepts
"서버-측 소프트웨어"는 사용자의 지역 컴퓨터, 스마트폰, 또는 기타 장치에서 접근할 수 있는 원격 서버 하드웨어에서 실행되는 웹 서버와 같은 컴퓨터 응용 프로그램을 말합니다. 연산은 클라이언트에서 사용할 수 없는 정보나 기능에 대한 접근이 필요하거나, 클라이언트 측에서 그러한 연산을 수행하는 것이 느리거나 신뢰할 수 없거나 안전하지 않기 때문에 서버-측에서 수행될 수 있습니다.
클라이언트 프로그램과 서버 프로그램은 자유 웹 서버 또는 상업용 웹 서버와 웹 브라우저와 같이 공통적으로 사용 가능한 프로그램일 수 있으며, 표준화된 프로토콜을 사용하여 서로 통신합니다. 또는, 프로그래머가 서로만 사용할 수 있는 자체 서버, 클라이언트, 및 통신 프로토콜을 작성할 수 있습니다.
서버-측 연산에는 클라이언트 요청에 대한 응답으로 수행되는 연산과 유지 관리 작업과 같은 클라이언트-지향이-아닌 연산이 모두 포함됩니다.
Computer security
컴퓨터 보안 맥락에서, 서버-측 취약성 또는 공격은 클라이언트 측이나 두 측 사이에 있는 것이 아니라 서버 컴퓨터 시스템에서 발생하는 취약성 또는 공격을 참조합니다. 예를 들어, 공격자는 웹 응용 프로그램의 SQL 주입 취약성을 악용하여 서버 데이터베이스에서 데이터를 악의적으로 변경하거나 무단으로 접근할 수 있습니다. 대안적으로, 공격자는 놓여있는 운영 시스템에서 취약성을 사용하여 서버 시스템에 침입하고 그런-다음 서버의 승인된 관리자와 같은 방식으로 데이터베이스 및 기타 파일에 접근할 수 있습니다.
Examples
SETI@home 및 Great Internet Mersenne Prime Search와 같은 분산 컴퓨팅 프로젝트의 경우에서, 대부분의 연산이 클라이언트 측에서 발생하고, 반면에 서버는 클라이언트를 조정하고, 분석을 위해 데이터를 보내고, 결과를 수신하고 저장하고, 프로젝트 관리자에게 보고 기능을 제공하는 등의 작업을 담당합니다. Google Earth와 같은 인터넷 기반 사용자 응용 프로그램의 경우에서, 맵 데이터의 질의와 표시는 클라이언트 측에서 수행되고, 반면에 서버는 맵 데이터의 영구 저장, 사용자 질의를 클라이언트에 반환할 맵 데이터로 변환하는 등의 작업을 담당합니다.
World Wide Web의 맥락에서, 공통적으로 사용되는 서버-측 컴퓨터 언어는 다음을 포함합니다:
어쨌든, 웹 응용 프로그램과 서비스는, 그것들이 표준-기반 웹 브라우저에 사용 가능한 형식으로 데이터를 반환할 수 있는 한 (아마도 중개 프로그램을 통해), 거의 모든 언어로 구현될 수 있습니다.
Client side
클라이언트-측은 컴퓨터 네트워크에서 클라이언트에 의해 수행되는 연산을 참조합니다.
General concepts
전형적으로, 클라이언트는 사용자의 지역 컴퓨터, 스마트폰, 또는 기타 장치에서 실행되고, 필요에 따라 서버에 연결되는 웹 브라우저와 같은 컴퓨터 응용 프로그램입니다. 연산은 클라이언트에서 사용할 수 있지만 서버에서는 사용할 수 없는 정보나 기능에 대한 접근이 필요하거나, 사용자가 연산을 관찰하거나 입력을 제공해야 하거나, 서버에 서비스를 제공하는 모든 클라이언트에 대해 적시에 작업을 수행할 처리 능력이 부족하기 때문에 클라이언트 측에서 수행될 수 있습니다. 추가적으로, 클라이언트가 네트워크를 통해 데이터를 전송하지 않고도 연산을 수행할 수 있으면, 시간이 덜 걸리고 대역폭을 덜 사용하며, 보안 위험이 덜할 수 있습니다.
서버가 공통적으로 사용되는 방식, 예를 들어 HTTP 또는 FTP와 같은 표준 프로토콜에 따라 데이터를 제공할 때, 사용자는 여러 클라이언트 프로그램을 선택할 수 있습니다 (예를 들어, 대부분의 현대 웹 브라우저는 HTTP와 FTP를 모두 사용하여 데이터를 요청하고 수신할 수 있습니다). 보다 전문화된 응용 프로그램의 경우에서, 프로그래머는 서로만 사용할 수 있는 자체 서버, 클라이언트, 및 통신 프로토콜을 작성할 수 있습니다.
네트워크를 통해 데이터를 보내거나 받지 않고 사용자의 지역 컴퓨터에서 실행되는 프로그램은 클라이언트로 고려되지 않고 따라서 그러한 프로그램의 연산을 클라이언트-측 연산이라고 부르지 않습니다.
Computer security
컴퓨터 보안 맥락에서, 클라이언트-측 취약성 또는 공격은 서버 측이나 두 가지 사이에 있는 것이 아니라 클라이언트 / 사용자의 컴퓨터 시스템에서 발생하는 취약성 또는 공격을 말합니다. 예제로, 서버에 사용자의 컴퓨터 시스템에 있는 키를 사용해야만 해독할 수 있는 암호화된 파일이나 메시지가 있으면, 클라이언트-측 공격은 통상적으로 공격자가 해독된 컨텐츠에 접근할 수 있는 유일한 기회가 됩니다. 예를 들어, 공격자는 클라이언트 시스템에 맬웨어를 설치하여, 공격자가 사용자 화면을 보고, 사용자의 키 입력을 기록하고, 사용자의 암호화 키 사본을 훔치는 등의 작업을 수행할 수 있습니다. 대안적으로, 공격자는 크로스-사이트 스크립팅 취약성을 사용하여 영구적으로 상주하는 맬웨어를 설치하지 않고도 클라이언트 시스템에서 악성 코드를 실행할 수 있습니다.
Examples
SETI@home 및 Great Internet Mersenne Prime Search와 같은 분산 컴퓨팅 프로젝트와 Google Earth와 같은 인터넷 종속 응용 프로그램은 주로 클라이언트-측 연산에 의존합니다. 그것들은 서버와 연결을 시작하고 (Google Earth의 경우처럼 사용자 질의에 대한 응답으로, 또는 SETI@home의 경우처럼 자동화된 방식으로) 일부 데이터를 요청합니다. 서버는 데이터 집합 (서버-측 연산)을 선택하고 클라이언트로 그것을 다시 보냅니다. 그런-다음 클라이언트는 데이터를 분석하고 (클라이언트-측 연산), 분석이 완료될 때, 사용자에게 그것을 표시 (Google Earth의 경우처럼) 및/또는 계산 결과를 서버로 다시 전송합니다 (SETI@home의 경우처럼).
World Wide Web의 문맥에서, 클라이언트 측에서 평가되거나 실행되는 공통적으로 접하는 컴퓨터 언어는 다음을 포함합니다:
Early history
클라이언트-서버 아키텍처의 초기 형태는 원격 작업 입력 방식으로, 적어도 OS/360 (1964년 발표) 이후로 사용되었으며, 여기서 요청은 작업을 실행하라는 것이었고, 응답은 출력이었습니다.
1960년대와 1970년대에 클라이언트-서버 모델을 공식화하는 동안, ARPANET (스탠포드 연구소)을 구축하던 컴퓨터 과학자들은 서버-호스트 (또는 서비스-호스트) 및 사용자-호스트 (또는 사용-호스트)라는 용어를 사용했고, 이것들은 초기 문서 RFC 5 및 RFC 4에 나타납니다. 이 용어는 1970년대 중반에 Xerox PARC에서 계속 사용되었습니다.
연구자들이 이들 용어를 사용한 한 가지 맥락은 Decode-Encode Language (DEL)라는 컴퓨터 네트워크 프로그래밍 언어의 설계였습니다. 이 언어의 목적은 한 컴퓨터 (사용자-호스트)에서 명령을 수신하여 네트워크 패킷에 명령을 인코딩하면서 사용자에게 상태 보고서를 반환하는 것이었습니다. DEL이 가능한 또 다른 컴퓨터인 서버 호스트는 패킷을 수신하여, 그것들을 디코딩하고, 그런-다음 포맷된 데이터를 사용자 호스트에 반환했습니다. 사용자-호스트의 DEL 프로그램은 사용자에게 제공할 결과를 수신했습니다. 이것은 클라이언트-서버 트랜잭션입니다. DEL의 개발은 미국 국방부가 ARPANET (인터넷의 전신)을 구축한 1969년에 시작되었습니다.
Client-host and server-host
클라이언트-호스트와 서버-호스트는 클라이언트와 서버보다 미묘하게 다른 의미를 가집니다. 호스트는 네트워크에 연결된 임의의 컴퓨터입니다. 서버와 클라이언트라는 단어는 컴퓨터나 컴퓨터 프로그램을 지칭할 수 있지만, 서버-호스트와 클라이언트-호스트는 항상 컴퓨터를 지칭합니다. 호스트는 다재다능하고, 다기능적인 컴퓨터입니다; 클라이언트와 서버는 호스트에서 실행되는 프로그램일 뿐입니다. 클라이언트-서버 모델에서, 서버는 서비스의 작업에 전념할 가능성이 더 큽니다.
클라이언트라는 단어의 초기 사용은 Xerox PARC 컴퓨터 과학자 Howard Sturgis, James Mitchell, 및 Jay Israel에 의한 1978년 논문 "Separating Data from Function in a Distributed File System"에서 나타납니다. 저자는 독자를 위해 용어를 정의하는 데 주의를 기울였고, 사용자와 사용자의 네트워크 노드 (클라이언트)를 구별하기 위해 사용한다고 설명합니다. 1992년까지, 서버라는 단어가 일반 용어로 자리 잡았습니다.
Centralized computing
클라이언트-서버 모델은 서버-호스트가 클라이언트-호스트보다 더 많은 자원을 가져야 한다고 규정하지 않습니다. 오히려, 그것은 임의의 일반적인-목적 컴퓨터에 다른 호스트의 공유 자원을 사용함으로써 그 기능을 확장하도록 활성화합니다. 중앙 집중형 컴퓨팅은, 어쨌든, 특히 많은 수의 자원을 소수의 컴퓨터에 할당합니다. 클라이언트-호스트에서 중앙 컴퓨터로 더 많은 계산이 오프로드될수록, 클라이언트-호스트가 더 단순해질 수 있습니다. 그것은 계산 및 저장을 위해 네트워크 자원 (서버와 인프라)에 크게 의존합니다. 디스크-없는 노드는 운영 시스템까지 네트워크에서 로드하고, 컴퓨터 단말기에는 운영 시스템이 전혀 없습니다; 그것은 서버에 대한 입력/출력 인터페이스일 뿐입니다. 반면에, 개인용 컴퓨터와 같은 리치 클라이언트는 많은 자원을 가지고 있고 필수 기능을 위해 서버에 의존하지 않습니다.
1980년대에서 1990년대 후반까지 마이크로컴퓨터의 가격이 하락하고 성능이 향상되면서, 많은 조직이 메인프레임과 미니컴퓨터와 같은 중앙 집중형 서버에서 리치 클라이언트로 컴퓨팅을 전환했습니다. 이로 인해 컴퓨터 자원에 대한 더 크고 개별화된 지배권이 제공되었지만, 정보 기술 관리가 복잡해졌습니다. 2000년대에 웹 응용 프로그램은 특정 마이크로 아키텍처를 위해 개발된 응용 프로그램 소프트웨어와 경쟁할 만큼 성숙해졌습니다. 이러한 성숙, 더 저렴한 대용량 저장 장치, 및 서비스-지향 아키텍처의 출현은 2010년대 클라우드 컴퓨팅 추세를 촉발한 요인 중 일부였습니다.
Comparison with peer-to-peer architecture
클라이언트-서버 모델 외에도, 분산 컴퓨팅 응용 프로그램은 종종 피어-투-피어 (P2P) 응용 프로그램 아키텍처를 사용합니다.
클라이언트-서버 모델에서, 서버는 종종 여러 클라이언트에게 서비스를 제공하는 중앙 집중화된 시스템으로 작동하도록 설계됩니다. 서버의 컴퓨팅 파워, 메모리, 및 저장 장치 요구 사항은 예상 작업 부하에 맞게 적절히 확장되어야 합니다. 로드-밸런싱 및 장애 조치 시스템은 종종 서버를 단일 물리적 기계를 넘어 확장하는 데 사용됩니다.
로드 밸런싱은 서버 농장에서 여러 서버에 걸쳐 네트워크 또는 응용 프로그램 트래픽을 체계적이고 효율적으로 분배하는 것으로 정의됩니다. 각 로드 밸런서는 클라이언트 장치와 백엔드 서버 사이에 위치하여, 들어오는 요청을 수신하고 그런-다음 이를 충족할 수 있는 사용 가능한 서버에 분배합니다.
피어-투-피어 네트워크에서, 두 대 이상의 컴퓨터 (피어)가 자원을 풀링하고 분산 시스템에서 통신합니다. 피어는 비-계층적 네트워크에서 동등한 노드입니다. 클라이언트-서버 또는 클라이언트-대기열-클라이언트 네트워크에서 클라이언트와 달리, 피어는 서로 직접 통신합니다. 피어-투-피어 네트워킹에서, 피어-투-피어 통신 프로토콜에서 알고리즘은 부하를 분산하고, 적당한 자원을 가진 피어조차도 부하를 공유하는 데 도움이 될 수 있습니다. 만약 노드를 사용할 수 없게 되더라도, 다른 피어가 제공하는 한 공유 자원은 계속 사용할 수 있습니다. 이상적으로, 피어는 다른, 중복 피어가 임의의 자원 다운타임을 메우기 때문에 고가용성을 달성할 필요가 없습니다; 피어의 가용성과 부하 용량이 변경될 때, 프로토콜이 요청을 다시 라우팅합니다.
클라이언트-서버와 마스터-슬레이브는 모두 분산 피어-투-피어 시스템의 하위-카테고리로 여겨집니다.