오늘
웹 애플리케이션을 보기 전 네이티브 애플리케이션Native-application
에 대해 보자.
네이티브 애플리케이션은 특정 기기에서 다운받아 사용하는 애플리케이션이다.
EX ) 핸드폰에 무언가를 다운받아 설치한다.
즉 Window나 Android OS, Apple iOS 같이 특정 실행환경에 종속되게 된다.
아이폰에 깔리는 어플이 안드로이드나 윈도우 같은 다른 환경에서는 실행시킬 수 없는 것처럼.
네이티브 애플리케이션의 장점 | 단점 |
---|---|
웹애플리케이션보다 빠르다 | 웹애플리케이션에 비해 개발비가 더 들어간다 (아이폰과 안드로이드 간의 멀티 플랫폼 개발 등). |
애플리케이션이 설치된 기기의 시스템/기기의 리소스에 접근이 용이.(GPS 기능이나 카메라) | 빠른 업데이트가 힘들다. |
인터넷 없이 사용 가능하다. | 앱스토어에 승인 받기가 힘들고 비용이 발생한다. |
웹애플리케이션에 비해 안전하다.(모바일의 경우 앱스토어에 승인을 받아야 함) |
추가설명
장점
단점
웹 애플리케이션
웹 애플리케이션은 웹 사이트에서 업그레이드...? 라고 할까
웹 사이트는 하이퍼텍스트 링크를 걸어 웹 페이지들을 모아 둔 것이였다. 아래 사진 참조.
옛날 사이트를 구경하고 싶다면? https://web.archive.org/
그래서 이런 웹 사이트에 사용자가 원하는 동작을 할 수 있게해주고, 사용자와 대화하는 식의 기능을 넣은 것을 웹 애플리케이션이라고 한다.
웹 애플리케이션은 웹 브라우저를 통해 접근이 가능한 애플리케이션이다.
정적인 웹사이트의 한계를 벗어나 다양한 동적인 응답을 웹 브라우저라는 소프트웨어를 통해 가능하게 한 애플리케이션.
아래 사진 참조.
이렇게 인스타그램처럼 상대방의 피드에 좋아요를 누르고, 댓글을 달고, 저장하는 등.
이런 기능들이 웹 애플리케이션 이라고 할 수 있겠다.
만약 인스타그램이 웹 사이트라고 한다면 사진도 링크를 타고 넘어가야 볼 수 있고, 댓글 또한 하이퍼텍스트를 누르면 링크를 타고 넘어가는 식으로 되겠지.
웹 애플리케이션의 장점 | 단점 |
---|---|
브라우저를 통해 실행되기 때문에 설치나 다운로드가 필요 없다. | 인터넷이 없으면 사용이 안된다. |
업데이트 등의 유지관리가 쉽다. | 네이티브 애플리케이션에 비해 속도가 느리다. |
네이티브 애플리케이션에 비해 만들기가 비교적 간편하다. | 애플리케이션 스토어에서 관리되지 않기 때문에 사용자 접근성이 떨어진다. |
애플리케이션 스토어 승인이 필요 없다. | 질적으로나 보안상 위험에 노출되기가 쉽다. |
추가설명
장점
단점
컴퓨터를 인터넷과 연결할 때 선만 꽃는다고 연결되지는 않을 것이다.
보통 LAN선을 공유기에 꽃고 그 공유기가 본인이 쓰는 통신사에 등록이 되어있다면 연결이 될 것이다.
LAN과 WAN은 두 개 다 네트워크를 연결해주지만 차이가 있다.
LAN(Local Area Network) 은 좁은 범위에서의 연결된 네트워크고 WAN(Wide Area Network) 은 넓은 범위에서 연결된 네트워크다.
프로토콜이란 어느 컴퓨터든 일관되게 네트워크를 사용할 수 있는 공통언어다.
만약 전자제품들의 전원코드가 다 다르다면? 아마 하나하나 새로 설치를 해야 할 것이다.
컴퓨터도 모두가 각기 다른 언어를 쓴다면 우리는 메모장에 저장이라도 해야겠지...
그래서 프로토콜이라는 공통언어를 쓰고, 헷갈리지 않게 하는 것.
만약 ㅁㅁ 도서관에 가고 싶다면 그 도서관의 위치를 알아야 갈 수 있을 것이다.
네트워크 상에서는 ㅁㅁ도서관에 근무하는 A사서의 컴퓨터에 접속하려면 A사서의 PC를 가르키는 주소를 알아야 한다.
네트워크에 연결된 특정 PC의 주소를 나타내는 체계를 IP address(Internet Protocol address) IP 주소 라고 한다.
IPv4란 Internet Protocol version 4 를 줄인말로, ip주소의 4번째 버전이라는 뜻이다.
위에 사진이 터미널에서 코드스테이츠 와 네이버의 IP주소다.
아래 사이트에 들어가면 본인 컴퓨터의 네트워크 접속 정보를 확인 할 수 있다.
https://ko.infobyip.com/
인터넷 보급률이 낮았던 초기에는 이 버전(IPv4, IP version 4)으로 네트워크에 연결된 PC에 주소를 할당하는 일이 가능했다. 그러나 개인 PC의 보급으로 전 세계의 누구나 PC를 이용해 인터넷에 접속하고, 각종 서비스를 위해 서버를 생산하면서 IPv4로 할당할 수 있는 PC가 한계를 넘어서게 되었고, 이를 위해 세상에 나오게 된 것이 IPv6(IP version 6) 이다. IPv6는 표기법을 달리 책정하여 2^(128)개의 IP 주소를 표현할 수 있다.
하지만 IPv6 가 등장하고 오랜 시간이 지났음에도 불구하고 이를 메인으로 사용하지 않는 이유는 아직도 IPv4가 사용 할만 하기 때문.
IPv4 주소는 OOO.OOO.OOO.OOO 의 형식으로 되어 있다.
10진수로 표기되어 있지만, 그 실체는 마침표로 구분된 4개의 8비트 필드(8자리 2진수 4개)로 되어있음.
IP 주소는 네트워크부와 호스트부로 나뉘는데, 네트워크부는 어떤 네트워크인지를 알 수 있는 정보이고, 호스트부는 그 네트워크 안의 특정 컴퓨터를 지칭하는 정보 이다.
IPv4 주소에서 네트워크부가 어디까지인지 나타내는 것이 서브넷 마스크이다.
IP 주소: 168.126.63.1
서브넷 마스크: 255.255.255.0
네트워크 주소: 168.126.63.0
브로드캐스트 주소: 168.126.63.255
TCP와 UDP는 IP 4계층 모델을 기준으로 상위에서 동작한다.
전송계층에 속하는 TCP와 UDP는 2계층에서 동작하는 IP 와 4계층에서 동작하는 애플리케이션(http 등)을 중개하는 역할을 담당.
TCP | UDP | |
---|---|---|
서비스타입 | 연결지향적 프로토콜 | 데이타그램 지향적 프로토콜 |
신뢰성 | 데이터 전송 표적 기기까지의 전송을 보장한다. | 표적 기기까지의 전송이 보장 되지 않는다. |
속도 | UDP와 비교했을 때 느리다. | TCP와 비교했을 때 빠르고, 단순하며 효율적인 속도. |
순서보장 | 순서가 보장 된다. | 순서가 보장 되지 않는다. |
웹애플리케이션에서 많이 사용하는 HTTP의 경우 모든 데이터를 제대로 송수신이 가능해야 하는 특성상, TCP를 사용한다.
TCP 3-way handshake 는 양 끝단의(end to end) 기기의 신뢰성 있는 데이터 통신을 위해, TCP 방식이 연결을 설정하는 방식
UDP 는 애플리케이션 개발자들이 많이 사용한다. 아래 같은 상황 때문.
UDP를 사용하면?
TCP와 UDP 둘 다 포트번호를 사용한다.
포트번호는 대상 IP 기기의 특정 어플리케이션(connection endpoint)을 특정하는 번호다.
자주 사용 되는 Well-known port
Port NO. | 프로토콜 name | Transport protocol | description |
---|---|---|---|
80 | HTTP | TCP | 웹서버 접속 |
443 | HTTPS | TCP | 웹서버 접속(ssl) |
110 | POP3 | TCP | 메일 읽기 |
25 | SMTP | TCP | 메일서버간 메일 전송 |
22 | SSH | TCP | 컴퓨터 원격 로그인 |
53 | DNS | UDP | DNS 질의 |
123 | NTP | TCP | 시간 동기화 |
URL(Uniform Resource Locator) 은 웹에 게시된 어떤 자원을 찾기 위한 브라우저에서 사용되는 메카니즘이다.
크롬 브라우저에 (window 사용자 기준)
file://localhost/C:\Users/username\Desktop\ 를 입력해보자.
username은 본인의 컴퓨터 계정 이름으로 변경해서 넣어줘야 한다.
그렇다면 본인의 컴퓨터 폴더로 들어가질 것이다.
URI는 Uniform Resource Identifier의 줄임말로, 일반적으로 URL의 기본 요소인 scheme, hosts, url-path에 더해 query, bookmark를 포함하고 있다. query는 웹 서버에 보내는 추가적인 질문.
http://www.google.com:80/search?q=Java
를 브라우저 검색창에 입력하면 구글에서 java를 검색한 결과가 나올 것이다.
브라우저의 검색창을 클릭하면 나타나는 주소가 URI이다. URI는 URL을 포함하는 상위개념. 따라서, 'URL은 URI다.' 는 참이고, 'URI는 URL이다.' 는 거짓.
부분 | 명칭 | 설명 |
---|---|---|
file:// , http:// , https:// | scheme | 통신 프로토콜 |
127.0.0.1, www.google.com | hosts | 웹 페이지, 이미지, 동영상 등의 파일이 위치한 웹 서버, 도메인 또는 IP |
:80, :443, :3000 | port | 웹 서버에 접속하기 위한 통로 |
/search, /Users/username/Desktop | url-path | 웹 서버의 루트 디렉토리로부터 웹 페이지, 이미지, 동영상 등의 파일이 위치까지의 경로 |
q=Java | query | 웹 서버에 전달하는 추가 질문 |
Domain name
출처 : 코드스테이츠 유어클래스
웹 브라우저를 통해 특정 사이트에 진입을 할 때, IP 주소를 대신하여 사용하는 주소가 있다. 만약 IP 주소가 지번 또는 도로명 주소라면, 도메인 이름은 해당 주소에 위치한 상호로 볼 수 있다.
여기에서 코드스테이츠의 IP주소는 3.35.107.186 이고, 도메인 이름은 codestates.com 이다.
그리고 주소창에 IP주소(3.35.107.186) 를 입력하면 코드스테이츠 창으로 이동할 수 있다.
출처 : https://server-talk.tistory.com/291
웹에서 제공되는 서비스는 주로 서비스를 이용하는 (클라이언트) 와 서비스 제공쪽(서버)으로 나뉜다. 이러한 구조를 클라이언트-서버 아키텍처라고 부른다.
웹 애플리케이션 아키텍처란? 애플리케이션 내부의 상호간에 소통하는지 설명하는 것.
우리가 웹사이트에 들어갈 때, 웹 애플리케이션은 이런식으로 작동한다는 것을 간단하게 그림으로 이해 할 수 있다.
보통 클라이언트는 사용자. 즉 컴퓨터를 이용하는 우리가 되겠다.
웹 애플리케이션은 인터넷에 공개되는 순간부터 글로벌 네트워크의 막대한 트래픽에 노출 될 수 있음.
https://naver.com로 접속한다고 생각해보자.
우리가 https://naver.com 이라고 입력하면 컴퓨터는 다음과 같은 흐름으로 동작한다.
모든 애플리케이션은 client-side와 server-side로 작동. 유저가 요청을 하면 크게 두 가지 프로그램이 작동함.
Client-side 는 주로 HTML, CSS, and JavaScript 의 언어를 조합해 사용하여 개발을 진행. 개발되는 코드는 브라우저에 의해 분석되어 처리됨. 그리고 서버와의 소통은 HTTP 요청을 통해 이루어짐.
Server-side 는 주로 Java, Python, JavaScript, C#, PHP, Ruby on Rails 등 서버사이드에서 실행 가능하고 HTTP 요청에 응답할 수 있는 언어들이 사용됨.
웹 애플리케이션의 구조는 다양하지만 크게 3단계로 볼 수 있다.
위 사진처럼 3단계로 나누어 지는 경우 Web Application Three Tier Architecture라고 부른다.
Single Page Application
웹 페이지에서 일부분만 바꾸고 싶다면?
Single Page Application 에서는 유저의 입력과 요청에 의한 콘텐츠나 정보의 최신화가 페이지를 새로 불러오지 않고 현재 페이지에서 이루어짐.
또, 필수적인 요소만을 요청함. 그리고 이러한 점은 페이지가 새로 고침 되는 것을 방지해 유저 경험을 극대화시킴.이러한 기능을 위해 AJAX, Asynchronous JavaScript, 그리고 XML 이 주로 사용된다.
Microservice architecture
작고 가벼운 특정한 한가지 기능에 집중한 웹 애플리케이션을 의미한다.
각 애플리케이션의 기능 요소들은 상호간에 의존적으로 설계되지 않는다. 따라서 개발단계에서도 그리고 개발 완성이후로도 같은 개발 언어를 사용할 필요가 없다.
Serverless Architectures
개발자가 웹 애플리케이션의 서버와 기타 기반 기능들에 대해 외부의 3자인 클라우드 서비스 제공자에게 의탁하는 방식.
SSR = Server Side Rendering
출처 : https://medium.com/walmartglobaltech/the-benefits-of-server-side-rendering-over-client-side-rendering-5d07ff2cefe8
렌더링이 서버에서 일어남.
서버는 즉시 렌더링 가능한 HTML파일을 만든다. HTML파일이 클라이언트에 전달되는 순간, 이미 렌더링 준비가 되어었기 때문에 HTML은 즉시 렌더링된다.
※ 하지만 Javascript가 읽히기 전이기 때문에 사이트 자체는 조작 불가능.
클라이언트가 javascfipt를 다운받는다. 다운 받아지고 있는 사이에 유저는 컨텐츠를 볼 수 있지만 사이트를 조작할 수 없다. 브라우저가 javascript프레임워크를 실행한다.
내가 조립식 컴퓨터를 사서 그쪽에서 조립을 다해서 보내주는 것. 완성본.
CSR = Client Side Rendering
출처 : https://medium.com/walmartglobaltech/the-benefits-of-server-side-rendering-over-client-side-rendering-5d07ff2cefe8
렌더링이 클라이언트 쪽에서 일어남.
서버는 요청을 받으면, 클라이언트에 HTML과 JS를 보내준다. 클라이언트는 그것을 받아 렌더링을 시작한다.
한마디로 내가 조립식 컴퓨터를 샀는데 그쪽에서 부품만 보내주고 내가 직접 조립을 해서 완성하는 방식인 것이다.
CSR / SSR 차이점
페이지가 렌더링되는 위치.
SSR은 서버에서 페이지를 렌더링. CSR은 브라우저에서(클라이언트) 페이지를 렌더링한다.
SEO란?
SEO(Search engine optimization) = 검색엔진 최적화
네이버나 구글에 키워드를 넣고 검색하면 대부분 상위 노출된 페이지를 먼저 클릭한다.
이때 검색엔진 결과 페이지에서 웹 사이트, 웹 페이지의 상위 노출도를 높이는 작업이 SEO다.
이런식으로 상위에 노출되게 해주는 것.
SSR은 언제쓰이는가?
SEO가 우선순위인 경우, 일반적으로 사용.
웹 페이지의 첫 화면 렌더링이 빠르게 필요한 경우에도, 단일 파일의 용량이 작은 SSR이 적합.
웹 페이지가 사용자와 상호작용이 적은 경우, SSR 을 활용할 수 있다.
CSR은 언제쓰이는가?
SEO 가 우선순위가 아닌 경우, CSR을 이용할 수 있다.
사이트에 풍부한 상호 작용이 있는 경우, CSR 은 빠른 라우팅으로 강력한 사용자 경험을 제공함.
웹 애플리케이션을 제작하는 경우, CSR을 이용해 더 나은 사용자 경험(빠른 동적 렌더링 등)을 제공할 수 있다.
-단점
느린 렌더링 속도로 사용자 경험이 안 좋아 질 수 있음. 모든 렌더링의 부하가 클라이언트 쪽에 집중되기 때문에 사용자에 따라서 경험이 달라질 수 있다.
위에서 설명했듯 search engine bots 와 상성이 안좋다. Javascript가 렌더링해야 하는 정보들은 Google 과 같은 search engine index에 포함이 안될 가능성이 매우 높다.
네이버 블로그
네이버 공식블로그의 네트워크 탭을 보면 html 파일에 제목이 똑같이 담긴 것을 볼 수 있다.
따라서 구글, 네이버 같은 검색엔진 크롤러가 html에 접근하여 쉽게 내용을 가져 갈 수 있다.
블로그 같은 경우는 특히 검색엔진에 최대한 노출되는 게 유리하고, 다른 웹사이트에 비해 사용자와 상호작용이 많지 않기 때문에 SSR이 합리적인 선택으로 보인다.
아고다
HTML이 빈 페이지이기 때문에 검색엔진 최적화(SEO)를 하기에는 SSR에 불리하다.
구글에서 이러한 부분을 보완하기 위해 삽입된 자바스크립트 코드를 분석, 실행시켜 크롤링을 하고 있다.
SSR에서는 서버에서 렌더링을 해야 하기 때문에 상호작용(interaction)이 많아질수록 서버에 부담이 많은 반면, CSR에서는 서버가 클라이언트에 필요한 데이터만 넘겨주기 때문에 부담이 적다. 그리고 SPA(Single Page Application)를 기반으로 화면의 일부만 받아온 데이터로 변경해 주기 때문에 빠른 렌더링으로 User Experience(사용자 경험)에 유리하다.
CORS란 프로토콜, 도메인, 포트번호를 비교해서 같은지 확인하는 보안기술.
한마디로 Origin이 같은지를 확인하는 것인데
Origin이란
출처 : https://evan-moon.github.io/2020/05/21/about-cors/
서버의 위치를 찾아가기 위해 필요한 가장 기본적인 것들을 합쳐 놓은 것.
앞에서 얘기한 프로토콜, 도메인, 포트번호가 여기에 포함이 된다.
origin이 달라도 내가 설정을 잡아주면 허용해 줄 수 있다.
HTTP = HyperText Transfer Protocol.
HTML과 같은 문서를 전송하기 위한 Application Layer프로토콜이다.
전통적인 클라이언트-서버 모델에서 클라이언트가 HTTP messages 양식에 맞춰 요청을 보내면, 서버도 HTTP messages 양식에 맞춰 응답한다. HTTP는 특정 상태를 유지하지 않는 특징이 있다.
HTTP의 특징: Stateless(무상태성)
HTTP messages 는 클라이언트와 서버 사이에서 데이터가 교환되는 방식이다. HTTP messages에는 다음과 같은 두 가지 유형이 있다.
요청(Requests)
응답(Responses)
출처 : https://developer.mozilla.org/ko/docs/Web/HTTP/Messages
요청과 응답은 유사한 구조를 가진다.
사진에서 start line과 HTTP headers를 묶어 요청이나 응답에 헤드(head)라고 하고, payload는 body라고 이야기 함.
Start line
클라이언트가 서버에게 보내는 메세지.
Headers
요청의 Headers는 기본 구조를 따름. 헤더 이름(대소문자 구분이 없는 문자열), 콜론( : ), 값을 입력. 값은 헤더에 따라 다르다. 여러 종류의 헤더가 있고, 다음과 같이 그룹을 나눌 수 있다.
Body
요청의 본문은 HTTP messages 구조의 마지막에 위치. 모든 요청에 body가 필요하지는 않음. GET, HEAD, DELETE, OPTIONS처럼 서버에 리소스를 요청하는 경우에는 본문이 필요하지 않는다. POST나 PUT과 같은 일부 요청은 데이터를 업데이트하기 위해 사용. body는 다음과 같이 두 종류로 나눌 수 있다.
Status line
Headers
응답에 들어가는 HTTP headers는 요청 헤더와 동일한 구조를 가지고 있다. 대소문자 구분 없는 문자열과 콜론(:), 값을 입력한다. 값은 헤더에 따라 다르다. 요청의 헤더와 마찬가지로 몇 그룹으로 나눌 수 있다.
내용은 요청과 같다.
Body
응답의 본문은 HTTP messages 구조의 마지막에 위치. 모든 응답에 body가 필요하지는 않는다. 201, 204와 같은 상태 코드를 가지는 응답에는 본문이 필요하지 않다. 응답의 body는 다음과 같이 두 종류로 나눌 수 있다.
가장 큰 특징이다.
출처 : 코드스테이츠 유어클래스
위 사진을 봤을 때 현재 클라이언트가 google.com을 입력한 것을 알 수 있음.
이 때 DNS가 도메인 주소를 IP주소로 변경해줌. DNS resolver에서 이전에 접속한 기록이 있는지 확인한다. 있다면 캐시 메모리에 저장이 되어 있을 것.
없다면 ISP NameServer에서 root 주소를 찾음. 이제 재귀과정을 통해 google의 IP주소를 찾게 됨.
그리고 get을 통해 IP주소를 입력하고 구글의 HTTP를 받음. HTTP resolver에서 HTTP를 찾고 진짜 google의 IP주소를 찾게됨. 이제 200(성공) 응답을 돌려줌.