HTTP/3는 QUIC(Quick UDP Internet Connections)
HTTP/3와 QUIC의 관계
- HTTP/3는 HTTP/2의 후속 프로토콜로, TCP 대신 UDP를 기반으로 동작합니다. 기존의 HTTP/1.x와 HTTP/2는 모두 TCP 위에서 동작했지만, HTTP/3는 QUIC 프로토콜을 기반으로 하여 UDP 위에서 동작합니다.
- QUIC는 Google이 개발한 전송 계층 프로토콜로, 빠르고 안전한 데이터 전송을 위해 설계되었습니다. TCP의 성능 문제(예: 느린 연결 설정, HOL(Head-of-Line) 블로킹)를 해결하기 위해 만들어졌습니다.
- HTTP/3는 QUIC을 사용해 이러한 성능 문제를 개선하며, 주로 웹 브라우저와 서버 간 통신에서 사용됩니다.
HTTP/3(QUIC)의 주요 특징
- UDP 기반:
- HTTP/3는 **UDP(User Datagram Protocol)**를 사용합니다. UDP는 TCP와 달리 비연결성 프로토콜로, 데이터 전송이 빠르고 경량화된 특징이 있습니다.
- TCP처럼 연결 설정 과정에서의 복잡한 핸드셰이크를 줄이고, 지연 시간을 최소화하여 성능을 향상시킵니다.
- 0-RTT 연결 설정:
- HTTP/3는 새로운 연결을 설정할 때 **0-RTT(Zero Round Trip Time)**를 지원합니다. 이는 이전에 연결했던 서버에 다시 접속할 때, 핸드셰이크 없이 데이터를 바로 전송할 수 있어 빠른 연결 설정이 가능합니다.
- 이를 통해 **지연 시간(Latency)**이 크게 줄어듭니다.
- 헤드 오브 라인 블로킹(Head-of-Line Blocking) 문제 해결:
- TCP에서는 패킷 손실이 발생하면 모든 패킷을 순서대로 받아야 하므로, 하나의 패킷이 손실되면 이후 패킷도 재전송을 기다려야 합니다. 이를 **헤드 오브 라인 블로킹(Head-of-Line Blocking)**이라고 합니다.
- HTTP/3(QUIC)에서는 각각의 데이터 스트림이 독립적으로 관리되기 때문에, 하나의 스트림에서 패킷 손실이 발생해도 다른 스트림에 영향을 주지 않습니다. 이로 인해 전송 성능이 향상됩니다.
- 통합된 암호화:
- HTTP/3는 QUIC 프로토콜에 TLS 1.3을 통합하여, 기본적으로 암호화된 연결만 지원합니다. 즉, 보안이 내장된 상태에서 동작하기 때문에 별도의 암호화 계층을 추가할 필요가 없습니다.
- 패킷 재전송 개선:
- QUIC은 손실된 패킷을 재전송할 때, UDP의 특성을 활용하여 빠르게 재전송을 처리할 수 있습니다. 이로 인해 TCP보다 네트워크 성능이 더욱 향상됩니다.
HTTP/2와 HTTP/3의 차이점
특징HTTP/2 (TCP 기반)HTTP/3 (QUIC 기반)
기반 프로토콜 | TCP | UDP + QUIC |
연결 설정 | TCP 핸드셰이크 + TLS 핸드셰이크 | QUIC 핸드셰이크 (0-RTT 지원) |
암호화 | TLS (별도로 설정) | TLS 1.3이 QUIC에 내장 |
헤드 오브 라인 블로킹 | 스트림 간에 HOL 블로킹 발생 | 스트림 간 독립적, HOL 블로킹 없음 |
속도 및 지연 시간 | 상대적으로 느림 | 빠른 연결 설정, 낮은 지연 시간 |
HTTP/3와 QUIC의 장점
- 빠른 연결 설정: 기존 HTTP/2는 TCP와 TLS 핸드셰이크 과정을 거쳐야 하지만, HTTP/3는 QUIC을 사용해 0-RTT로 빠르게 연결을 설정할 수 있습니다.
- 낮은 지연 시간: 헤드 오브 라인 블로킹 문제가 해결되었기 때문에, 패킷 손실이 발생해도 다른 데이터 흐름에 영향을 주지 않아 지연이 적습니다.
- 더 나은 신뢰성 및 보안: QUIC은 암호화가 기본적으로 적용되며, TLS 1.3을 사용해 더 높은 수준의 보안을 제공합니다.
결론
HTTP/3는 QUIC을 기반으로 하여, UDP를 통해 데이터를 전송하는 차세대 HTTP 프로토콜입니다. HTTP/3는 TCP 기반의 HTTP/2에서 발생하는 성능 문제를 해결하며, 빠르고 효율적인 네트워크 통신을 제공합니다. 낮은 지연 시간, 빠른 연결 설정, 더 나은 보안성 등의 이유로 HTTP/3는 점점 더 많은 웹사이트에서 채택되고 있습니다.
HTTP는 클라이언트와 서버 사이에 이루어지는
요청/응답(request/response) 프로토콜
HTTP 요청(Request)과 응답(Response)은 헤더(Header)와 바디(Body)로 구성됩니다.
- 헤더(Header): 요청 또는 응답에 대한 메타데이터가 포함됩니다. 여기에는 요청 메소드(GET, POST 등), 상태 코드(응답에서 사용), 콘텐츠 유형, 인코딩 방식, 쿠키 정보 등이 들어갑니다.
- 바디(Body): 실제 데이터가 포함됩니다. 요청의 경우 서버로 전달할 데이터가 들어가며, 응답의 경우 서버가 클라이언트에게 전송하는 데이터(예: HTML, JSON 등)가 들어갑니다.
HTTP 상태 코드(Status Code)
HTTP 상태 코드(Status Code)는 클라이언트와 서버 간의 통신에서 발생한 상태를 나타냅니다.
1. 100번대 - 정보교환(Informational)
100번대 상태 코드는 요청을 처리하는 중간 단계에서 사용됩니다. 서버가 클라이언트로부터 더 많은 정보를 필요로 하거나, 현재 처리 상태를 알려줄 때 사용됩니다.
- 100 Continue: 서버가 요청을 일부분 받았으며, 클라이언트가 나머지 요청을 계속해서 전송해도 좋다는 의미입니다.
- 101 Switching Protocols: 클라이언트가 요청한 프로토콜 변경(예: HTTP에서 WebSocket으로)이 성공적으로 진행되고 있음을 나타냅니다.
2. 200번대 - 성공(Successful)
200번대 상태 코드는 클라이언트의 요청이 성공적으로 처리되었음을 나타냅니다.
- 200 OK: 요청이 성공적으로 처리되었음을 의미하며, 일반적으로 요청한 데이터가 응답으로 반환됩니다.
- 201 Created: 요청이 성공적으로 처리되었으며, 새로운 리소스가 생성되었음을 나타냅니다.
- 204 No Content: 요청이 성공적으로 처리되었지만, 응답 본문에 콘텐츠가 없음을 의미합니다.
3. 300번대 - 리다이렉션(Redirection)
300번대 상태 코드는 요청한 자원의 위치가 변경되었거나, 클라이언트가 다른 리소스로 이동해야 할 때 사용됩니다.
- 301 Moved Permanently: 요청한 자원이 영구적으로 다른 위치로 이동되었으며, 새 URL로 이동해야 함을 의미합니다.
- 302 Found: 요청한 자원이 임시적으로 다른 위치에 있으며, 클라이언트는 새 URL로 리다이렉트해야 함을 나타냅니다.
- 304 Not Modified: 클라이언트가 요청한 자원이 변경되지 않았음을 나타내며, 클라이언트는 캐시된 버전을 사용할 수 있습니다.
4. 400번대 - 클라이언트 오류(Client Errors)
400번대 상태 코드는 클라이언트 측에서 잘못된 요청을 보냈을 때 사용됩니다.
- 400 Bad Request: 서버가 요청을 이해할 수 없거나, 요청이 잘못된 형식으로 이루어졌음을 의미합니다.
- 401 Unauthorized: 인증이 필요하지만, 클라이언트가 올바른 인증 정보를 제공하지 않았음을 나타냅니다.
- 403 Forbidden: 클라이언트가 요청한 자원에 대한 접근 권한이 없음을 의미합니다.
- 404 Not Found: 요청한 자원이 서버에 존재하지 않음을 나타냅니다.
5. 500번대 - 서버 오류(Server Errors)
500번대 상태 코드는 서버에서 요청을 처리하는 중에 문제가 발생했을 때 사용됩니다.
- 500 Internal Server Error: 서버에서 내부적으로 알 수 없는 오류가 발생했음을 의미합니다.
- 502 Bad Gateway: 서버가 잘못된 응답을 게이트웨이 또는 프록시 서버로부터 받았음을 나타냅니다.
- 503 Service Unavailable: 서버가 현재 요청을 처리할 수 없음을 의미하며, 서버가 과부하 상태이거나 점검 중일 때 발생합니다.
이렇게 HTTP 상태 코드는 각각의 그룹이 특정 상황을 나타내며, 클라이언트와 서버 간의 통신에서 어떤 문제가 발생했는지 쉽게 알 수 있게 합니다.
무상태 프로토콜(stateless protocol)
HTTP가 **무상태 프로토콜(stateless protocol)**이라는 말은 각 요청(request)과 응답(response)이 서로 독립적이며, 서버가 클라이언트의 이전 요청 상태를 기억하지 않는다는 의미입니다.
좀 더 구체적으로 설명하자면:
- 각 요청은 독립적: 클라이언트가 서버에 요청을 보낼 때, 서버는 이전에 클라이언트가 보낸 요청이나 그 결과를 기억하지 않습니다. 즉, 서버는 매번 새로운 요청을 처리하는 것처럼 동작합니다.
- 상태 저장 안 함: 서버는 클라이언트가 이전에 어떤 작업을 했는지, 어떤 데이터를 주고받았는지에 대한 정보를 저장하지 않으며, 매번 새로운 요청이 올 때마다 그 요청만 처리합니다.
예시로 이해하기
예를 들어, 클라이언트가 웹사이트에서 로그인한 후에 다른 페이지로 이동한다고 해도 HTTP 자체로는 클라이언트가 로그인을 했는지 기억하지 못합니다. 매번 요청이 올 때마다 로그인 여부를 확인하지 않으면, 서버는 클라이언트가 로그인했는지 알 수 없습니다.
이를 해결하기 위해 쿠키(Cookie), 세션(Session), 토큰(Token) 등의 기술이 사용됩니다. 이러한 기술을 사용하면 클라이언트가 이전에 수행한 작업을 서버가 추적할 수 있게 도와주어, 무상태 특성을 보완하는 방식으로 동작합니다.
요약
HTTP는 무상태 프로토콜이기 때문에, 클라이언트의 각 요청은 서로 독립적이고, 서버는 이전 요청의 상태나 정보를 기억하지 않습니다. 이를 보완하기 위해 별도의 상태 추적 기법(쿠키, 세션, 토큰 등)이 사용됩니다.
HTTP가 무상태 프로토콜이라는 말은 첫 번째 요청/응답과 두 번째 요청/응답 사이에 아무런 연관이 없고, 각 요청이 독립적으로 처리된다는 뜻입니다. 즉, 서버는 클라이언트가 이전에 어떤 요청을 보냈는지 기억하지 않으며, 매번 새로운 요청이 들어왔을 때 그 요청만을 처리합니다.
예를 들어:
- 첫 번째 요청: 클라이언트가 서버에 로그인 요청을 보냅니다. 서버는 로그인 정보를 처리하고 "로그인 성공" 응답을 보냅니다.
- 두 번째 요청: 같은 클라이언트가 다른 페이지를 요청합니다. 하지만 서버는 클라이언트가 이전에 로그인한 사실을 기억하지 못하므로, 로그인 여부를 확인하는 별도의 정보가 필요합니다.
이를 해결하기 위해 쿠키(Cookie), 세션(Session), 또는 JWT(Token) 같은 기술을 이용해 클라이언트의 상태를 유지하게 됩니다. 이런 기술들은 무상태 프로토콜의 특성을 보완해 클라이언트의 상태를 추적할 수 있게 해줍니다.
따라서 각 요청/응답 사이에 아무런 연관이 없다는 것이 바로 HTTP의 무상태 특성을 설명하는 핵심입니다.
위 url중에 마지막 / 의 의미는 루트 패스 경로에 있는 index.html을 달라고 하는 것
"브라우저는 결코 서버가 될 수 없다"
브라우저는 클라이언트로서의 역할만을 수행하며, 서버의 역할을 할 수 없다는 의미입니다. 이 개념을 좀 더 구체적으로 설명하자면:
1. 클라이언트와 서버의 역할
- 브라우저는 웹 클라이언트입니다. 사용자가 웹 사이트를 탐색할 때, 브라우저는 서버에 요청을 보내고 서버로부터 응답을 받아 웹 페이지를 렌더링합니다. 즉, 요청을 보내는 쪽입니다.
- 서버는 클라이언트로부터의 요청을 받아들이고, 그 요청에 대한 응답(예: HTML, CSS, 이미지, 데이터 등)을 제공하는 역할을 합니다. 서버는 요청된 데이터를 처리하고, 결과를 클라이언트에게 돌려보내는 응답을 제공하는 쪽입니다.
2. 브라우저의 역할
브라우저는 클라이언트로서 서버에 요청을 보내고, 서버로부터 응답을 받아 웹 페이지를 표시합니다. 하지만 브라우저는 클라이언트 역할만을 수행하며, 데이터를 저장하거나 요청을 처리하는 서버의 기능을 수행할 수는 없습니다.
3. 왜 브라우저는 서버가 될 수 없는가?
- 브라우저의 설계 목적: 브라우저는 사용자가 웹 페이지를 열고 탐색할 수 있도록 설계된 소프트웨어입니다. 요청을 보내고, 데이터를 받아 사용자에게 보여주는 것이 주된 기능입니다.
- 서버의 역할이 필요하지 않음: 브라우저는 웹 페이지를 표시하는 데에 중점을 두기 때문에, 서버처럼 데이터를 제공하거나 요청을 처리할 필요가 없습니다.
- 보안과 구조적 제한: 서버는 종종 많은 데이터를 저장하고 여러 클라이언트의 요청을 처리하는 책임이 있습니다. 브라우저는 이러한 기능이 없고, 사용자의 컴퓨터 자원에 제한적으로 접근합니다.
4. 예외적인 경우
브라우저에서 로컬 서버를 운영할 수 있는 방법도 있습니다(예: 웹 브라우저에서 동작하는 개발 도구들이 로컬 서버를 일시적으로 구동하는 경우). 그러나 이 경우에도 브라우저 자체가 서버 역할을 하는 것이 아니라, 웹 브라우저 안에서 구동되는 애플리케이션이 서버 역할을 수행합니다. 일반적인 웹 브라우저는 여전히 클라이언트로만 동작합니다.
결론
브라우저는 웹 사이트를 탐색하고 정보를 요청하는 클라이언트 역할만 수행할 수 있으며, 서버의 역할을 할 수는 없습니다. 서버는 요청을 처리하고 데이터를 제공하는 반면, 브라우저는 그 데이터를 받아 사용자에게 보여주는 역할을 하기 때문입니다.
파이프라이닝(Pipelining)
**파이프라이닝(Pipelining)**은 HTTP/1.1에서 사용되는 성능 최적화 기법 중 하나로, 클라이언트가 서버로 요청을 보낼 때 서버의 응답을 기다리지 않고 여러 요청을 연속적으로 보내는 방식을 말합니다.
1. 파이프라이닝의 작동 방식
일반적으로 클라이언트는 하나의 요청을 보내고, 서버로부터 응답을 받은 후에야 다음 요청을 보냅니다. 하지만 파이프라이닝을 사용하면 서버가 첫 번째 요청에 응답하기 전에, 클라이언트가 다음 요청을 미리 보낼 수 있습니다.
- 기존 방식(직렬 처리):
- 요청 1 → 응답 1
- 요청 2 → 응답 2
- 요청 3 → 응답 3
- 파이프라이닝(병렬 처리):
- 요청 1, 요청 2, 요청 3 → 응답 1, 응답 2, 응답 3
2. 파이프라이닝의 특징
- 응답 대기 시간 감소: 클라이언트가 서버로부터 응답을 받기 전에 여러 요청을 보내므로 대기 시간을 줄일 수 있습니다.
- 성능 향상: 여러 요청이 한꺼번에 전송되어 네트워크 대역폭을 효율적으로 사용할 수 있습니다.
- 순서 보장: 요청은 순차적으로 전송되지만, 응답도 요청 순서에 따라 반환됩니다.
3. 문제점 및 한계
파이프라이닝은 성능을 높이는 데 유용할 수 있지만, 몇 가지 문제점과 제약이 있습니다.
- 응답 순서 문제: 서버는 요청을 순서대로 처리하므로, 특정 요청이 오래 걸리면 그 다음 요청의 응답도 지연될 수 있습니다. 이를 **헤드 오브 라인 블로킹(Head-of-line blocking)**이라고 합니다.
- 지원 여부: 많은 브라우저와 서버는 HTTP/1.1의 파이프라이닝을 완벽하게 지원하지 않았습니다. 이로 인해 파이프라이닝은 실무에서 널리 사용되지는 않았습니다.
4. HTTP/2와 HTTP/3에서의 개선
HTTP/2와 HTTP/3에서는 파이프라이닝의 한계를 극복한 **멀티플렉싱(Multiplexing)**이 도입되었습니다. 멀티플렉싱은 한 연결에서 여러 요청을 동시에 처리할 수 있으며, 응답 순서와 무관하게 개별 요청을 독립적으로 처리합니다. 이 방식은 파이프라이닝의 문제점을 해결하고 성능을 크게 향상시킵니다.
요약
- 파이프라이닝은 클라이언트가 서버 응답을 기다리지 않고 여러 요청을 연속으로 보내는 방식입니다.
- 응답을 기다리지 않기 때문에 대기 시간을 줄이고 성능을 개선할 수 있습니다.
- 하지만 HTTP/1.1에서의 파이프라이닝은 헤드 오브 라인 블로킹 같은 문제로 인해 널리 사용되지는 않았고, HTTP/2와 HTTP/3에서는 멀티플렉싱으로 대체되었습니다.
원래 HTTP처럼 요청/응답 기반의 전통적인 프로토콜에서는, 서버는 클라이언트가 요청을 보냈을 때만 응답할 수 있습니다. 즉, 클라이언트가 먼저 요청을 보내기 전에는 서버가 임의로 데이터를 보내지 못합니다. 이게 전통적인 클라이언트-서버 구조의 특징입니다.
하지만 **소켓(Socket)**을 사용하면, 서버도 클라이언트에게 먼저 데이터를 보낼 수 있는 양방향 통신이 가능해집니다. 이를 좀 더 구체적으로 설명하겠습니다.
1. HTTP 기반의 전통적인 통신
HTTP는 기본적으로 클라이언트가 요청을 보내고, 서버가 그에 응답하는 요청/응답(request/response) 모델을 따릅니다. 이 모델에서:
- 클라이언트: 서버에 요청을 보냄.
- 서버: 클라이언트의 요청에 응답함.
즉, 클라이언트가 요청을 보내지 않으면 서버는 데이터를 보낼 수 없습니다. 서버는 클라이언트가 요청을 보낼 때까지 대기하고, 요청이 있을 때만 데이터를 보내는 구조입니다.
2. 소켓(Socket) 통신
**소켓(Socket)**은 양방향 통신을 지원하는 기술로, 서버와 클라이언트가 서로 실시간으로 데이터를 주고받을 수 있습니다. TCP 소켓이나 WebSocket 같은 기술을 사용하면 클라이언트가 먼저 요청을 보내지 않아도, 서버가 임의로 클라이언트에게 데이터를 보낼 수 있습니다.
WebSocket
WebSocket은 특히 웹 애플리케이션에서 많이 사용되는 양방향 통신 방식입니다. WebSocket은 HTTP와 달리, 한 번 연결을 맺은 후에는 서버와 클라이언트가 자유롭게 데이터를 주고받을 수 있습니다.
예를 들어:
- 실시간 채팅: 서버가 새로운 메시지를 클라이언트에게 즉시 전송.
- 주식 가격 실시간 업데이트: 서버가 주식 가격 변동을 실시간으로 클라이언트에게 전송.
이런 시나리오에서는 서버가 먼저 클라이언트에게 데이터를 보내는 것이 가능해집니다.
3. 소켓과 HTTP의 차이점
- HTTP: 기본적으로 요청/응답 기반. 클라이언트가 요청해야 서버가 응답.
- 소켓: 양방향 통신 가능. 서버도 먼저 데이터를 클라이언트로 보낼 수 있음.
4. 결론
전통적인 HTTP 모델에서는 서버가 클라이언트의 요청 없이 데이터를 보낼 수 없지만, 소켓 통신(예: WebSocket)을 사용하면 서버가 클라이언트에게 실시간으로 데이터를 보내는 것이 가능합니다.
'Everyday Study' 카테고리의 다른 글
2024.10.03(목) { 서블릿 컨테이너, 서블릿 컨텍스트 } (0) | 2024.10.03 |
---|---|
2024.10.02(수) { HTTP패킷, 톰캣 사용하는 이유, 클라이언트 종류와 역할, (0) | 2024.10.02 |
2024.09.26(목) { 패리티 비트(짝,홀), 백본망, ISP, ARP, 제로컨피규레이션, DNS, NAT, MAC 주소 } (0) | 2024.09.26 |
2024.09.25(수) { IP 어드레스, 서브넷 마스크, 대칭 암호화, MAC 어드레스 } (0) | 2024.09.25 |
2024.09.24(화) { 오프셋 기반 페이징의 문제점 } (0) | 2024.09.24 |