TIL: HTTP, 캐싱 등 네트워크 Day

Snoop So·2023년 2월 13일
0

노드에서 HTTPS 요청 보내기

https://nodejs.org/api/https.html

let https;
try {
  https = await import('node:https');
} catch (err) {
  console.error('https support is disabled!');
}

HTTP

HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜이다. (프로토콜은 컴퓨터 내부에서, 또는 컴퓨터 사이에서 데이터의 교환 방식을 정의하는 규칙 체계이다.)

RESTful API

REST는 Representational State Transfer의 약자이다. 오늘 알게 된 사실은.. API의 종류도 여러가지가 있고 나는 주로 REST API를 사용하고 있었단 것이다. SOAP, XML-RPC, GraphQL 등이 있다고 한다. 그래프QL이 API의 한 종류였구나.

RESTful API는 HTTP를 프로토콜로 사용한다. 클라이언트와 서버는 HTTP Request와 Response를 주고 받으면서 통신한다.

HTTP Method

HTTP의 메소드 종류는 총 8개가 존재한다.

  • GET: 서버로 부터 데이터를 취득
  • POST: 서버에 데이터를 추가, 작성 등
  • PUT: 서버의 데이터를 갱신, 작성 등
  • DELETE: 서버의 데이터를 삭제
  • HEAD: 서버 리소스의 헤더(메타 데이터의 취득)
  • OPTIONS: 리소스가 지원하고 있는 메소드의 취득
  • PATCH: 리소스의 일부분을 수정
  • CONNECT: 프록시 동작의 터널 접속을 변경

HTTP Header

HTTP(Hypertext Transfer Protocol) 헤더는 HTTP 요청(Request)과 응답(Response) 메시지에 포함되어, 메시지의 부가 정보를 전달합니다. HTTP 헤더에는 다양한 정보가 들어갈 수 있으며, 주로 다음과 같은 정보들이 포함됩니다.

요청 헤더(Request Headers)

Accept: 클라이언트가 처리할 수 있는 MIME 타입
Accept-Language: 클라이언트가 선호하는 언어
User-Agent: 클라이언트의 소프트웨어 정보
Referer: 현재 요청을 보내기 이전의 웹 페이지 주소
Cookie: 클라이언트의 쿠키 정보
Authorization: 클라이언트의 인증 정보
응답 헤더(Response Headers)

Content-Type: 응답 본문의 MIME 타입
Content-Length: 응답 본문의 길이
Server: 웹 서버의 소프트웨어 정보
Last-Modified: 리소스가 마지막으로 수정된 시간
Set-Cookie: 서버에서 클라이언트에게 전달하는 쿠키 정보
Location: 클라이언트를 리다이렉트할 주소
일반 헤더(General Headers)

Cache-Control: 캐시 제어 정보
Connection: 커넥션 제어 정보
Date: 메시지가 생성된 시간
Pragma: 캐시 제어 정보
Upgrade: 프로토콜 업그레이드 정보
HTTP 헤더의 정보들은 클라이언트와 서버 간의 통신을 더욱 원활하게 하며, 캐시 제어, 인증, 인코딩 등과 같은 다양한 기능을 제공합니다. 또한, HTTP 헤더의 정보는 웹 개발자가 브라우저와 서버 간의 통신 상태를 파악하고, 성능을 개선하는 데에도 유용하게 활용됩니다.

HTTP Request

Request Line과 Headers, Body로 구성되어 있다.
실제로는 한 줄마다 \r\n 줄바꿈 문자가 포함되어 있다.
Header와 Body를 빈 줄로 구분하기 위해서도 \r\n 문자를 포함한다.

User agent

글이 짱 재밌다 ㅋㅋㅋ User의 브라우저를 식별하기 위한 정보를 주로 저장

https://yozm.wishket.com/magazine/detail/1307/

LPU 캐시

LRU (Least Recently Used)
페이지를 교체할 때 가장 오랫동안 사용되지 않은 페이지를 교체 대상으로 삼는 기법으로, 캐싱에서는 LRU Cache 는 캐시에 공간이 부족할 때 가장 오랫동안 사용하지 않은 항목을 제거하고 새로운 녀석을 배치하는 형식으로 동작하는 것을 뜻한다. 실제로 가장 많이 사용하는 알고리즘이라고 한다.

https://velog.io/@haero_kim/LRU-Cache-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

캐시 정책

https://toss.tech/article/smart-web-service-cache

const options = {
  hostname: link.hostname,
  path: link.path,
  method: 'GET',
  headers: {
  'Cache-Control': 'private',
	},
};

// 여러 캐싱 방법
Cache-Control: max-age=<seconds> (유효시간 제한)
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: s-maxage=31536000
Cache-Control: private
Cache-Control: public
Cache-Control: public, max-age=86400 (혼합)
  • no-cache 값은 대부분의 브라우저에서 max-age=0 과 동일한 뜻을 가집니다. 즉, 캐시는 저장하지만 사용하려고 할 때마다 서버에 재검증 요청을 보내야 함
  • no-store 값은 캐시를 절대로 해서는 안 되는 리소스일 때 사용
  • Cache-Control 값을 s-maxage=31536000, max-age=0 과 같이 설정하면 CDN에서는 1년동안 캐시되지만 브라우저에서는 매번 재검증 요청을 보내도록 설정할 수 있다.
  • 그 와중에 토스는 파일 종류별로 캐싱을 다르게 한다고 한다... 진짜 배운ㅂ 사람들이다.

https://toss.tech/article/smart-web-service-cache

URI

간단하게 말하자면 인터넷에 있는 리소스(웹페이지, 그림, 파일 등)들을 식별하는 string이다. URI는 두가지 종류가 있는데 하나는 URLs, 다른 하나는 URNs 이다.

웹브라우저가 URL을 입력했을 때

웹 브라우저에서 URL을 입력했을 때, 일어나는 일들을 살펴보자!

  1. 웹 브라우저가 도메인의 IP 주소를 조회합니다. 이때, 캐시 사용이 허용된 경우 캐시를 먼저 조회합니다.

  2. 웹 브라우저가 서버와의 TCP 연결을 시작합니다.

  3. 웹 브라우저가 HTTP 요청을 서버로 전송합니다. (필요한 경우, HTTPS 보안 통신이 진행됩니다.)

  4. 웹 서버가 요청을 분석합니다.

  5. 웹 서버가 응답 데이터를 준비합니다.

  6. 웹 서버가 응답을 다시 웹 브라우저로 전송합니다.

  7. 웹 브라우저가 응답데이터를 수신합니다.

  8. 웹 브라우저가 응답데이터를 파싱합니다.

  9. 웹 브라우저가 전송 받은 콘텐츠를 렌더링합니다.

DNS

DNS(Domain Name System)
도메인 서버는 사람이 이해할 수 있는 도메인 이름 (예 : www.google.com)을 컴퓨터가 이해할 수 있는 IP 주소 (예 : 216.58.194.174)로 변환하는 역할을 한다.

TCP 연결

TCP (Transmission Control Protocol)은 네트워크 통신에서 데이터의 전송을 제어하는 프로토콜입니다. 인터넷에서 많은 데이터가 전송되는데, TCP는 이 데이터의 전송을 안정적으로, 정확하게 및 순서대로 제어하는 것이 목적입니다.

TCP는 데이터를 전송하기 전에 통신 상대가 준비되어 있는지, 데이터를 제대로 수신했는지 등의 확인 절차를 거치고, 데이터를 보내기 전에 데이터를 여러 조각으로 나눠서 전송하고, 수신자가 데이터를 제대로 수신했는지 확인하는 과정을 거칩니다.

TCP가 서버와 연결되는 과정

TCP 핸드쉐이크 (TCP Handshake)
브라우저가 서버와 TCP 연결을 시도하면, 먼저 TCP 핸드쉐이크 과정이 시작됩니다. 이 과정에서 브라우저는 서버로 SYN(Synchronize) 패킷을 보내고, 서버는 이에 대한 ACK(Acknowledge)와 SYN 패킷을 다시 보냅니다. 이렇게 브라우저와 서버 간에 연결을 설정하는 과정을 3-way 핸드쉐이크라고 합니다.

데이터 전송 (Data Transfer)
연결이 설정되면, 브라우저와 서버 간에 데이터를 주고받을 수 있습니다. 이때 브라우저는 HTTP 요청 메시지를 서버로 보내고, 서버는 이에 대한 HTTP 응답 메시지를 다시 보냅니다. 이렇게 요청과 응답 메시지를 주고받으면서 데이터 전송이 이루어집니다.

TCP 연결 종료 (TCP Connection Termination)
데이터 전송이 완료되면, 브라우저와 서버는 TCP 연결을 종료해야 합니다. 이때 브라우저는 FIN(Finish) 패킷을 보내고, 서버는 이에 대한 ACK 패킷을 보냅니다. 이후 서버도 FIN 패킷을 보내고, 브라우저는 이에 대한 ACK 패킷을 다시 보내면 연결이 완전히 종료됩니다.

HTTP의 역사

HTTP(Hypertext Transfer Protocol)는 인터넷에서 웹 브라우저와 웹 서버 간에 데이터를 주고받는 프로토콜입니다. HTTP는 초기에는 단순한 데이터 전송을 위한 프로토콜이었지만, 시간이 지나면서 다양한 발전과정을 거쳐 오늘날의 HTTP 버전으로 발전해왔습니다. HTTP의 발전과정에 대해 자세히 살펴보겠습니다.

HTTP/0.9
HTTP/0.9는 1991년에 처음 등장한 HTTP의 초기 버전입니다. 이 버전에서는 요청(Request) 메시지와 응답(Response) 메시지를 구분하지 않고, 오직 GET 메서드만을 지원했습니다. 또한, 응답 메시지에는 HTML 파일의 내용만을 포함하고, HTTP 헤더 등의 정보는 전혀 없었습니다.

HTTP/1.0
HTTP/1.0은 1996년에 등장한 HTTP의 두 번째 버전입니다. 이 버전에서는 요청 메시지와 응답 메시지를 구분하고, 여러 가지 메서드(GET, POST, PUT, DELETE 등)를 지원했습니다. 또한, 응답 메시지에는 HTTP 헤더 등의 정보가 포함되어 있어, 브라우저와 서버 간에 더욱 다양한 정보를 주고받을 수 있게 되었습니다.

HTTP/1.1
HTTP/1.1은 1999년에 등장한 HTTP의 세 번째 버전입니다. 이 버전에서는 HTTP/1.0과 비교해 더욱 안정적이고 빠른 성능을 제공하도록 개선되었습니다. 이를 위해 Keep-Alive 커넥션, 파이프라인(Pipeline), 캐시(Cache) 등의 기능이 추가되었습니다. 또한, 호스트 가상화(Host Virtualization)를 지원하여 여러 개의 도메인 이름을 가진 웹 사이트를 운영할 수 있게 되었습니다.

HTTP/2
HTTP/2는 2015년에 등장한 HTTP의 네 번째 버전입니다. 이 버전에서는 이전 버전과는 달리 이진 프로토콜을 사용하여 데이터를 주고받습니다. 이를 통해, 더욱 효율적인 데이터 전송을 가능하게 하였습니다. 또한, 스트림(Stream), 헤더 압축(Header Compression), 서버 푸시(Server Push) 등의 기능이 추가되어 더욱 빠른 성능과 향상된 보안 기능을 제공합니다.

HTTP/3
HTTP/3은 2020년에 등장한 HTTP의 다섯 번째 버전입니다. 이 버전에서는 UDP(User Datagram Protocol) 프로토콜을 사용하여 데이터를 주고받습니다. UDP는 이전 버전에서 사용하던 TCP와는 달리, 연결 설정과 종료 과정이 없어서 더욱 빠른 데이터 전송이 가능합니다. 또한, 헤더 압축과 서버 푸시 등 HTTP/2에서 사용되던 기능들이 그대로 유지되면서 더욱 안정적인 데이터 전송을 제공합니다.

0개의 댓글