Client-Server Architcture
클라이언트 & 서버
리소스가 존재하는 서버와 리소스를 사용하는 앱을 분리한 것 (2-Tier Archiecture)
- 클라이언트 : 리소스를 사용하는 앱으로 (서버에) 리소스를 요청할 수 있음
- 서버 : 클라이언트의 요청에 따라 리소스를 제공하는 곳으로 요청이 선행되어야함
- 데이터베이스 : 리소스를 저장하는 공간을 따로 마련해두는 경우도 있음 (3-Tier Architecture)
일반적으로 서버는 리소스를 전달해주는 역할만 담당
클라이언트와 서버의 종류
클라이언트 : 플랫폼에 따른 구분
- 웹(Wab) 플랫폼 : 브라우저를 통해 주로 이용하는 웹에서의 클라이언트는 웹사이트 또는 웹 앱
- 스마트폰/태블릿 플랫폼 : iOS나 안드로이드와 같은 스마트폰/태블릿에서 이용하는 앱 (클라이언트)
- 데스크탑 플랫폼 : 윈도우와 같은 데스크탑에서 이용하는 앱 (클라이언트)
서버 : 무엇을 하느냐에 따른 구분
- 데이터베이스는 데이터 제공자로써 작동하므로 일종의 서버로 볼 수 있음
- 파일 서버 : 파일을 제공하는 앱
- 웹서버 : 웹사이트에서 필요로 하는 정보들을 제공하는 앱
- 메일서버 : 메일을 주고받을 수 있도록 도와주는 앱
HTTP를 이용한 클라이언트-서버 통신
- 클라이언트와 서버간의 통신 : 요청과 응답으로 구성
- 웹 어플리케이션 아키텍처 : 클라이언트와 서버는 HTTP라는 프로토콜을 이용해서 대화
- 프로토콜 : 통신규약으로 클라이언트가 서버에 요청을 할 때 지켜야 할 약속 (HTTP 메시지)
주요 프로토콜 (OSI 7 Layers)
1. 응용 계층
- HTTP : 웹에서 HTML, JSON 등의 정보를 주고 받는 프로토콜
- HTTPS : HTTP에서 보안이 강화된 프로토콜
- FTP : 파일 전송 프로토콜
- SMTP : 메일을 전송하기 위한 프로토콜
- SSH : CLI 환경의 원격 컴퓨터에 접속하기 위한 프로토콜
- RDP : Windows 계열의 원격 컴퓨터에 접속하기 위한 프로토콜
- WebSocket : 실시간 통신, Push 등을 지원하는 프로토콜
2. 전송계층
- TCP : HTTP, FTP 통신 등의 근간이 되는 인터넷 프로토콜
- UDP : 양방향의 TCP와 달리 단방향으로 작동하여 단순하고 빠르지만 신뢰성이 낮은 인터넷 프로토콜
API (Application Programming Interface)
- API : 서버에서 클라이언트에게 리소스를 활용할 수 있도록 제공해주는 인터페이스
Interface : 의사 소통이 가능하도록 만들어진 접점 - 클라이언트 측에서 서버에 요청을 보낼때 API를 통해 사용 가능한 자원을 파악할 수 있음
- HTTP API 디자인 : Best Practice가 존재하며 메소드 개념이 등장
- HTTP 요청 시 메소드를 지정하여 리소스와 관련된 행동 (CRUD : create, read, update, delete) 지정 가능
API Case Study : 커피주문 호스트 http://starbucks.com | |
요청 | URL 디자인 예제 |
아메리카노 한 잔 주세요 | /coffee/americano |
망고 프라푸치노 한 잔 주세요 | /frappuccino/mango |
콜드브루 두 잔 주세요 | /coffee/coldbrew?quantity=2 |
아메리카노 두 잔 전부 헤이즐럿 시럽 넣어주세요 | /coffee/americano?quantity=2&syrpu=hazelnet |
이런 옵션들을 파라미터라고 부르며 파라미터를 사용하기 위해 ?와 & 기호를 사용함 | |
서버는 리소스를 전달하는 메뉴판, 즉 API 문서를 작성해야 클라이언트가 이용할 수 있음 인터넷에 있는 데이터를 요청할땐 HTTP 프로토콜을 사용하며, 주소(URL, URI)를 통해 접근 할 수 있음 |
요청 (MDN 바로가기) | 적절한 메소드 |
조회 (Read) | GET |
추가 (Create) | POST |
갱신 (Update) | PUT 또는 PATCH |
삭제 (Delete) | DELETE |
URL & URI
# username에는 사용자 이름을 입력합니다.
# Ubuntu:
file://127.0.0.1/home/username/Desktop/
- URL (Uniform Resource Locator) : 네트워크 상에서 웹 페이지, 이미지, 동영상 등의 파일이 위치한 정보를 나타냄
scheme, hosts, url-path로 구분할 수 있음
url-path : 웹 서버에서 지정한 루트 디렉토리부터 시작하여 웹 페이지, 이미지, 동영상 등이 위치한 경로와 파일명을 나타냄
http://www.google.com:80/search?q=JavaScript
URI (Uniform Resource Identifier) : URL의 기본 요소인 scheme, hosts, url-path에 더해 query, bookmark 를 포함
*브라우저 검색창을 클릭하면 나타나는 주소로 URL을 포함하는 상위 개념
query : 웹서버에 보내는 추가적인 질문
부분 | 명칭 | 설명 |
file://, http://, https:// | scheme | 통신 프로토콜 |
127.0.0.1, www.google.com | hosts | 웹 페이지, 이미지, 동영상 등의 파일이 위치한 웹 서버, 도메인 또는 IP |
:80, :443, :3000 | port | 웹 서버에 접속하기 위한 통로 |
/search, /Users/username/Desktop | url-path | 웹 서버의 루트 디렉토리부터 웹 페이지, 이미지, 동영상 등 파일위치까지의 경로 |
q=JavaScript | query | 웹 서버에 전달하는 추가 질문 |
IP & Port
- IP (Internet Protocol address) : 네트워크에 연결된 특정 PC의 주소를 나타내는 체계
- IPv4 (Internet Protocol version4) : 네 덩이로 이루어진 IP 주소 체계 (IP 주소 체계의 네번째 버전)
localhost, 127.0.0.1 : 현재 사용중인 로컬 PC를 지칭
0.0.0.0, 255.255.255.255 : broadcast address, 로컬 네트워크에 접속된 모든 장치와 소통하는 주소 (모든 기기에서 서버에 접근 가능) - IPv6 : 개인 PC가 보급되면서 한계를 넘어선 IPv4를 보강하기 위해 만들어짐
- Port : IP 주소에 진입할 수 있는 정해진 통로
포트 번호는 0~65,535 까지 사용할 수 있으며, 0~1024번 까지의 포트 번호는 주요 통신을 위한 규약에 따라 이미 정해짐
반드시 알아야 할 잘 알려진 포트 번호 : 22 : SSH, 80 : HTTP, 443 : HTTPS - 이미 정해진 포트 번호라도, 필요에 따라 자유롭게 사용 가능하며, 잘 알려진 포트의 경우 URI 등에 명시하지 않지만, 그 외 잘 알려지지 않은 포트( :3000 과 같은 임시 포트)는 반드시 포함
도메인 & DNS
//IP 주소를 확인하는 명령어
nslookup naver.com
- 도메인 : 한 눈에 파악하기 힘든 IP 주소(지번 또는 도로명 주소)를 분명하게 나타낼 수 있음(해당 주소에 위치한 상호)
모든 IP주소가 도메인 이름을 가지진 않음 - DNS (Domain Name System) : 호스트의 도메인 이름을 IP주소로 변환하거나 반대의 경우를 수행 할 수 있도록 개발된 데이터베이스 시스템
브라우저의 검색창에 naver.com을 입력한다면 DNS에서 IP주소(125.209.222.142)를 찾아서 해당하는 웹 서버로 요청을 전당하여 클라이언트와 서버가 통신 할 수 있도록 해줌
크롬 브라우저 에러
HTTP(HyperText Transfer Protocol)
- HTTP : 웹 브라우저와 웹 서버의 소통을 위해 디자인한 웹 어플리케이션(Application Layer) 프로토콜
*HTTP 프로토콜 : 주소(URL, URI)를 통해 접근 가능 - HTTP의 특징: Stateless(무상태성), 비연결성(Connectionless)
*HTTP는 특정 상태를 담고 있지 않으며, 이전 요청이나 다음 요청을 기억하지 않음 - 클라이언트가 HTTP messages 양식으로 요청을 보내면, 서버도 HTTP messages 양식으로 응답
HTTP messages
- 클라이언트와 서버 사이에서 데이터가 교환되는 방식
- 텍스트 정보로 구성 : 구성 파일, API, 기타 인터페이스에서 HTTP messages를 자동으로 완성
- 요청(Requests)과 응답(Responses)의 구조
*start line과 HTTP headers를 묶어 요청이나 응답의 head라 하고, payload는 body라 함
1. start line
- 요청이나 응답의 상태를 나타내며, 항상 첫 번째 줄에 위치
- 응답에서는 status line이라고 부름
2. HTTP headers
- 요청을 지정하거나, 메시지에 포함된 본문을 설명하는 헤더의 집합
3. empty line
- 헤더와 본문을 구분하는 빈 줄이 있음
4. body
- 요청과 관련된 데이터나 응답과 관련된 데이터 또는 문서를 포함
- 요청과 응답의 유형에 따라 선택적으로 사용
요청(Requests)
- 클라이언트가 서버에 보내는 메시지
1. Start line
- 응답의 첫 줄
- 세 가지 요소가 존재 (HTTP method, 요청 컨텍스트, HTTP 버전)
1-1. HTTP method
- 수행할 작업(GET, PUT, POST 등)이나 방식(HEAD or OPTIONS)을 설명
- GET method : 리소스를 받아야 함
- POST method : 데이터를 서버로 전송
1-2. 요청 컨텍스트
- 요청 대상(일반적으로 URL이나 URI) 또는 프로토콜, 포트, 도메인의 절대 경로는 요청 컨텍스트에 작성
- 이 요청 형식은 HTTP method 마다 다름
- origin 형식
: ?와 쿼리 문자열이 붙는 절대 경로
: POST, GET, HEAD, OPTIONS 등의 method와 함께 사용
ex) POST / HTTP 1.1
ex) GET /background.png HTTP/1.0
ex) HEAD /test.html?query=alibaba HTTP/1.1
ex) OPTIONS /anypage.html HTTP/1.0 - absolute 형식
: 완전한 URL 형식으로, 프록시에 연결하는 경우 대부분 GET method와 함께 사용
ex) GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1 - authority 형식
: 도메인 이름과 포트 번호로 이루어진 URL의 authority component
: HTTP 터널을 구축하는 경우, CONNECT와 함께 사용 가능
ex) CONNECT developer.mozilla.org:80 HTTP/1.1 - asterisk 형식
: OPTIONS와 함께 별표 하나로 서버 전체를 표현
ex) OPTIONS * HTTP/1.1
- origin 형식
1-3. HTTP 버전
- HTTP 버전에 따라 HTTP message 구조가 달라짐
start line에 HTTP 버전을 함께 입력
2. Headers
- 대소문자 구분 없는 문자열과 콜론(:), 값을 입력
- 값은 헤더에 따라 다르며, 여러 종류의 헤더가 있음
General headers, Request headers, Entity headers
2-1. General headers
- 메시지 전체에 적용되는 헤더
body를 통해 전송되는 데이터와는 관련 없음
2-2. Request headers
- fetch를 통해 가져올 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더
- User-Agent, Accept-Type, Accept-Language과 같은 헤더는 요청을 보다 구체화함
- Referer처럼 컨텍스트를 제공하거나 If-None과 같이 조건에 따라 제약을 추가할 수 있음
2-3. Representation(Entity) headers
- body에 담긴 리소스 정보 (콘텐츠 길이, MIME 타입 등)를 포함하는 헤더
- Content-Length와 같은 헤더는 body에 적용
- body가 비어있는 경우, entity headers는 전송되지 않음
3. Body
- 요청의 본문은 HTTP messages 구조의 마지막에 위치하며 모든 요청에 body가 필요하지는 않음
*GET, HEAD, DELETE, OPTIONS처럼 서버에 리소스를 요청하는 경우에는 본문이 필요하지 않음 - POST나 PUT과 같은 일부 요청은 데이터를 업데이트하기 위해 사용
3-1. Single-resource bodies(단일-리소스 본문)
- 헤더 두 개(Content-Type과 Content-Length)로 정의된 단일 파일로 구성
3-2. Multiple-resource bodies(다중-리소스 본문)
- 여러 파트로 구성된 본문에서는 각 파트마다 다른 정보를 지님
- 보통 HTML form과 관련있음
응답(Responses)
1. Status line (응답의 첫 줄)
HTTP/1.1 404 Not Found.
1-1. 현재 프로토콜의 버전
- HTTP/1.1
1-2. 상태 코드
200번대 : 성공
300번대 : 리디렉션(다른 경로로 이동)
400번대 : 클라이언트 잘못
500번대 : 서버 잘못
- 요청의 결과를 나타냄
- 200, 302, 404 등
1-3. 상태 텍스트
- 상태 코드에 대한 설명
"200 OK"
"404 Not Found"
"403 Forbidden"
"500 Internal server Error"
*서버가 처리할 수 없는 요청의 경우 500번대 status code를 반환
2. Headers
- 응답에 들어가는 HTTP headers는 요청 헤더와 동일한 구조
- 대소문자 구분 없는 문자열과 콜론(:), 값을 입력
- 값은 헤더에 따라 다르며, 여러 종류의 헤더가 있음
2-1. General headers
- 메시지 전체에 적용되는 헤더로 body를 통해 전송되는 데이터와는 관련 없음
2-2. Response headers
- 위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 부가적인 정보를 갖는 헤더
- Vary, Accept-Ranges와 같이 상태 줄에 넣기에는 공간이 부족했던 추가 정보를 제공
2-3. Representation(Entity) headers
- body에 담긴 리소스 정보 (콘텐츠 길이, MIME 타입 등)를 포함하는 헤더
- Content-Length와 같은 헤더는 body에 적용
- body가 비어있는 경우, entity headers는 전송되지 않음
3. Body
- 응답의 본문은 HTTP messages 구조의 마지막에 위치
- 모든 응답에 body가 필요하지 않음
*201, 204와 같은 상태 코드를 가지는 응답에는 본문이 필요하지 않음
3-1. Single-resource bodies(단일-리소스 본문)
- 길이가 알려진 단일-리소스 본문은 두 개의 헤더(Content-Type, Content-Length)로 정의
- 길이를 모르는 단일 파일로 구성된 단일-리소스 본문은 Transfer-Encoding이 chunked 로 설정되어 있으며, 파일은 chunk로 나뉘어 인코딩되어 있음
3-2. Multiple-resource bodies(다중-리소스 본문)
- 서로 다른 정보를 담고 있는 body
Stateless
- 아무런 상태도 가지지 않음
HTTP로 클라이언트와 서버가 통신을 주고받는 과정에서 HTTP가 클라이언트나 서버의 상태를 확인하지 않음
HTTP는 통신규약일 뿐이므로, 상태를 저장하지 않고 필요에 따라 다른 방법(쿠키-세션, API)을 통해 상태를 확인할 수 있음
References
반응형
'CodeStates > Node.js' 카테고리의 다른 글
[Server] node.js를 이용한 서버 구현 (0) | 2022.04.04 |
---|---|
[Server] REST API & Postman (0) | 2022.04.04 |
[Server] 브라우저 작동원리 (0) | 2022.03.27 |
댓글