💡 이번에 배운 내용
- Section2.
서버와 통신이 가능한 구조적인 Web App을 만들 수 있다.- Unit7. HTTP/네트워크 기초: HTTP를 이용한 클라이언트, 서버 아키텍처와 네트워크 기초 지식을 학습한다.
많이 피곤하기도 했고 다소 어려운 개념이라 공부하는 데 오래 걸렸다. 양도 많았다. 중요한 것만 골랐는데도 키워드가 여느 때보다도 많다. 블로그로 정리하는데도 시간이 많이 걸렸다.
정보처리기사 필기시험 다시 보는 줄🫠
그래도 중요한 개념이라서 누구에게나 쉽게 설명할 수 있을 정도로 공부해야 한다는데 내 스스로 정리하고 요약하는 데도 쉽지가 않다. 정리한 내용들을 계속 읽어보고 좀 더 쉬운 말로 설명할 수 있도록 연습 또 연습이다!
클라이언트(client), 서버(server), 프로토콜(protocol), HTTP, HTTPS, API, URL, URI, IP, Port, 도메인(Domain), DNS, HTTP Messages, 요청, 응답, AJAX, fetch, SSR, CSR
클라이언트-서버 아키텍처를 이해할 수 있다.
HTTP를 이용한 클라이언트-서버 통신을 이해할 수 있다.
API의 개념을 이해할 수 있다.
클라이언트-서버 아키텍처(2 tier architecture)는 정보를 사용하는 앱인 클라이언트와 앱에서 필요한 정보를 제공하는 서버 구조로 통신하는 것을 말한다.
클라이언트와 서버는 요청과 응답을 주고 받는다.
서버(server)는 말 그대로 클라이언트에게 필요한 것을 제공하며 클라이언트(client)는 말 그대로 손님처럼 서버에게 필요한 것을 요청하고 제공받는다.
서버가 필요한 정보, 리소스를 별도로 데이터베이스에 보관하고, 저장한 정보를 데이터베이스와 주고받는다면 티어가 하나 늘어나 3 tier architecture라고도 한다.
클라이언트(보이는 영역)
브라우저의 웹사이트, 웹 앱, PC나 모바일에서 사용하는 앱 등이 해당된다.
이 영역을 주로 개발하는 개발자를 프론트엔드 개발자라고 한다.
서버(보이지 않는 영역)
파일을 제공하는 서버, 웹에서 필요한 정보를 제공하는 서버, 메일을 주고받을 수 있도록 도와주는 메일 서버 등이 있다. 데이터베이스도 데이터를 제공하므로 일종의 서버라고 할 수 있다.
이 영역을 주로 개발하는 개발자를 백엔드 개발자라고 한다.
클라이언트가 요청하면 서버는 응답을 보낸다. 이 때 마구잡이로 요청과 응답이 오가는 게 아니라 규칙이 필요하다. 이 규칙, 통신 규약을 프로토콜이라고 한다.
웹 앱에서는 클라이언트, 서버가 HTTP 라는 프로토콜을 사용한다. 이에 대해서는 곧 다음 챕터에서 다룰 예정이다.
(이 외에에도 여러 프로토콜이 있으며 이와 관련해 OSI 7계층이라는 모델이 있다.)
클라이언트가 서버에 요청할 때 어떤 리소스가 있고 어떻게 활용할 수 있는지 제공하는 인터페이스를 API라고 한다. 마치 메뉴판과도 같다.
API는 앱이 요청할 수 있고 프로그래밍이 가능한 인터페이스이다.
클라이언트가 서버에 올바른 요청을 하기 위해서 사전에 API를 (잘) 만들어놓아야 한다.
웹에서 정보나 리소스를 요청할 때는 HTTP프로토콜을 사용하며 API를 잘 활용해야 한다.
그러기 위해서는 URL, URI라는 개념과 HTTP 요청의 메서드에 대해 알아야 한다.
역할 | 메서드 |
---|---|
Create | POST |
Read | GET |
Update | PUT, PATCH |
Delete | DELETE |
참고: Javascript MDN - HTTP 요청 메서드
브라우저의 작동 원리, 통신에 대해 이해하기 위해서 필요한 중요한 개념에 대해 학습한다.
브라우저 주소창에 URL, URI를 입력하면 서버에서 파일의 위치를 나타낸다.
URL과 URI의 차이는 query, fragment가 있느냐 없느냐의 차이라고 볼 수 있다.
URL, URI의 형태는 아래와 같다.
file://127.0.0.1/Users/username/Desktop/
https://www.mysite.com/mypage?q=javascript#Ch1
부분 | 명칭 | 설명 |
---|---|---|
file:// https:// | scheme | 통신 프로토콜. file://를 사용하면 파일 탐색기 사용 |
127.0.0.1 www.mysite.com | hosts | 웹 페이지, 이미지, 동영상 등의 파일이 위치한 웹 서버, 도메인 또는 IP 127.0.0.1은 보통 로컬 서버이다. |
:80 :443 :3000 | port | 웹 서버에 접속하기 위한 통로. 80은 HTTTP, 443은 HTTPS, 3000은 로컬 |
/Users/username/Desktop/ /mypage | url-path | 웹 서버의 루트 디렉토리부터 파일 위치까지의 경로 |
q=JavaScript | query | ? 뒤에 오며, 웹 서버에 전달하는 추가 질문 |
#Ch1 | fragment | # 뒤에 오며, 페이지의 특정 HTML요소의 id로 스크롤이 된다. |
IP주소는 네트워크에 연결된 특정 PC, 서버의 주소를 나타내는 체계이다.
위에서 봤던 127.0.0.1
처럼 4부분의 숫자가 .
으로 연결되어 있다.
터미널을 열고, nslookup <url>
을 입력하면 입력한 url의 ip주소를 확인할 수 있다.
크게 2가지 종류가 있다.
.(dot)
으로 연결되어 있다.PORT는 IP 주소가 가리키는 PC에 접속할 수 있는 통로이다.
이미 사용 중인 포트는 중복해서 사용할 수 없다.
0~65535 까지의 포트 번호 중 0~1024번까지는 통신 규약에 따라 번호가 미리 정해져 있으며 주요 포트 번호는 아래와 같다.
그 외에 많이 사용하는 포트 번호로는 3000이 있다.
주요 포트는 URI에서 생략이 가능하나 http://localhost:3000
처럼 임시 포트는 반드시 포트 번호를 포함해야 한다.
도메인은 쉽게 알아볼 수 있도록 문자열로 되어있는 네트워크 주소이다.
네트워크에 연결된 특정 PC, 서버의 주소는 IP주소로 나타내지만, 이는 숫자로 되어 있어 기억하기가 어렵다. 때문에 IP주소 대신 쉽게 알아볼 수 있도록 도메인이 있다.
이렇게 도메인을 IP주소로, IP주소를 도메인으로 변환해주고 도메인 이름과 매칭된 IP주소를 확인해주는 시스템(일종의 서버)을 DNS(Domain Name System)이라고 한다.
크롬 브라우저를 사용하다 보면 흔히 발생할 수 있는 에러가 있는데,
그 에러 메시지와 내용은 미리 알아두면 문제 해결시 도움이 된다.
[표] 크롬(Chrome) 에러 메시지의 종류와 그 설명
Error Message | Description |
---|---|
"앗, 이런!" (Aw, Snap!) | 브라우저에서 페이지 로드시 문제 발생 |
ERR_NAME_NOT_RESOLVED | 호스트 이름(웹 주소)이 존재하지 않음 |
ERR_INTERNET_DISCONNECTED | 인터넷에 연결되지 않음 |
ERR_CONNECTION_TIMED_OUT ERR_TIMED_OUT | 페이지에 연결하는 데 시간이 너무 오래 걸림 (인터넷 연결이 너무 느리거나 접속한 사용자가 많을 경우 발생) |
ERR_CONNECTION_RESET | 웹페이지 연결을 방해하는 요소가 발생 |
ERR_NETWORK_CHANGED | 웹페이지 로드중 네트워크 연결이 해제되었거나 새로운 네트워크에 연결됨 |
ERR_CONNECTION_REFUSED | 웹페이지에서 브라우저의 연결이 허용되지 않음 |
ERR_CACHE_MISS | 웹페이지로부터 이전에 입력한 정보를 재요청 받음 |
ERR_EMPTY_RESPONSE | 웹페이지에서 데이터를 전혀 전송하지 않음 (데이터 전송 서버가 다운되었을 수 있음) |
ERR_SSL_PROTOCOL_ERROR | 전송된 데이터를 브라우저가 해석하지 못함 |
ERR_BAD_SSL_CLIENT_AUTH_CERT | 클라이언트 인증서에 오류가 발생, (은행 또는 회사 내부 웹사이트 등) 웹페이지에 로그인 불가 |
참고: 크롬 네트워크 에러 확인
HTTP(HyperText Transfer Protocol)는 웹 통신시 필요한 통신규약이다.
위에서 언급한 클라이언트-서버 아키텍처에서 클라이언트가 HTTP Messages 양식에 맞춰 요청을 보내면, 서버도 HTTP Messages 양식에 맞춰 응답한다.
클라이언트와 서버가 통신할 때 HTTP Messages 양식을 사용해 통신한다.
개발자가 HTTP Messages를 직접 작성할 필요는 없지만 어떤 통신인지 내용을 파악할 수 있다.
HTTP Messages의 가장 큰 특징은 상태가 없다는 것으로, 클라이언트에서 발생한 상태를 따로 저장하지 않는다. 이를 저장하기 위해서는 쿠키, 세션, API 등을 사용해야 하며 이는 추후 학습 예정이다.
HTTP Messages에는 유사한 구조를 가진 요청(Requests), 응답(Responses) 두 가지 유형이 있다.
참고 링크: MDN - HTTP 메시지
HTTP Messages의 유형 중 하나로 HTTP Requests는 클라이언트가 서버에게 보내는 메시지다.
요청에서의 각 구조의 요소와 설명은 다음과 같다.
Start line
POST / HTTP 1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
CONNECT developer.mozilla.org:80 HTTP/1.1
*
로 서버 전체를 표현.OPTIONS * HTTP/1.1
Headers
헤더 이름: 값
의 구조로 되어 있다.
헤더 이름은 대소문자 구분이 없는 문자열로, 값은 헤더에 따라 다르다.
헤더의 종류는 아래와 같다.
Body
HTTP messages의 마지막에 위치하며 모든 요청에 body가 필요하지는 않다.
body의 종류는 다음과 같다.
HTTP Messages의 유형 중 하나로 HTTP Requests는 서버가 클라이언트에게 보내는 메시지다.
응답에서의 각 구조의 요소와 설명은 다음과 같다.
Start line(Status line)
HTTP/1.1 404 Not Found
HTTP/1.1
404
Not Found
Headers
헤더 이름: 값
으로 요청과 형식, 종류는 동일하나 request headers 대신 response headers 가 있다.
Body
요청과 동일한 구조를 가진다. 특히 201, 204와 같은 상태 코드를 가질 경우 본문이 필요하지 않다. 요청과 마찬가지로 두 종류의 body가 있다.
AJAX는 비동기적으로 필요한 데이터를 불러오는 웹 개발 기법으로 JavaScript, DOM, Fetch, XMLHttpRequest, HTML 등을 사용한다.
AJAX 방식으로 웹 페이지를 새로고침하지 않고도 필요한 부분에 필요한 데이터만 비동기적으로 받아와 화면에 그려낼 수 있다.
그 예로 글자를 입력할 때마다 다른 정보를 보여주는 검색창, 무한 스크롤(정보 탐색시 페이지 하단에 스크롤 했을 때 추가정보를 불러옴) 등이 있다.
AJAX를 사용할 때 주로 JavaScript, DOM, Fetch 등을 사용한다.
fetch를 사용하면 비동기적으로 데이터를 받아올 수 있다. 즉 페이지를 이동하지 않고도 사용자가 현재 페이지에서 작업하는 동안 필요한 데이터만 받아올 수 있다.
이렇게 받아온 데이터는 DOM에 적용시켜 필요한 부분만 변경할 수 있다.
fetch는 웹 API로 JSON을 사용한다.
Fetch 이전에는 XHR을 사용했으나 Cross-Site 이슈 등의 이유로 잘 사용하지 않는다.
아래는 fetch, XHR을 사용한 예제이다.
//1. XMLHttpRequest를 사용
var xhr = new XMLHttpRequest();
xhr.open('get', 'http://www.myurl.com/example');
xhr.onreadystatechange = function(){
// readyState 4: 완료
if(xhr.readyState !== 4) return;
// status 200: 성공
if(xhr.status === 200) {
// 서버로부터 온 응답
console.log(xhr.responseText);
} else {
// 요청 도중 에러 발생
console.log('error: ' + xhr.status);
}
}
xhr.send(); // 요청 전송
//2. Fetch를 사용
fetch('http://www.myurl.com/example')
.then (function(response) {
return response.json();
})
.then(function (json) {
...
});
웹 페이지를 클라이언트, 서버 어디서 렌더링하느냐에 따라 SSR과 CSR로 나뉜다.
웹 개발에서는 대표적으로 웹 브라우저가 클라이언트이다.
웹 페이지를 서버에서 렌더링한다.
브라우저가 서버로 요청하면 서버는 데이터를 불러와 웹 페이지를 완전히 렌더링 된 페이지로 변환 후 브라우저에 응답을 보낸다.
만약 사용자가 웹 페이지의 다른 경로로 이동한다면 서버는 같은 작업을 다시 수행한다.
CSR은 SSR의 반대로 클라이언트에서 페이지를 렌더링한다.
브라우저가 서버로 요청하면 웹 페이지의 뼈대가 되는 페이지(단일 페이지-Single Page), 자바스크립트 파일로 브라우저에 응답을 보낸다.
응답을 받은 후 브라우저에서 이 단일 페이지, JS 파일로 웹 페이지를 렌더링한다. 필요한 데이터는 Fetch와 같은 API로 전달받는다.
만약 사용자가 웹 페이지의 다른 경로로 이동한다면 서버에서 다시 응답받지 않고 브라우저가 요청한 경로에 따라 페이지를 렌더링한다.
위에서 살펴봤듯이 주요 차이점은 페이지가 렌더링되는 위치, 다른 경로로 이동시 페이지의 새로고침 여부이다. 이 차이점으로 각각 다른 목적으로 활용된다.
1. OSI 7 계층
국제 표준화 기구(ISO)에서 통신의 표준화를 위해 규정한 표준 프로토콜(OSI: Open System Interconnection)을 의미한다.
상위계층 | 7계층 | 응용 계층 |
6계층 | 표현 계층 | |
5계층 | 세션 계층 | |
하위 계층 | 4계층 | 전송 계층 |
3계층 | 네트워크 계층 | |
2계층 | 데이터 링크 계층 | |
1계층 | 물리 계층 |
위 표에서 4계층 전송 계층, 7계층 응용 계층에서 학습했던 프로토콜이 속한다.
참고: 위키백과
2. 프록시 (서버)란
클라이언트와 서버 사이에서 대리로 통신을 수행하는 것을 Proxy라고 하며 이 프록시 기능을 하는 서버를 Proxy server 라고 한다.
설명 참고: 프록시 서버 - 위키백과
3. HTTP 응답 상태 코드의 종류
HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 코드로 알려준다. 응답 상태코드는 크게 5종류로 나뉜다.
정보 제공, 성공, 리다이렉트, 클라이언트 에러, 서버 에러.
종류 | 코드 | 메시지 |
---|---|---|
정보 | 100 | Continue |
성공 | 200 | Ok |
성공 | 200 | Created |
리다이렉트 | 302 | Found |
리다이렉트 | 304 | Not Modified |
클라이언트 에러 | 403 | Forbidden |
클라이언트 에러 | 404 | Not Found |
서버 에러 | 500 | Internal Server Error |
서버 에러 | 502 | Bad Gateway |
서버 에러 | 504 | Gateway Timeout |
참고 링크: MDN - HTTP 상태 코드