클라이언트 서버 모델

섬네일|250px|클라이언트가 인터넷을 통해 서버와 통신하는 컴퓨터 네트워크 다이어그램
**클라이언트-서버 모델**(client–server model)은 자원 또는 서비스 제공자(서버)와 서비스 요청자(클라이언트) 간에 태스크 또는 작업 부하를 분할하는 분산 애플리케이션 구조이다. 종종 클라이언트와 서버는 별도의 하드웨어에서 컴퓨터 망을 통해 통신하지만, 클라이언트와 서버 둘 다 동일한 장치에 있을 수도 있다. 서버 호스트 (네트워크)는 하나 이상의 서버 프로그램을 실행하며, 이들은 클라이언트와 자원을 공유한다. 클라이언트는 일반적으로 컴퓨팅 자원을 공유하지 않지만, 서버로부터 콘텐츠나 서비스를 요청하고 요청의 일부로 자신의 콘텐츠를 공유할 수도 있다. 따라서 클라이언트는 서버와 통신 세션을 시작하며, 서버는 들어오는 요청을 기다린다.
클라이언트-서버 모델을 사용하는 컴퓨터 애플리케이션의 예시로는 전자우편, 네트워크 프린팅, 그리고 월드 와이드 웹이 있다.

## 클라이언트 및 서버 역할
서버 구성 요소는 하나 또는 여러 클라이언트에게 기능 또는 서비스를 제공하며, 이 클라이언트들은 그러한 서비스에 대한 요청을 시작한다.
서버는 제공하는 서비스에 따라 분류된다. 예를 들어, 웹 서버는 웹 페이지를 제공하고 파일 서버는 컴퓨터 파일을 제공한다. 공유 자원은 컴퓨터 프로그램과 자료부터 마이크로프로세서와 저장 장치에 이르기까지 서버 컴퓨터의 소프트웨어 및 전자 구성 요소 중 하나일 수 있다. 서버의 자원 공유는 서비스를 구성한다.

컴퓨터가 클라이언트인지, 서버인지, 또는 둘 다인지는 서비스 기능을 요구하는 애플리케이션의 본질에 따라 결정된다. 예를 들어, 단일 컴퓨터는 동시에 웹 서버와 파일 서버 소프트웨어를 실행하여 다른 종류의 요청을 하는 클라이언트에게 다른 데이터를 제공할 수 있다. 클라이언트 소프트웨어는 동일한 컴퓨터 내의 서버 소프트웨어와도 통신할 수 있다. 데이터 동기화와 같은 서버 간 통신은 때때로 인터서버 또는 서버-투-서버 통신이라고 불린다.

## 클라이언트 및 서버 통신
일반적으로 서비스는 컴퓨터 자원의 추상화 (컴퓨터 과학)이며, 클라이언트는 서버가 요청을 이행하고 응답을 전달하는 동안 어떻게 작동하는지에 대해 걱정할 필요가 없다. 클라이언트는 관련 응용 프로토콜에 따라 응답을 이해하기만 하면 된다. 즉, 요청된 서비스에 대한 데이터의 내용과 형식만을 이해하면 된다.

클라이언트와 서버는 요청-응답 메시징 패턴으로 메시지를 교환한다. 클라이언트는 요청을 보내고 서버는 응답을 반환한다. 이러한 메시지 교환은 프로세스 간 통신의 한 예이다. 통신을 위해 컴퓨터는 공통 언어를 가져야 하며, 클라이언트와 서버 모두 무엇을 기대해야 하는지 알도록 규칙을 따라야 한다. 통신 언어와 규칙은 통신 프로토콜에 정의되어 있다. 모든 프로토콜은 응용 계층에서 작동한다. 응용 계층 프로토콜은 대화의 기본 패턴을 정의한다. 데이터 교환을 더욱 공식화하기 위해 서버는 응용 프로그래밍 인터페이스 (API)를 구현할 수 있다. API는 서비스에 접근하기 위한 추상화 계층이다. 통신을 특정 콘텐트 포맷으로 제한함으로써 구문 분석을 용이하게 한다. 접근을 추상화함으로써 교차 플랫폼 데이터 교환을 용이하게 한다.

서버는 짧은 시간 내에 여러 다른 클라이언트로부터 요청을 받을 수 있다. 컴퓨터는 특정 순간에 제한된 수의 태스크만 수행할 수 있으며, 클라이언트로부터 들어오는 요청을 처리하기 위해 스케줄링 (컴퓨팅) 시스템에 의존하여 우선순위를 정한다. 남용을 방지하고 가용성을 극대화하기 위해 서버 소프트웨어는 클라이언트에 대한 가용성을 제한할 수 있다. 서비스 거부 공격은 과도한 요청 속도로 서버를 과부하 시켜 요청을 처리해야 하는 서버의 의무를 악용하도록 설계된다.
민감한 정보가 클라이언트와 서버 간에 통신되어야 하는 경우 암호화를 적용해야 한다.

## 예시
은행 고객이 웹 브라우저 (클라이언트)를 사용하여 온라인 뱅킹 서비스에 접속할 때, 클라이언트는 은행의 웹 서버에 요청을 시작한다. 고객의 로그인 크리덴셜은 데이터베이스와 비교되며, 웹 서버는 해당 데이터베이스 서버에 클라이언트로서 접근한다. 웹 애플리케이션 서버는 은행의 비즈니스 로직을 적용하여 반환된 데이터를 해석하고 출력을 웹 서버에 제공한다. 마지막으로, 웹 서버는 결과를 클라이언트 웹 브라우저로 반환하여 표시한다.

클라이언트-서버 메시지 교환의 이 시퀀스 각 단계에서 컴퓨터는 요청을 처리하고 데이터를 반환한다. 이것이 요청-응답 메시징 패턴이다. 모든 요청이 충족되면 시퀀스가 완료된다.

이 예시는 클라이언트-서버 모델에 적용 가능한 디자인 패턴인 관심사 분리를 보여준다.

## 서버 사이드

서버 사이드는 서버에서 실행되는 프로그램과 작업을 의미한다. 이는 클라이언트에서 실행되는 클라이언트 사이드 프로그램 및 작업과 대조된다.

### 일반적인 개념
"서버 사이드 소프트웨어"는 웹 서버와 같이 원격 서버 하드웨어에서 실행되는 컴퓨터 애플리케이션을 의미하며, 사용자의 로컬 컴퓨터, 스마트폰 또는 기타 장치에서 접근할 수 있다. 작업은 클라이언트에서 사용할 수 없는 정보나 기능에 대한 접근이 필요하거나, 클라이언트 사이드에서 해당 작업을 수행하는 것이 느리거나 신뢰할 수 없거나 안전하지 않기 때문에 서버 사이드에서 수행될 수 있다.

클라이언트 및 서버 프로그램은 표준화된 프로토콜을 사용하여 서로 통신하는 무료 또는 상업용 웹 서버 및 웹 브라우저와 같이 일반적으로 사용 가능한 것일 수 있다. 또는, 프로그래머는 서로만 사용할 수 있는 자체 서버, 클라이언트 및 통신 프로토콜을 작성할 수 있다.

서버 사이드 작업에는 클라이언트 요청에 대한 응답으로 수행되는 작업과 유지 보수 작업과 같은 비클라이언트 지향 작업이 모두 포함된다.

### 컴퓨터 보안
컴퓨터 보안 컨텍스트에서 서버 사이드 취약성 또는 공격은 클라이언트 또는 사용자 시스템이 아닌 서버 컴퓨터 시스템에서 발생하거나, 중간자 공격을 통해 발생하는 것을 의미한다. 예를 들어, 공격자는 웹 애플리케이션의 SQL 삽입 취약점을 이용하여 서버의 데이터베이스에 있는 데이터를 악의적으로 변경하거나 무단으로 접근할 수 있다. 또는 공격자는 기본 운영체제의 취약점을 이용하여 서버 시스템에 침입한 다음, 서버의 승인된 관리자와 동일한 방식으로 데이터베이스 및 기타 파일에 접근할 수 있다.

### 예시
SETI@home 및 GIMPS와 같은 분산 컴퓨팅 프로젝트의 경우, 대부분의 작업은 클라이언트 측에서 이루어지지만, 서버는 클라이언트 조정, 분석할 데이터 전송, 결과 수신 및 저장, 프로젝트 관리자에게 보고 기능 제공 등을 담당한다. 구글 어스와 같은 인터넷 의존적인 사용자 애플리케이션의 경우, 지도 데이터 조회 및 표시는 클라이언트 측에서 이루어지지만, 서버는 지도 데이터의 영구 저장, 사용자 쿼리를 클라이언트에 반환될 지도 데이터로 해결하는 등을 담당한다.

웹 애플리케이션 및 웹 서비스는 거의 모든 언어로 구현될 수 있으며, 표준 기반 웹 브라우저 (중간 프로그램을 통해 가능)에 사용 가능한 형식으로 데이터를 반환할 수 있는 한 가능하다.

## 클라이언트 사이드

클라이언트 사이드는 컴퓨터 망에서 클라이언트에 의해 수행되는 작업을 의미한다.

### 일반적인 개념
일반적으로 클라이언트는 웹 브라우저와 같은 컴퓨터 애플리케이션으로, 사용자의 로컬 컴퓨터, 스마트폰 또는 기타 장치에서 실행되며 필요에 따라 서버에 연결된다. 작업은 클라이언트에서 사용할 수 있지만 서버에서는 사용할 수 없는 정보 또는 기능에 대한 접근이 필요하거나, 사용자가 작업을 관찰하거나 입력을 제공해야 하거나, 서버가 모든 클라이언트에 대해 적시에 작업을 수행할 처리 능력이 부족하기 때문에 클라이언트 측에서 수행될 수 있다. 또한, 네트워크를 통해 데이터를 보내지 않고 클라이언트가 작업을 수행할 수 있다면 시간이 덜 걸리고 대역폭 (컴퓨팅)을 덜 사용하며 컴퓨터 보안 위험이 줄어들 수 있다.

서버가 일반적으로 사용되는 방식으로 데이터를 제공하는 경우, 예를 들어 HTTP 또는 FTP와 같은 표준 프로토콜에 따라 제공하는 경우, 사용자는 여러 클라이언트 프로그램 중에서 선택할 수 있다 (예: 대부분의 최신 웹 브라우저는 HTTP와 FTP를 모두 사용하여 데이터를 요청하고 받을 수 있다). 더 전문화된 애플리케이션의 경우, 프로그래머는 서로만 사용할 수 있는 자체 서버, 클라이언트 및 통신 프로토콜을 작성할 수 있다.

네트워크를 통해 데이터를 보내거나 받지 않고 사용자 로컬 컴퓨터에서 실행되는 프로그램은 클라이언트로 간주되지 않으므로, 이러한 프로그램의 작업은 클라이언트 측 작업이라고 불리지 않는다.

### 컴퓨터 보안
컴퓨터 보안 컨텍스트에서 클라이언트 측 취약점 또는 공격은 서버 사이드가 아닌 클라이언트/사용자 컴퓨터 시스템에서 발생하거나, 중간자 공격을 통해 발생하는 것을 의미한다. 예를 들어, 서버에 사용자 컴퓨터 시스템에 있는 키로만 암호화를 해제할 수 있는 암호화된 파일이나 메시지가 포함되어 있다면, 클라이언트 측 공격은 공격자가 해독된 콘텐츠에 접근할 수 있는 유일한 기회가 될 것이다. 예를 들어, 공격자는 악성 소프트웨어를 클라이언트 시스템에 설치하여 사용자의 화면을 보거나, 사용자의 키 입력을 기록하고, 사용자의 암호화 키 복사본을 훔치는 등을 할 수 있다. 또는 공격자는 영구적인 악성 소프트웨어를 설치할 필요 없이 사이트 간 스크립팅 취약점을 이용하여 클라이언트 시스템에서 악성 코드를 실행할 수 있다.

### 예시
SETI@home 및 GIMPS와 같은 분산 컴퓨팅 프로젝트뿐만 아니라 구글 어스와 같은 인터넷 의존적인 애플리케이션은 주로 클라이언트 측 작업에 의존한다. 이들은 서버에 연결을 시작하고 (구글 어스와 같이 사용자 쿼리에 응답하여 또는 SETI@home과 같이 자동화된 방식으로) 일부 데이터를 요청한다. 서버는 데이터 세트를 선택하고 (서버 사이드 작업) 이를 클라이언트로 다시 보낸다. 그런 다음 클라이언트는 데이터를 분석하고 (클라이언트 측 작업), 분석이 완료되면 사용자에게 표시하고 (구글 어스와 같이) 및 계산 결과를 서버로 다시 전송한다 (SETI@home과 같이).

## 초기 역사
클라이언트-서버 아키텍처의 초기 형태는 최소한 OS/360 (1964년 발표)까지 거슬러 올라가는 원격 작업 입력으로, 요청은 작업을 실행하는 것이었고 응답은 출력물이었다.

1960년대와 1970년대에 클라이언트-서버 모델을 정립하면서 아파넷을 구축하던 컴퓨터 과학자들(SRI 인터내셔널)은 서버 호스트(또는 서빙 호스트)와 사용자 호스트(또는 유징 호스트)라는 용어를 사용했으며, 이 용어는 초기 문서인 RFC 5와 RFC 4에 나타난다. 이 사용법은 1970년대 중반 팰로앨토 연구소에서 계속되었다.

연구자들이 이 용어들을 사용한 한 가지 맥락은 Decode-Encode Language (DEL)라는 컴퓨터 네트워크 프로그래밍 언어의 설계였다. 이 언어의 목적은 한 컴퓨터(사용자 호스트)에서 명령을 받아 네트워크 패킷으로 명령을 인코딩하면서 사용자에게 상태 보고서를 반환하는 것이었다. 또 다른 DEL 가능 컴퓨터인 서버 호스트는 패킷을 수신하고 디코딩하여 형식화된 데이터를 사용자 호스트로 반환했다. 사용자 호스트의 DEL 프로그램은 결과를 받아 사용자에게 제시했다. 이것이 클라이언트-서버 트랜잭션이다. DEL 개발은 미국 국방부가 아파넷 (인터넷의 전신)을 설립한 해인 1969년에 막 시작되었다.

### 클라이언트 호스트 및 서버 호스트
클라이언트 호스트와 서버 호스트는 클라이언트와 서버와 미묘하게 다른 의미를 갖는다. 호스트는 네트워크에 연결된 모든 컴퓨터이다. 서버와 클라이언트라는 단어는 컴퓨터 또는 컴퓨터 프로그램을 지칭할 수 있지만, 서버 호스트와 클라이언트 호스트는 항상 컴퓨터를 지칭한다. 호스트는 다재다능한 다기능 컴퓨터이며, 클라이언트와 서버는 호스트에서 실행되는 프로그램일 뿐이다. 클라이언트-서버 모델에서 서버는 서비스를 제공하는 작업에 더 전념하는 경향이 있다.

클라이언트라는 단어의 초기 사용은 제록스 팰로앨토 연구소의 컴퓨터 과학자 하워드 스터지스, 제임스 미첼, 제이 이스라엘의 1978년 논문 "분산 파일 시스템에서 데이터와 기능을 분리하기"에 나타난다. 저자들은 독자들을 위해 용어를 신중하게 정의하고, 사용자와 사용자의 네트워크 노드(클라이언트)를 구별하기 위해 이 용어를 사용한다고 설명한다. 1992년까지 서버라는 단어는 일반적인 용어가 되었다.

## 중앙 집중식 컴퓨팅

클라이언트-서버 모델은 서버-호스트가 클라이언트-호스트보다 더 많은 자원을 가져야 한다고 규정하지 않는다. 오히려 어떤 범용 컴퓨터든 다른 호스트의 공유 자원을 사용하여 기능을 확장할 수 있도록 한다. 그러나 중앙 집중식 컴퓨팅은 소수의 컴퓨터에 많은 자원을 할당하는 것을 특별히 지칭한다. 클라이언트-호스트에서 중앙 컴퓨터로 더 많은 계산이 오프로드될수록 클라이언트-호스트는 더 단순해질 수 있다. 이는 계산 및 저장을 위해 네트워크 자원(서버 및 인프라)에 크게 의존한다. 디스크리스 노드는 운영체제조차 네트워크에서 로드하며, 단말기는 운영체제가 전혀 없다. 이는 서버에 대한 입출력 인터페이스일 뿐이다. 대조적으로, 개인용 컴퓨터와 같은 팻 클라이언트는 많은 자원을 가지고 있으며 필수 기능에 대해 서버에 의존하지 않는다.

마이크로컴퓨터의 가격이 하락하고 성능이 향상됨에 따라 1980년대부터 1990년대 후반까지 많은 조직은 메인프레임 및 미니컴퓨터와 같은 중앙 집중식 서버에서 팻 클라이언트로 계산을 전환했다. 이는 컴퓨터 자원에 대한 더 크고 개별화된 통제를 제공했지만, 정보 기술 관리를 복잡하게 만들었다. 2000년대 동안 웹 애플리케이션은 특정 마이크로아키텍처를 위해 개발된 응용 소프트웨어와 경쟁할 만큼 성숙해졌다. 이러한 성숙, 더 저렴해진 대용량 스토리지, 그리고 서비스 지향 아키텍처의 등장은 2010년대 클라우드 컴퓨팅 경향의 발생에 기여한 요인들 중 일부였다.

## 피어 투 피어 아키텍처와 비교
클라이언트-서버 모델 외에도 분산 컴퓨팅 애플리케이션은 종종 P2P (P2P) 애플리케이션 아키텍처를 사용한다.

클라이언트-서버 모델에서 서버는 종종 많은 클라이언트에게 서비스를 제공하는 중앙 집중식 시스템으로 작동하도록 설계된다. 서버의 컴퓨팅 파워, 메모리 및 스토리지 요구 사항은 예상되는 작업 부하에 맞게 적절히 확장되어야 한다. 부하분산 및 장애 극복 기능 시스템은 단일 물리적 머신을 넘어 서버를 확장하기 위해 종종 사용된다.

부하 분산은 서버 팜의 여러 서버에 네트워크 또는 애플리케이션 트래픽을 체계적이고 효율적으로 분배하는 것으로 정의된다. 각 부하 분산 장치는 클라이언트 장치와 백엔드 서버 사이에 위치하여 들어오는 요청을 수신한 다음 이를 처리할 수 있는 사용 가능한 서버로 분배한다.

P2P 네트워크에서는 둘 이상의 컴퓨터(피어)가 자원을 모으고 탈중앙화 시스템에서 통신한다. 피어는 비계층적 네트워크에서 동등하거나 동등한 노드이다. 클라이언트-서버 또는 클라이언트-큐-클라이언트 네트워크의 클라이언트와 달리 피어는 서로 직접 통신한다. P2P 네트워킹에서는 P2P 통신 프로토콜의 알고리즘이 부하를 분산하며, 심지어 자원이 적은 피어도 부하를 분산하는 데 도움이 될 수 있다. 노드를 사용할 수 없게 되면, 다른 피어가 해당 자원을 제공하는 한 공유 자원은 계속 사용할 수 있다. 이상적으로는 피어가 고가용성을 달성할 필요가 없다. 다른 중복 피어가 자원 다운타임을 보완하기 때문이다. 피어의 가용성 및 부하 용량이 변경되면 프로토콜은 요청을 다시 라우팅한다.

클라이언트-서버와 마스터-슬레이브는 모두 분산형 P2P 시스템의 하위 범주로 간주된다.

## 같이 보기

## 각주

분류:프로세스 간 통신
분류:네트워크 아키텍처
분류:응용 계층 프로토콜
분류:서버
분류:클라이언트 (컴퓨팅)