백엔드 서버와 프런트엔드 서버가 따로 있다면 REST API를 많이 사용할 거라 생각합니다.

이 때, API는 알겠는데, REST가 뭘까라는 생각이 들 수 있을 것 같습니다.

저역시 그랬었고, REST API에 대한 개념을 알고자 글을 작성하게 되었습니다.

 

REST란?

자원을 이름으로 구분하여 처리한다 것을 의미합니다.

즉, REST는 다음과 같은 과정을 거치게 됩니다.

  • HTTP URI를 통해 자원을 식별하고,
  • HTTP Method를 통해,
  • 해당 자원에 대한 CURD 동작

REST 특징

  • Server-Client(서버-클라이언트 구조): 요청을 하는 클라이언트와 요청을 처리하는 서버 구조
  • Stateless(무상태): 클라이언트 상태를 서버에 저장하지 않음
  • Cachealbe(캐시 가능): HTTP가 가진 특징 중 하나인 캐싱 기능 적용 가능
  • Layered System(계층화): REST API 서버는 다중 계층으로 구성 가능
  • Uniform Interface(인터페이스 일관성): 자원 접근 방식의 일관성 및 자원 조작 방법은 자원의 표현에 독립적

REST API란?

REST API는 이러한 REST을 기반으로 한 API 입니다.

REST API 설계 규칙

  • URI는 슬래시 구분자(/)로 계층 관계 표현
  • URI 마지막에 슬래시(/)를 포함하지 않음
  • 긴 URI에 대한 가독성은 하이픈(-)을 사용
  • URI는 소문자만 사용
  • URI에 파일 확장자를 포함하지 않음
  • URI는 동사보다 명사를 사용
  • 자원에 대한 행위는 HTTP Method로 표현

RESTful이란?

REST API 설계 규칙을 잘 따르는 것을 RESTful하다라고 합니다.

RESTful한 API를 구현하는 것의 목적은 일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것이기 때문에, 성능이 중요한 상황에서는 REST API 설계 규칙을 모두 따를 필요는 없다고 합니다.

'채워가는 지식 > 네트워크' 카테고리의 다른 글

프락시  (0) 2024.02.15
STOMP 웹소켓 프로그래밍  (0) 2024.02.15
웹 서버  (0) 2023.12.29
커넥션  (0) 2023.12.20
HTTP 메시지  (0) 2023.12.18

프락시

프락시는 클라이언트와 서버 사이에 위치하여 그들 사이의 HTTP 메시지를 정리하는 중개인처럼 동작합니다.

 

1. 웹 중개자

HTTP 프락시 서버는 웹 서버이기도 하고 웹 클라이언트이기도 합니다.

1.1 개인 프락시와 공유 프락시

프락시 서버는 하나의 클라이언트가 독점적으로 사용할 수도 있고, 여러 클라이언트가 공유할 수도 있습니다.

대부분의 프락시는 공유 프락시입니다.

 

공유 프락시

중앙 집중형 프락시를 관리하는 것이 더 비용효율이 높고 쉽습니다.

여러 사용자들의 공통된 요청에는 캐시 프락시 서버를 사용하는 것으로 이득을 취할 수 있습니다.

 

개인프락시

브라우저의 기능을 확장하거나 성능을 개선하거나 무료 ISP 서비스를 위한 광고를 운영하기 위해 작은 프락시를 사용자의 컴퓨터에서 직접 실행합니다.

 

1.2 프락시와 게이트웨이

엄밀하게 말하면, 프락시는 같은 프로토콜을 사용하는 둘 이상의 애플리케이션을 연결하고, 게이트웨이는 서로 다른 프로토콜을 사용하는 둘 이상을 연결합니다.

 

하지만 실질적으로 프락시와 게이트웨이의 차이점은 모호합니다.

브라우저와 서버는 다른 버전의 HTTP를 구현하기 때문에, 프락시는 때때로 약간의 프로토콜 변환을 하기도 합니다.

그리고 상용 프락시 서버는 SSL 보안 프로토콜, SOCKS 방화벽, FTP 접근, 그리고 웹 기반 애플리케이션을 지원하기 위해 게이트웨이 기능을 구현합니다.

 

2. 프락시 사용성

프락시 서버는 실용적이고 유용한 것이라면 무슨 일이든 합니다.

보안을 개선하고, 성능을 높여주며, 비용을 절약합니다.

그리고 프락시 서버는 모든 HTTP 트래픽을 들여다보고 건드릴 수 있기 때문에, 프락시는 부가적인 가치를 주는 여러 유용한 웹 서비스를 구현하기 위해 트래픽을 감시하고 수정할 수 있습니다.

 

사용 예시

  • 어린이 필터 : 초등학교는 어린이들에게 교육 사이트를 제공하면서 동시에 동시에 성인 콘텐츠를 차단하려고 필터링 프락시를 사용할 수 있습니다.
  • 문서 접근 제어자 : 각 클라이언트마다 문서에 접근할 수 있는 권한을 주거나 비밀번호를 요구할 수 있습니다.
  • 보안 방화벽 : 조직 안에 들어오거나 나가는 응용 레벨 프로토콜의 흐름을 네트워크의 한 지점에서 통제합니다.
  • 웹 캐시 : 인기 있는 문서의 로컬 사본을 관리하고 해당 문서에 대한 요청이 오면 빠르게 제공하여, 느리고 비싼 인터넷 커뮤니케이션을 줄입니다.
  • 대리 프락시 : 공용 콘텐츠에 대한 느린 웹 서버의 성능을 개선하기 위해 사용될 수 있으며, 서버 가속기라고도 부릅니다.
  • 콘텐츠 라우터 : 인터넷 트래픽 조건과 콘텐츠의 종류에 따라 요청을 특정 웹 서버로 유도하는 콘텐츠 라우터로 동작할 수 있습니다.
  • 트랜스코더 : 콘텐츠를 클라이언트에게 전달하기 전에 본문 포맷을 수정할 수 있습니다.
  • 익명화 프락시 : HTTP 메시지에서 신원을 식별할 수 있는 특성들을 적극적으로 제거함으로써 개인 정보 보호와 익명성 보장에 기여합니다.

3. 프락시 위치

어떻게 사용할지에 따라서 프락시는 어디에든 배치할 수 있습니다.

 

프락시 서버 배치

  • 출구 프락시 : 로컬 네트워크와 더 큰 인터넷 사이를 오가는 트래픽을 제어하기 위해 프락시를 로컬 네트워크의 출구에 배치할 수 있습니다.
  • 접근(입구) 프락시 : 고객으로부터의 모든 요청을 종합적으로 처리하기 위해 ISP 접근 지접에 배치하기도 합니다.
  • 대리 프락시 : 네트워크의 가장 끝에 있는 웹 서버들의 바로 앞에 위치하여 웹 서버로 향하는 모든 요청을 처리하고 필요할 때만 웹 서버에게 자원을 요청할 수 있습니다.
  • 네트워크 교환 프락시 : 캐시를 이용해 인터넷 교차로의 혼잡을 완화하고 트래픽 흐름을 감시하기 위해, 충분한 처리 능력을 갖춘 프락시가 네트워크 사이의 인터넷 피어링 교환 지점들에 위치할 수 있습니다.

프락시 계층

프락시들은 프락시 계층이라고 불리는 연쇄를 구성할 수 있습니다.

 

4. 프락시의 트래픽 처리 방법

클라이언트 트래픽이 프락시로 가도록 만드는 방법에는 네 가지가 있습니다.

  • 프락시를 사용하도록 설정된 클라이언트
  • 트래픽을 가로채어 프락시로 리다이렉트하는 네트워크
  • 웹 서버를 위해 설치된 대리 프락시
  • HTTP 요청을 프락시로 리다이렉트하는 서버

5. 마치며...

이번 글을 프락시에 대해 가볍게 정리한 글입니다.

 

저는 이번 공부에서

  • 프락시가 무엇인지,
  • 어떤 용도로 사용할 수 있는지,
  • 어디에 위치할 수 있는지
  • 어떤 방법으로 프락시가 트래픽을 처리하는지

에 대해 알아갔습니다.

'채워가는 지식 > 네트워크' 카테고리의 다른 글

REST API란?  (0) 2024.04.12
STOMP 웹소켓 프로그래밍  (0) 2024.02.15
웹 서버  (0) 2023.12.29
커넥션  (0) 2023.12.20
HTTP 메시지  (0) 2023.12.18

1. 웹소켓

웹소켓은 http 환경에서 클라이언트와 서버 사이에 하나의 TCP 커넥션을 통해 실시간으로 전이중 통신을 가능하게 하는 프로토콜입니다.

※ 전이중 통신은 전화기처럼 양방향으로 송신과 수신이 가능한 통신을 뜻합니다.

2. HTTP vs 웹소켓

그럼 이러한 웹소켓과 HTTP와의 차이점은 무엇일까요?

HTTP는 클라이언트가 요청을 보낼 때마다 연결을 맺고 응답을 받은 후 연결을 끊어버리기 때문에 비 연결성 프로토콜이며, 클라이언트가 요청하고 서버가 응답하는 단방향 통신입니다.

반면에 웹소켓은 한번 연결을 맺으면 어느 한쪽에서 연결을 끊으라는 요청을 보내기 전까진 연결을 유지하기 때문에 연결 지향 프로토콜이며, 양 쪽에서 데이터를 주고 받을 수 있는 양방향 통신입니다.

 


2.1 실시간 측면에서는...?

http는 비 연결성이기 때문에 데이터를 주기 위해선 매번 연결해야 하고 그만큼 연결 비용이 발생하게 됩니다.


즉, 오버헤드가 커집니다.


위 이미지에서 왼쪽은 일반적인 http로 주고받는 데이터양이고,

오른쪽 위는 웹소켓 연결요청할 때의 데이터양이고,

그 아래는 연결 이후의 데이터양입니다.

웹소켓은 처음 연결할 때 http로 하기 때문에 처음 데이터 양은 유사하지만, 이후 데이터 양이 매우 줄어든 것을 확인할 수 있습니다.

이러한 점들에서 웹소켓이 http 보다 실시간성에 더 유리합니다.

 

3. 웹소켓 동작 방식


웹소켓의 동작 방식은 크게 3가지로 나눌 수 있는데요,

  • 빨간 박스는 Opening Handshake,
  • 노란 박스는 Data transfer,
  • 보라 박스는 Closing Handshake에 해당됩니다.

3.1 Opening Handshake

 

빨간 박스 부분인 Opening Handshake는 먼저 웹소켓 클라이언트에서 http 프로토콜을 통해 웹소켓으로 Upgrade 해달라는 요청을 보냅니다.

이 요청의 의미는 웹소켓 프로토콜로 전환해달라는 것입니다.

그 다음 웹소켓 서버는 101 응답과 함께 웹소켓 프로토콜로의 전환을 승인했음을 알립니다.

 

3.2 Data Transfer


노란 박스 부분인 Data Transfer는 Opening Handshake가 끝나서 전환된 웹소켓 프로토콜을 통해 클라이언트와 서버 간 실시간 전이중 통신을 하는 부분입니다.

 

3.3 Closing Handshake


보라 박스 부분인 Closing Handshake는 서로 간의 커넥션을 종료하는 부분입니다.

 

4. STOMP

STOMP는 streaming text oriented messaging protocol의 줄임말이며,
메세지 브로커를 활용하여 쉽게 메시지를 주고 받을 수 있는 프로토콜입니다.

이 프로토콜은 웹소켓 위에 얹어 하위 프로토콜로 함께 사용할 수 있습니다.

 

4.1 웹소켓만 사용하는 것 비해 어떤 이점이...?

웹소켓 프로토콜은 메시지 데이터 타입이 Text인지 Binary인지는 정의하지만, 메시지 내용에 대해서는 정의하지 않습니다.

이는 복잡한 메시지를 주고 받으려면 어떤 메시지인지 알기 위한 로직이 필요하다는 것입니다.

STOMP 프로토콜은 메시지 내용을 구조화 할 수 있어서 효과적인 메시징을 도와줍니다.

예를 들어, A라는 사람이 B라는 사람에게 “안녕”이라는 내용으로 보내는 메시지가 있다고 해보겠습니다.
웹소켓로 보낼 때는 “안녕”이라는 메시지만 보내면 됩니다.

클라이언트가 1명이라면 문제가 없지만, 클라이언트가 여러명이라면, 이 메시지를 누가 보냈는지, 누구한테 가야하는지, 어떤 용도로 보내는 것인지 서버가 알 수가 없습니다.

 

물론, 단순히 안녕이 아닌 모든 정보가 담긴 한줄의 긴 텍스트 문자열로 보낼 수 있습니다.
하지만 이러면, 서버가 이 메시지를 이해하고 처리하기 쉽지 않을 수 있습니다.


또한 연결된 클라이언트 주소마다 메시지 핸들러를 구현해야 합니다.

 


STOMP는 이미지처럼 

destination /app/chat/message로 보내는, 
sender A가,
content “안녕”의 내용의 메시지를,
send 전송했음을

구조화 된 형태로 보낼 수 있기 때문에 서버는 이 메시지가 어떤 메시지인지 이해하고 처리하기 쉽습니다.

또 다른 이점은 STOMP는 pub/sub 구조로 되어있다는 것입니다.

 



pub/sub 구조란 이 이미지처럼 publisher에서 메시지 브로커의 Topic1이라는 특정 토픽에 메시지를 보내면, Topic1을 구독하고 있는 subscribe들에게 메세지를 전달하는 구조를 말합니다.

이 구조로 인해 최대 토픽별로만 메시지 핸들러를 구현해주면 되기 때문에 웹소켓로만 구성된 것에 비해 메시지 핸들러 구현 양이 줄어든다는 이점이 있습니다.

 

4.2 pub/sub 구조의 특징

저는 pub/sub 구조의 특징을 크게 3가지로 나눠볼 수 있었습니다.

  • pub과 sub을 쉽게 추가할 수 있어서 확장성이 좋습니다.
  • pub과 sub 간에 강한 의존성이 없어서 비동기적으로 처리할 수 있습니다.
  • sub은 관심 토픽에 대한 메시지만 받을 수 있어서 선택적 수신이 가능합니다.

5. 마치며...

Kernel 360에서 기술세미나를 하게되어 이번 글을 작성했습니다.

 

이 글에서

  • 웹소켓이 무엇인지,
  • 웹소켓과 HTTP의 차이점이 무엇인지,
  • 웹소켓이 어떻게 동작하는지,
  • STOMP가 무엇이고, 어떤 이점이 있는지,
  • pub/sub 구조가 무엇인지

에 대해 알아가셨으면 좋겠습니다.

 

저는 여러분들이 채팅, 실시간 업데이트, 알림 같은 실시간성 기능을 구현하고자 하면, STOMP도 선택지 중 하나라고 생각합니다.

'채워가는 지식 > 네트워크' 카테고리의 다른 글

REST API란?  (0) 2024.04.12
프락시  (0) 2024.02.15
웹 서버  (0) 2023.12.29
커넥션  (0) 2023.12.20
HTTP 메시지  (0) 2023.12.18

웹 서버

웹 서버는 HTTP 요청을 처리하고 응답을 제공합니다.

 

1. 공통적으로 웹 서버가 하는 일

  • 커넥션 맺기
  • 요청 받기
  • 요청 처리
  • 리소스 접근
  • 응답 만들기
  • 응답 보내기
  • 트랜잭션을 로그로 남기기

1.1 커넥션 맺기

클라이언트가 이미 서버에 대해 열려있는 지속적 커넥션을 갖고 있다면, 클라이언트는 요청을 보내기 위해 그 커넥션을 사용할 수 있습니다.

그렇지 않다면, 클라이언트는 서버에 대한 새 커넥션을 열어야 합니다.

1.1.1 새 커넥션 다루기

클라이언트가 웹 서버에 TCP 커넥션을 요청하면, 웹 서버는 그 커넥션을 맺고 TCP 커넥션에서 IP 주소를 추출하여 커넥션 맞은편에 어떤 클라이언트가 있는지 확인합니다.

일단 새 커넥션이 맺어지고 받아들여지면, 서버는 새 커넥션을 커넥션 목록에 추가하고 커넥션에서 오가는 데이터를 지켜보기 위한 준비를 합니다.

웹 서버는 어떤 커넥션이든 마음대로 거절하거나 즉시 닫을 수 있습니다.

그래서 어떤 웹 서버들은 클라이언트의 IP 주소나 호스트 명이 인가되지 않았거나 악의적이라고 알려진 것인 경우 커넥션을 닫습니다.

 

1.2 요청 받기

커넥션에 데이터가 도착하면, 웹 서버는 네트워크 커넥션에서 그 데이터를 읽어 들이고 파싱하여 요청 메시지를 구성합니다.

요청 메시지를 파싱할 때, 웹 서버는 다음과 같은 일을 합니다.

  • 요청줄을 파싱하여 요청 메서드, 지정된 리소스의 식별자(URI), 버전 번호를 찾습니다.
  • 메시지 헤더들을 읽습니다.
  • 헤더의 끝을 의미하는 CRLF로 끝나는 빈 줄이 있다면 찾아냅니다.
  • 요청 본문이 있다면, 읽어 들입니다.(길이는 Content-Length 헤더로 정의)

요청 메시지를 파싱할 때, 웹 서버는 입력 데이터를 네트워크로부터 불규칙적으로 받습니다.

네트워크 커넥션은 언제라도 무효화될 수 있기 때문에, 웹 서버는 파싱해서 이해하는 것이 가능한 수준의 분량을 확보할 때까지 데이터를 네트워크로부터 읽어서 메시지 일부분을 메모리에 임시로 저장해 둘 필요가 있습니다.

1.2.1 메시지의 내부 표현

몇몇 웹 서버는 요청 메시지를 쉽게 다룰 수 있도록 내부의 자료 구조에 저장합니다.

예를 들어, 헤더는 속도가 빠른 룩업 테이블에 저장되어 각 필드에 신속하게 접근할 수 있습니다.

1.2.2 커넥션 입력/출력 처리 아키텍처

커넥션 입출력 처리 아키텍처는 다음과 같이 있습니다.

 

a) 단일-스레드 I/O 아키텍처

한 번에 하나씩 요청을 처리합니다.

즉, 현재 커넥션의 트랜잭션이 완료되어야 다음 커넥션이 처리됩니다.

이 아키텍처는 구현이 간단하지만 심각한 성능 문제를 만듭니다.

 

b) 멀티스레드 I/O 아키텍처

멀티 스레드로 여러 요청을 한번에 처리합니다.

즉, 매 커넥션마다 스레드 하나를 할당하여, 여러 커넥션을 동시에 처리합니다.

이 아키텍처는 많은 수의 커넥션을 동시에 처리하게 되면, 너무 많은 메모리나 시스템 리소스를 소비합니다.

그렇기에 스레드의 최대 개수에 제한을 둡니다.

 

c) 다중 I/O 아키텍처

다중 아키텍처에서는 모든 커넥션은 동시에 그 활동을 감시당합니다.

커넥션의 상태가 바뀌면, 그 커넥션에 대해 작은 양의 처리가 수행됩니다.

그 처리가 완료되면, 커넥션은 다음번 상태 변경을 위해 열린 커넥션 목록으로 돌아갑니다.

이로써, 스레드는 유휴 상태의 커넥션에 매여 기다리느라 리소스를 낭비하지 않습니다.

 

※ 커넥션의 효율이 높아진다고 보시면 될 것 같습니다.

 

d) 다중, 멀티스레드 I/O 아키텍처

멀티스레딩과 다중화를 결합한 것입니다.

 

1.3 요청 처리

웹 서버가 요청을 받으면, 서버는 요청으로부터 메서드, 리소스, 헤더, 본문을 얻어내어 처리합니다.

 

1.4 리소스의 매핑과 접근

웹 서버는 리소스 서버입니다.

웹 서버가 클라이언트에 콘텐츠를 전달하려면, 요청 메시지의 URI에 대응하는 알맞은 콘텐츠나 콘텐츠 생성기를 웹 서버에서 찾아서 그 콘텐츠의 원천을 식별해야 합니다.

 

웹 서버는 여러 종류의 리소스 매핑을 지원합니다.

  • Docroot : 가장 단순한 형태로 요청 URI를 웹 서버의 파일 시스템 안에 있는 파일 이름으로 사용하는 것입니다.
  • 디렉토리 목록 : 파일 이름이 아닌 디렉토리 이름을 사용함으로써 디렉토리 안에 있는 특별한 색인 파일을 반환합니다.
  • 동적 콘텐츠 리소스 매핑 : 콘텐츠를 생성하는 프로그램에 URI를 매핑하는 것입니다.
  • 서버사이드 인클루드(SSI) : 리소스의 콘텐츠를 클라이언트에게 보내기 전에 처리합니다.

웹 서버는 각각의 리소스에 접근 제어를 할당 할 수 있습니다.

 

1.5 응답 만들기

서버는 요청 메서드로 서술되는 동작을 수행한 뒤 응답 메시지를 반환합니다.

응답 메시지는 응답 상태 코드, 응답 헤더, 그리고 응답 본문(있다면)을 포함합니다.

 

1.6 응답 보내기

만들어진 응답 메시지를 커넥션 너머로 데이터를 보냅니다.

 

웹 서버는 종종 성공 메시지 대신 리다이렉션 응답을 반환합니다.

리다이렉트는 다음의 경우에 유용합니다.

  • 영구히 리소스가 옮겨진 경우
  • 임시로 리소스가 옮겨진 경우
  • URL 증강
  • 부하 균형
  • 친밀한 다른 서버가 있을 때
  • 디렉터리 이름 정규화

1.7 로깅

트랜잭션이 완료되었을 때 웹 서버는 트랜잭션이 어떻게 수행되었는 지에 대한 로그를 로그 파일에 기록합니다.

 

마치며..

 이 글은 웹 서버에 대해 간략히 적은 글입니다.

 

저는 이번 공부에서

  • 웹 서버가 하는 일이 무엇이 있는지,
  • 어떤 순서로 하는지,
  • 각 순서에 어떤 일을 하는지,
  • 커넥션 입출력 처리 아키텍처에 무엇이 있는지

를 알아 갔습니다.

 

이번엔 커넥션 입출력 처리 아키텍처를 제외하고 가볍게 읽었습니다.

'채워가는 지식 > 네트워크' 카테고리의 다른 글

프락시  (0) 2024.02.15
STOMP 웹소켓 프로그래밍  (0) 2024.02.15
커넥션  (0) 2023.12.20
HTTP 메시지  (0) 2023.12.18
URL  (1) 2023.12.18

1. TCP 커넥션

전 세계 모든 HTTP 통신은 지구상의 컴퓨터와 네트워크 장비에서 널리 쓰이고 있는 패킷 교환 네트워크 프로토콜들의 계층화된 집합인 TCP/IP를 통해 이루어집니다.

TCP는 HTTP에게 신뢰할 만한 통신 방식을 제공하기 때문에, 일단 커넥션이 맺어지면 클라이언트와 서버 컴퓨터 간에 주고받는 메시지들은 손실 혹은 손상되거나 충돌없이 순서가 바뀌지 않고 안전하게 전달됩니다.

 

 

위의 그림은 웹 브라우저가 TCP 커넥션을 통해서 웹서버에 요청을 보내는 과정입니다.

(1) 웹 브라우저가 URL의 호스트 명으로부터 76.76.21.61:443이라는 IP주소와 포트 정보를 얻습니다.

(2) 웹 브라우저가 76.76.21.61의 443포트에 TCP 커넥션을 생성합니다.

(3) 웹 브라우저가 서버로 HTTP 요청을 합니다.

(4) 서버가 웹 브라우저로 HTTP 응답을 합니다.

(5) 웹 브라우저가 TCP 커넥션을 끊습니다.

 

1.1 TCP 전송

HTTP가 메시지를 전송하고자 할 경우, 현재 연결되어 있는 TCP 커넥션을 통해서 메시지 데이터의 내용을 순서대로 보냅니다.

TCP 세그먼트라는 단위로 데이터 스트림을 잘게 나누고, 세그먼트를 IP 패킷(혹은 IP 데이터그램)라고 불리는 봉투에 담아서 인터넷을 통해 데이터를 전달합니다.

각 TCP 세그먼트는 하나의 IP 주소에서 다른 IP 주로로 IP 패킷에 담겨 전달됩니다.

 

 

위의 그림은 IP 패킷의 구조입니다.

IP 패킷은 IP 패킷 헤더, TCP 세그먼트 헤더, TCP 데이터 스트림 덩어리로 나눌 수 있는데,

IP 패킷 헤더는 발산지와 목적 IP 주소, 크기, 기타 플래그를 가집니다.

TCP 세그먼트 헤더는 TCP 포트 번호, TCP 제어 플래그, 그리고 데이터의 순서와 무결성을 검사하기 위해 사용되는 숫자 값을 포함합니다.

 

※ IP 패킷의 구성 요소의 자세한 내용을 보고 싶으신 분은 구글에 구성  요소에 대해 검색하시면 쉽게 알 수 있습니다.

 

1.2 TCP 커넥션 유지

TCP는 포트 번호를 통해 여러 커넥션을 가질 수 있습니다.

 

TCP 커넥션은 다음과 같이 네 가지 값으로 식별합니다.

<발신지 IP 주소, 발신지 포트, 수신지 IP 주소, 수신지 포트>

 

이 네 가지 값으로 유일한 커넥션을 생성합니다.

물론 유일한 커넥션이지만 다른 커넥션과 수신지 IP만 같거나 등 일부는 같을 수 있습니다.

 

1.3 TCP 소켓 프로그래밍

네트워크에서의 소켓은 데이터를 내보내거나 혹은 데이터를 받기 위한 실제적인 창구 역할을 합니다.

TCP 소켓 프로그래밍은 TCP 커넥션이 연결된 클라이언트과 서버의 소켓을 통한 상호작용을 위한 프로그래밍이라 할 수 있습니다.

 

 

위 그림은 서버와 클라이언트가 TCP 소켓 인터페이스를 사용하여 상호작용하는 방법입니다.

 

2. TCP의 성능

HTTP는 TCP 바로 위의 있는 계층이기 때문에 HTTP 트랜잭션의 성능은 그 아래 계층인 TCP 성능에 영향을 받습니다.

 

2.1 HTTP 트랜잭션 지연

트랜잭션을 처리하는 시간은 DNS를 찾고 TCP 커넥션을 설정하고 요청을 전송하고 응답 받는 시간에 비하면 상당히 짧습니다.

그렇기 때문에 대부분의 HTTP 지연은 TCP 네트워크 지연 때문에 발생합니다.

TCP 네트워크 지연은 하드웨어의 성능, 네트워크와 서버의 전송 속도, 요청과 응답 메시지의 크기, 클라이언트와 서버 간의 거리에 따라 크게 달라집니다.

물론 TCP 프로토콜의 기술적인 복잡성도 지연에 큰 영향을 줍니다.

 

2.2 TCP 커넥션 핸드셰이크 지연

핸드셰이크는 TCP의 신뢰성있는 통신 연결과 종료를 위한 통신 방법입니다.

핸드셰이크 종류에는 3-way handshake와 4-way handshake가 있습니다.

 

 

3-way handshake를 기준으로 간단히 설명드리자면,

  • 클라이언트가 커넥션 생성 요청을 서버에 보내고
  • 서버가 요청이 받아들여졌음을 클라이언트에 보내고
  • 클라이언트가 커넥션이 연결됐음을 서버에게 보내는 것입니다.
    클라이언트는 이때 데이터를 함께 보낼 수 있습니다.

어떤 데이터를 전송하든 새로운 TCP 커넥션을 열 때면, TCP 커넥션 핸드셰이크를 하게 됩니다.

그렇게 때문에 작은 크기의 데이터 전송에 커넥션이 사용된다면 HTTP 성능을 크게 저하시킬 수 있습니다.

 

2.3 TCP 느린 시작

TCP 커넥션은 시간이 지나면서 자체적으로 튜닝되어서 처음에는 커넥션의 최대 속도를 제한하고 데이터가 성공적으로 전송됨에 따라서 속도 제한을 높여나갑니다.

이렇게 조율하는 것을 TCP 느린 시작이라고 합니다.

이는 인터넷의 급작스러운 부하와 혼잡을 방지하는데 쓰입니다.

 

2.4 TIME_WAIT

이전 커넥션과 관련된 패킷이 같은 주소와 포트 번호를 가지는 새로운 커넥션에 삽입되는 문제를 방지하기 위해 2분 정도 이내에 같은 주소와 포트 번호를 가지는 커넥션을 생성되는 것을 막아줍니다.

※ 2분은 보통 세그먼트의 최대 생명주기의 두 배 정도이며, 2MSL이라 불립니다.

 

예를 들어, 발신지 IP 주소와 포트, 수신지의 IP가 고정 되어있고 수신지의 포트만 변경할 수 있다고 하면,

수신지의 포트는 제한되어 있기 때문에 TIME_WAIT 상태에 들어가는 포트가 생기는 속도보다 트랜잭션 처리 속도가 느리다면 TIME_WAIT 포트 고갈이 발생합니다.

 

2.5 순차적인 트랜잭션 처리

브라우저가 어떤 페이지를 보여주기 위해 한 개의 HTML을 받기 위한 1개의 HTTP 트랜잭션과 세 개의 이미지를 받기 위한 3개의 HTTP 트랜잭션이 필요할 때, 이를 순차적으로 처리한다면, 각 트랜잭션이 새로운 커넥션을 맺는데 발생하는 시간과 함께 느린 시작 지연이 발생할 것입니다.

 

 

 

※ 이 외에도 네트워크 효율 관련해서 네이글 알고리즘, 확인응답 지연 알고리즘라는 것도 있습니다. 궁금하시다면 검색!

 

3. HTTP 커넥션 관리

커넥션 관리를 잘한다면 TCP 성능이 향상될 수 있습니다.

3.1 Connection 헤더

HTTP는 클라이언트와 서버 사이에 프락시 서버, 캐시 서버 등과 같은 중개 서버가 놓이는 것을 허락합니다.

HTTP 메시지는 클라이언트에서 서버까지 중개 서버들을 하나하나 거치면서 전달됩니다.

 

두 인접한 HTTP 애플리케이션이 현재 맺고 있는 커넥션에만 적용될 옵션을 지정해야 할 때가 있습니다.

이를 위해 전송자가 특정 커넥션에만 해당되는 옵션을 지정하게 해주는 것이 Connection 헤더입니다.

 

예를 들어 서버에 프락시 서버로 HTTP 메시지를 보낼 때, 헤더에 Connection: meter, close, bill-my-credit-card (Meter 헤더가 존재)가 있다고하면, meter 헤더를 다른 커넥션으로 전달하면 안되고 bill-my-credit-card 옵션을 적용할 것이며, 이 트랜잭션이 끝나면 커넥션이 끊길 것임을 의미합니다.

 

3.2 병렬 커넥션

클라이언트의 인터넷 대역폭을 한 개의 커넥션을 다 써버리는 것이 아니라면 남은 대역폭을 사용할 수 있습니다.

그렇기에 클라이언트가 여러 개의 커넥션을 한번에 맺을 수 있고, 이를 통해 여러개의 HTTP 트랜잭션을 병렬로 처리할 수 있습니다.

 

※ 병렬 커넥션에서 각 커넥션 사이에는 소프트웨어와 관련된 지연이 짧게 발생합니다.

 

병렬 커넥션이 일반적으로 더 빠르기는 하지만, 항상 그렇지는 않습니다.

예를 들어, 네트워크 대역폭이 좁을 때 각 커넥션에서 데이터를 전송받는 것은 느리기 때문에 성능상의 장점은 거의 없어집니다.

또한 다수의 커넥션은 메모리를 많이 소모하고 자체적인 성능 문제를 발생시킵니다.

예를 들어, 한 서버에 각 사용자가 많은 커넥션을 맺는다면 서버에 과부하가 걸리기 때문에 서버의 성능을 크게 저하시킵니다.

 

3.3 지속 커넥션

웹 클라이언트는 보통 같은 사이트에 여러 개의 커넥션을 맺습니다.

예를 들어 웹페이지에 첨부된 이미지들은 대부분은 같은 웹 사이트에 있고, 상당 수의 하이퍼링크도 같은 사이트를 가리킵니다.

따라서 서버에 HTTP 요청을 하기 시작한 애플리케이션은 웹페이지 내의 이미지 등을 가져오기 위해서 그 서버에 또 요청하게 될 것입니다.

이 속성을 사이트 지역성(site locality)라 합니다.

 

트랜잭션 처리 후에도 커넥션을 유지하면 이 후의 HTTP 요청에도 재사용할 수 있습니다.

이런 커넥션을 지속 커넥션이라 합니다.

 

지속 커넥션은 클라이언트나 서버가 커넥션을 끊기 전까지는 트랜잭션 간에도 커넥션을 유지합니다.

 

커넥션을 유지함으로써 커넥션을 맺고끊음으로 인한 지연과 TCP 느린 시작으로 인한 지연을 피할 수 있습니다.

 

※ 지속 커넥션은 병렬 커넥션과 함께 사용될 때에 가장 효과적이라 합니다. 그래서 많은 웹 애플리케이션이 적은 수의 병렬 커넥션만을 맺고 그것을 유지한다고 합니다. 이런 커넥션을 파이프라인 지속 커넥션이라 합니다.

 

마치며..

이번 글은 TCP 커넥션에 대한 글입니다.

 

저는 이번 공부에서

  • TCP 커넥션이 무엇인지,
  • TCP 커넥션 연결과정이 어떤지,
  • TCP 소켓 프로그래밍이 무엇인지,
  • 무엇이 TCP 성능에 영향을 끼치지는지,
  • Connection 헤더가 무엇인지,
  • 병렬 커넥션과 지속 커넥션이 무엇이고,
  • 각 커넥션이 어떤 이점이 있고, 어떠한 경우에 단점이 있는지,

를 알아갔습니다.

 

이 글에는 없지만 중간 서버로 멍청한 프락시가 있을 때 Connection 헤더의 문제점, 지속 커넥션의 제한과 규칙, 커넥션 끊기에 대해 알아갔습니다.

추후에 내용이 좀 더 이해가 된다면 추가할 예정입니다. ^-^

※ 지금 당장 그 내용들이 궁금하신 분들은 검색해주세요!

 

 

 

 

 

 

 

 

 

'채워가는 지식 > 네트워크' 카테고리의 다른 글

STOMP 웹소켓 프로그래밍  (0) 2024.02.15
웹 서버  (0) 2023.12.29
HTTP 메시지  (0) 2023.12.18
URL  (1) 2023.12.18
HTTP  (0) 2023.12.15

HTTP 메시지

HTTP 메시지는 HTTP 애플리케이션 간에 주고받은 데이터의 블록들입니다.

이 데이터의 블록들은 메시지의 내용과 의미를 설명하는 텍스트 메타 정보로 시작하고 그 다음에 선택적으로 데이터가 올 수 있습니다.

 

1. 메세지의 흐름

메시지는 클라이언트, 서버, 프락시 사이를 흐릅니다.

메시지의 흐름 방향에는 인바운드, 아웃바운드, 업스트림, 다운스트림라는 용어들이 있습니다.

 

메시지가 원 서버로 항하는 것을 인바운드라 하고, 모든 처리가 끝난 뒤에 메시지가 사용자 에이전트로 돌아오는 것을 아웃바운드라고 합니다.

 

요청 메시지인지 응답 메시지인지 상관없이 모든 메시지는 다운스트림으로 흐릅니다.

즉 메시지의 발송자는 업스트림, 수신자는 다운스트림이라 할 수 있습니다.

 

2. 메시지의 각 부분

메시지는 시작줄, 헤더, 본문으로 세 부분으로 구성되어 있습니다.

시작줄은 이것이 어떤 메시지인지를, 헤더 블록은 속성을, 본문은 데이터를 담고 있습니다.

 

2.1 메시지 문법

요청 메시지의 형식은 다음과 같습니다.

  • start line
    • 메서드(Method)
      클라이언트 측에서 서버가 리소스에 대해 수행해주길 바라는 동작입니다.
      GET, POST 메서드가 해당됩니다.
    • 요청 URL(Path)
      요청 대상이 되는 리소스를 지칭하는 완전한 URL 또는 URL의 경로 구성요소입니다.
    • 버전(Version of the protocol)
      이 메시지에서 사용 중인 HTTP 버전입니다.
  • 헤더들(Headers)
    부가적인 정보들이 들어있습니다.
    이름과 콜론(:) 다음에 오는 값(줄바꿈 없이)으로 구성되어 있는 0개 이상의 헤더들로 구성되어 있습니다.
  • 공백 줄(Blank line)
    헤더가 끝나면 한 줄 띄고 바디가 옵니다.
  • 바디(Body)
    전송하는 데이터가 들어있습니다.
    전송하는 데이터가 없으면 body가 없습니다.

응답 메시지의 형식은 다음과 같습니다.

  • status line
    • 버전(Version of the protocol)
      이 메시지에서 사용 중인 HTTP 버전입니다.
    • 상태 코드(Status code)
      요청 중에 무엇이 일어났는지 설명하는 세 자리의 숫자입니다.
      일반적으로 성공에러를 분류합니다.
    • 상태 텍스트(Status Text)
      숫자로 된 상태 코드의 의미를 사람이 이해할 수 있게 짧게 설명해주는 문구입니다.
  • 나머지는 요청 메시지와 동일합니다.

3. 메서드

클라이언트가 서버에게 어떤 요청을 보내는지 나타냅니다.

 

3.1 안전한 메서드

안전한 메서드는 HTTP 요청의 결과로 인해 서버에 아무런 일도 일어나지 않는 메서드를 말합니다.

보통 GET, HEAD 메서드가 있습니다.

 

3.2 GET

주로 서버에게 리소스를 달라고 요청하는 메서드입니다.

 

3.3 HEAD

GET처럼 행동하지만, 서버는 응답으로 바디없이 헤더만을 돌려줍니다.

 

3.4 PUT

서버가 요청의 본문을 가지고 요청 URL의 이름대로 새 문서를 만들거나, 이미 URL이 존재한다면 본문을 사용해서 교체하는 메서드입니다.

 

3.5 PATCH

리소스의 일부를 교체하기 위한 메서드입니다.

 

3.6 POST

서버에 입력 데이터를 전송하기 위한 메서드입니다.

실제로, HTML 폼을 지원하기 위해 흔히 사용됩니다.

 

3.7 TRACE

클라이언트에게 자신의 요청이 서버에 도달했을 때 어떻게 보이게 되는지 알려주는 메서드입니다.

요청 전송의 마지막 단계에 있는 서버는 자신이 받은 요청 메시지를 본문에 넣어 응답으로 되돌려줍니다.

 

※ TRACE 요청은 어떠한 바디도 보낼 수 없습니다.

 

3.8 OPTIONS

웹 서버에게 특정 리소스에 대해 어떤 메서드가 지원되는지 물어보는 메서드입니다.

 

3.9 DELETE

서버에게 요청 URL로 지정한 리소스를 삭제할 것을 요청하는 메서드입니다.

 

3.10 확장 메서드

HTTP 명세에 정의되어 있지 않은 메서드입니다.

HTTP는 필요에 따라 확장해도 문제가 없도록 설계되어 있습니다.

확장 메서드를 다룰 때는 "엄격하게 보내고 관대하게 받아들여라"라는 오랜 규칙에 따르는 것이 가장 좋다고 합니다.

 

4. 상태 코드

HTTP 상태 코드는 크게 다섯 가지로 나뉩니다.

 

4.1 100번대(1xx): 정보성 상태 코드

임시 응답으로 현재 클라이언트의 요청까지는 처리되었으나 계속 진행하라고 알리는 상태 코드입니다.

 

4.2 200번대(2xx): 성공 상태 코드

클라이언트가 보낸 요청이 성공적으로 처리되었다는 알리는 상태 코드입니다.

 

4.3 300번대(3xx): 리다이렉션 상태 코드

클라이언트가 관심있어 하는 리소스에 대해 다른 위치를 사용하라고 하거나 그 리소스의 내용 대신 다른 대안 응답을 제공하는 상태 코드입니다.

 

리다이렉션 상태 코드 중 몇몇은 리소스에 대한 애플리케이션의 로컬 복사본이 원래 서버와 비교했을 때 유효한지 확인하기 위해 사용됩니다.

예를 들어, HTTP 애플리케이션은 그의 리소스에 대한 로컬 복사본이 여전히 최신인지 혹은 원래 서버에 있는 리소스가 수정되었는지 검사할 수 있습니다.

 

4.4 400번대(4xx): 클라이언트 에러 상태 코드

클라이언트가 잘못 구성된 요청 메시지를 보냈다고 알리는 상태 코드입니다.

 

4.5 500번대(5xx): 서버 에러 상태 코드

서버 자체에서 에러가 발생했음을 알리는 상태 코드입니다.

 

5. 헤더

헤더와 메서드는 클라이언트와 서버가 무엇을 하는지 결정하기 위해 함께 사용됩니다.

헤더는 크게 다섯 가지로 분류됩니다.

 

5.1 일반 헤더

일반 헤더는 클라이언트와 서버 양쪽 모두가 사용합니다.

예를 들어, Date 헤더는 클라이언트와 서버를 가리지 않고 메시지가 만들어진 일시를 지칭하기 위해 사용됩니다.

 

일반 헤더에는 일반 캐시 헤더라는 것도 있습니다.

  • 일반 캐시 헤더
    애플리케이션에게 매번 원 서버로부터 객체를 가져오는 대신 로컬 복사본으로 캐시할 수 있도록 해줍니다.

5.2 요청 헤더

요청 메시지를 위한 헤더입니다.

서버에게 클라이언트가 받고자 하는 데이터의 타입이 무엇인지와 같은 부가 정보를 제공합니다.

예를 들어, Accept 헤더는 서버에게 클라이언트가 자신의 요청에 대응하는 어떤 미디어 타입도 받아들일 것임을 의미합니다.

 

요청 헤더에는 조건부 요청 헤더, 요청 보안 헤더, 프락시 요청 헤더라는 것도 있습니다.

  • 조건부 요청 헤더
    클라이언트는 서버가 요청에 응답하기 전에 먼저 조건이 참인지 확인하게 하는 제약을 포함시킬 수 있습니다.
  • 요청 보안 헤더
    요청하는 클라이언트가 리소스에 접근하기 전에 자신을 인증하게 함으로써 트랜잭션을 약간 더 안전하게 만듭니다.
  • 프락시 요청 헤더
    프락시의 기능을 도와줍니다.

5.3 응답 헤더

응답 메시지를 위한 헤더입니다.

클라이언트에게 정보를 제공합니다.

예를 들어, Sever 헤더는 클라이언트에게 어떤 서버의 몇 버전과 대화하고 있음을 의미합니다.

 

응답 헤더에는 협상 헤더, 응답 보안 헤더라는 것도 있습니다.

  • 협상 헤더
    서버가 협상 가능한 리소스에 대한 정보를 나타냅니다.
    예를 들어, 영어와 한국어로 번역된 HTML 문서가 있는 경우와 같이 여러가지 표현이 가능한 상황에서 서버와 클라이언트가 어떤 표현을 택할 것인가에 대한 협상을 할 수 있도록 지원합니다.
  • 응답 보안 헤더
    요청 보안 헤더와 비슷합니다.

5.4 엔터티 헤더

엔터티 본문에 대한 헤더입니다.

엔터티 본문에 들어있는 데이터에 대한 정보를 제공합니다.

예를 들어, Content-Type 헤더는 애플리케이션에게 데이터가 어떤 타입의 데이터임을 알려줍니다.

 

※ 이 글에서는 엔터티 본문과 바디는 같은 말로 사용했습니다.

 

엔터티 헤더에는 콘텐츠 헤더엔터티 캐싱 헤더라는 것도 있습니다.

  • 콘텐츠 헤더
    엔터티의 콘텐츠에 대한 구체적인 정보를 제공합니다.
    위에 예시로 들었던 Content-Type 헤더가 여기에 포함됩니다.
  • 엔터티 캐싱 헤더
    엔터티 캐싱에 대한 정보를 제공합니다.
    예를 들어, 리소스에 대해 캐시된 사본이 아직 유효한지에 대한 정보와 캐시된 리소스가 더 이상 유효하지 않게 되는 시점을 더 잘 추정하기 위한 단서를 제공합니다.

5.5 확장 헤더

애플리케이션 개발자들에 의해 만들었졋지만 아직 승인된 HTTP 명세에는 추가되지 않은 비표준 헤더입니다.

 

마치며..

이 글은 HTTP 메시지에 대한 다소 간략히 적은 글입니다.


저는 이 글에서

  • 메세지의 흐름에 무엇이 있는지,
  • 요청 메시지와 응답 메시지는 어떤 구조인지,
  • 메서드는 무엇이 있는지와 그 역할들이 무엇인지,
  • 상태 코드 몇번대는 무엇을 나타내는지,
  • 헤더의 역할과 종류는 무엇이 있는지

를 알아가셨으면 좋겠습니다.

 

개인적으로 확장 메서드와 확장 헤더는 그런게 있구나하는 정도로 넘어가시면 될 것 같습니다.

 

개인적으로 본 적이 없는 메서드, 상태 코드 혹은 헤더를 만나게 되더라도 그것이 무엇을 의미하는지는 구글링으로 쉽게 알 수 있기 때문에 상세한 내용은 알 필요 없다고 생각합니다.

 

물론 자주 쓰이는 것은 알고 있으면 좋습니다. ^-^

'채워가는 지식 > 네트워크' 카테고리의 다른 글

웹 서버  (0) 2023.12.29
커넥션  (0) 2023.12.20
URL  (1) 2023.12.18
HTTP  (0) 2023.12.15
네트워크  (0) 2023.09.11

URL

URL은 브라우저가 정보를 찾는데 필요한 리소스의 위치를 나타냅니다.

대부분의 URL은 동일한 구조로 이루어져 있습니다.

때문에 인터넷상의 모든 리소스를 가리키고 가져오기 위해, 그리고 모든 사람이 같은 방식으로 이름을 써서 리소스를 찾을 수 있도록, 단일 방식의 작명 규칙을 가집니다.

 

1. URL 구성

URL은 세부분으로 나눌 수 있습니다.

https://sports.news.naver.com/kbaseball/index

 

 

위의 주소를 예시로 들어보겠습니다.

  • 첫 번째 부분인 https://는 스킴이라 불립니다.
    스킴은 웹 클라이언트가 리소스에 어떤 프로토콜로 접근하는지 알려줍니다.
  • 두 번째 부분인 sports.news.naver.com는 서버의 위치입니다.
    위치는 웹 클라이언트에게 리소스가 어디에 호스팅 되어 있는지 알려줍니다.
  • 세 번째 부분인 /kbaseball/index는 리소스의 경로입니다.
    경로는 서버에게 웹 클라이언트가 요청한 리소스가 무엇인지 알려줍니다.

2. URL 문법

URL 문법은 스킴에 따라 달라지지만, 대부분의 URL은 일반 문법을 사용하기 때문에, 서로 다른 URL 스킴도 형태의 문법면에서 매우 유사합니다.

대부분의 URL 스킴의 문법은 일반적으로 9개 부분으로 나뉩니다.

<스킴>://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>

 

이 모든 컴포턴트를 가지는 URL은 거의 없습니다.

이 중에서 가장 중요하게 생각하는 컴포넌트는 스킴, 호스트, 경로 입니다.

 

2.1 스킴

스킴은 주어진 리소스에 어떻게 접근하는지 알려주는 중요한 정보입니다.

이는 URL을 해석하는 애플리케이션이 어떤 프로토콜을 사용하여 리소스를 요청해야 하는지 알려줍니다.

 

2.2 사용자 이름과 비밀번호

많은 서버가 자신이 가지고 있는 데이터에 접근을 허용하기 전에 사용자 이름과 비밀번호를 요구합니다.

ftp://ftp.prep.ai.mit.edu/pub/gnu

 

예를들어, 위 URL는 사용자 이름과 비밀번호를 요구하는 FTP 프로토콜을 사용하고 있습니다.

위 URL처럼 사용자 이름과 비밀번호를 요구하는 URL 스킴을 사용할 때, URL에 그 값들이 들어 있지 않다면, 기본 사용자 이름과 비밀번호가 값으로 들어가게 됩니다.

 

2.3 호스트와 포트

애플리케이션이 인터넷에 있는 리소스를 찾으려면, 리소스를 호스팅하고 있는 장비와 그 장비 내에서 리소스에 접근할 수 있는 서버가 어디에 있는지 알아야 합니다.

호스트와 포트는 그 정보들을 제공합니다.

 

호스트 컴포넌트는 접근하려고 하는 리소스를 가지고 있는 인터넷상의 호스트 장비를 가리킵니다.

같은 호스트여도 호스트명과 IP 주소로 나타내는 두가지 방법이 있습니다.

 

포트 컴퍼넌트는 서버가 열어놓은 네트워크 포트를 가리킵니다.

내부적으로 TCP 프로토콜을 사용하는 HTTP는 기본 포트로 80을 사용합니다.

 

2.4 경로

경로 컴포넌트는 리소스가 서버의 어디에 있는지 알려줍니다.

HTTP URL에서는 '/' 문자를 기준으로 경로조각으로 나뉩니다.

각 경로조각은 자체만의 파라미터 컴포넌트를 가질 수 있습니다.

 

2.5 파라미터

파라미터 컴포넌트는 '키=값' 쌍의 리스트로 URL 나머지 부분들로부터 ';' 문자로 구분합니다.

이를 통하여 애플리케이션이 리소스에 접근하는데 필요한 어떤 추가 정보든 전달할 수 있습니다.

 

http://www.daco/info;type=a/index.html;graphics=true

 

위의 URL를 예시로 들면, info 경로조각에는 값이 a인 type 파라미터와 index.html 경로조각에는 값이 true인 graphics 파라미터를 가지고 있습니다.

 

2.6 질의

질의 컴포넌트는 데이터베이스 같은 서비스들이 요청받을 리소스 형식의 범위를 좁히기 위해서 사용됩니다.

URL에서 '?' 문자 뒤에 있는 값들입니다.

 

질의 컴포넌트 포맷은 사용하면 안되는 특정 문자들을 제외하면 제약사항은 없습니다.

그렇지만 편의상 많은 게이트웨이가 '&' 문자로 나뉜 '키=값' 쌍 형식을 원합니다.

 

http://www.daco/info/index.html?item=1&color=black

 

위의 예시 URL에는 item=1, color=black이라는 두 개의 질의 컴포넌트가 있습니다.

 

2.7 프래그먼트

프래그먼트 컴포넌트는 리소스의 특정 부분을 가리킬 수 있도록 해줍니다.

즉, URL은 HTML 문서에 있는 특정 이미지나 일부분을 가리킬 수 있습니다.

URL에서 '#' 문자에 이어서 옵니다.

 

일반적으로 HTTP 서버는 객체 일부가 아닌 전체만 다루기 때문에 클라이언트는 서버에 프래그먼트를 전달하지 않습니다.

 

http://www.daco/info/index.html#intro

 

위의 예시 URL는 intro라는 프래그먼트 컴포넌트가 있습니다.

브라우저는 서버로부터 전체 리소스를 내려받은 후, 프래그먼트를 사용하여 보고자 하는 리소스의 일부를 보여줍니다.

 

※ 예시로 더 설명드리자면, 웹 페이지에서 info라는 리소스가 있는 곳으로 스크롤이 이동하는 것입니다.

 

3. 단축 URL

웹 클라이언트는 몇몇 단축 URL을 인식하고 사용합니다.

상대 URL은 리소스 안에 있는 리소스를 간결하게 기술하는데 사용할 수 있습니다.

많은 브라우저가 사용자가 기억하고 있는 URL 일부를 입력하면 나머지 부분을 자동으로 입력해주는 URL 자동 확장을 지원합니다.

 

3.1 상대 URL

URL은 상대 URL과 절대 URL로 2가지로 나뉩니다.

2. URL 문법에서 다뤘던 URL은 모두 절대 URL 입니다.

절대 URL은 접근하는데 필요한 모든 정보를 가지고 있습니다.

그와 달리 상대 URL은 모든 정보를 담고 있지는 않습니다.

상대 URL로 리소스에 접근하는데 필요한 모든 정보를 얻기 위해서는 기저(base)라는 다른 URL을 사용해야 합니다.

상대 URL은 프래그먼트이거나 URL 일부입니다.
URL을 처리하는 브라우저 같은 애플리케이션은 상대 URL과 절대 URL 간에 상호 변환할 수 있어야 합니다.

 

상대 URL을 사용하면 HTML 페이지 같은 리소스 집합을 쉽게 변경할 수 있습니다.

 

3.2 URL 확장

어떤 브라우저들은 URL을 입력한 다음이나 입력하고 있는 동안에 자동으로 URL을 확장합니다.

자동으로 URL이 확장되기 때문에 사용자는 URL 전체를 타이핑하지 않아도 URL을 빠르게 입력하게 도와줍니다.

 

확장 기능은 호스트 명 확장, 히스토리 확장 두 가지로 나뉩니다.

 

3.2.1 호스트 명 확장

호스트 명 확장 기능을 지원하는 브라우저는 단순한 휴리스틱만을 사용해서 입력한 호스트명을 전체 호스트 명으로 확장할 수 있습니다.

예를 들어, 주소 입력란에 'naver'을 입력하면, 브라우저는 호스트 명에서 자동으로 'www.'와 '.com'을 붙여서 'www.naver.com'을 만들어줍니다.

 

※ 어떤 브라우저는 'naver'란 단어를 포함한 사이트를 찾지 못하면, 확장을 포기하기 전에 몇 가지의 URL을 추가로 제시합니다.

 

3.2.2 히스토리 확장

히스토리 확장은 과거에 사용자가 방문했던 URL의 기록을 저장해 놓은 것을 이용한 것입니다.

예를 들어, 이전에 방문 했던 URL의 시작 부분을 입력하면, 브라우저가 전체 URL를 보여주고 사용자가 선택 하는 것입니다.

 

4. 안전하지 않은 문자

안전한 전송이란, 정보가 유실될 위험 없이 URL을 전송할 수 있다는 것을 의미합니다.

 

전자메일에 사용되는 SMTP같은 프로토콜은 특정 문자를 제거할 수도 있는 전송 방식을 사용합니다.

 

※ 7비트 인코딩을 사용하고 있는 프로토콜에 8비트 이상으로 인코딩된 정보가 있으면 소실될 수 있습니다.


그렇기에 URL은 상대적으로 작고 일반적으로 안전한 알파벳 문자만 포함하도록 허락했습니다.

 

하지만 이후에 URL에 이진데이터나 안전한 알파벳 외의 문자도 포함하기 위해 이스케이프라는 기능을 추가하여, 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 됐습니다.

 

4.1 URL 문자 집합

역사적으로 많은 컴퓨터 애플리케이션이 US-ASCII 문자 집합을 사용해왔습니다.

US-ASCII는 7비트를 사용하여 영문 자판에 있는 키 대부분과 몇몇 출력되지 않는 제어 문자를 표현합니다.

 

US-ASCII는 적은 수의 문자만을 포함하고 있어서 지원하지 못하는 언어들이 존재했고, 이진 데이터를 포함해야하는 경우도 있었기 때문에 이를 지원하기 위해 이스케이프 문자열이 생겼습니다.

 

이스케이프 문자열은 US-ASCII에서 사용이 금지된 문자들로, 특정 문자나 데이터를 인코딩할 수 있게 함으로써 이동성과  완성도를 높였습니다.

 

4.2 인코딩 체계

안전하지 않은 문자를 '%'로 시작해, ASCII 코드로 표현되는 두 개의 16진수 숫자로 이루어진 이스케이프 문자로 바꿉니다.

 

※ 이스케이프 문자로 바꾸기 위한 '%' 가 아닌 '%'를 그대로 보여주기 위해 사용할 땐 %25로 바꿉니다.

 

4.3 문자 제한

몇몇 문자는 URL 내에서 특별한 의미로 예약되어 있습니다.

그렇기에 URL에서 예약된 문자들을 본래의 목적이 아닌 다른 용도로 사용하려면, 그 전에 반드시 이스케이프 인코딩을 해야 합니다.

 

마치며..

이번 글에서는 URL에 대해 다루었습니다.

 

개인적으로 이글에서

  • URL 구성과 문법이 어떻게 되어있는지,
  • 상대 URL과 기저 URL과 절대 URL이 무엇인지,
  • URL 확장에는 무엇이 있는지,
  • 이스케이프 용도는 무엇인지

를 알아 가셨으면 좋겠습니다.

 

부족한 글을 읽어주셔서 감사합니다 ^-^

'채워가는 지식 > 네트워크' 카테고리의 다른 글

커넥션  (0) 2023.12.20
HTTP 메시지  (0) 2023.12.18
HTTP  (0) 2023.12.15
네트워크  (0) 2023.09.11
OSI 7계층 모델, TCP/IP 4계층 모델  (0) 2023.06.22

http를 안다고하면 다음과 같은 질문에 답할 수 있어야 한다고 생각합니다.

  • 얼마나 많은 클라이언트와 서버가 통신하는지
  • 리소스가 어디서 오는지
  • 웹 트랜잭션이 어떻게 동작하는지
  • HTTP 통신을 위해 사용하는 메시지의 형식
  • HTTP 기저의 TCP 네트워크 전송
  • 여러 종류의 HTTP 프로토콜
  • 인터넷 곳곳에 설치된 다양한 HTTP 구성요소

HTTP

HTTP는 전 세계의 웹 서버로부터 이 대량의 정보를 빠르고, 간편하고, 정확하게 사람들의 PC에 설치된 웹브라우저로 옮겨줍니다.

그리고 HTTP는 신뢰성 있는 데이터 전송 프로토콜을 사용하기 때문에, 데이터가 지구 반대편에서 오더라도 전송 중 손상되거나 꼬이지 않음을 보장합니다.

1. 웹 클라이언트와 서버

웹 콘텐츠는 웹 서버에 존재합니다.

웹 서버는 HTTP 프로토콜로 의사소통하기 때문에 HTTP 서버로도 불립니다.

이들 웹 서버는 인터넷의 데이터를 저장하고, HTTP 클라이언트가 요청한 데이터를 제공합니다.

2. 리소스

웹 서버는 웹 리소스를 관리하고 제공합니다.

리소스는 정적 파일일 수도 있고, 요청에 따라 콘텐츠를 생산하는 프로그램이 될 수도 있습니다.

요약하자면, 어떤 종류의 콘텐츠 소스도 리소스가 될 수 있습니다.

 

2.1 미디어 타입

인터넷은 수천 가지 데이터 타입을 다루기 때문에, HTTP는 웹에서 전송되는 객체 각각에 신중하게 MIME 타입이라는 데이터 포맷 라벨을 붙입니다.

그렇기에 웹 서버는 모든 HTTP 객체 데이터에 MIME 타입을 붙이고 웹 브라우저는 서버로부터 객체를 돌려받을 때, 다룰 수 있는 객체인지 MIME 타입을 통해 확인합니다.

 

MIME 타입은 /로 구분된 주 타입과 부 타입으로 이루어진 문자열 라벨입니다.

  • HTML로 작성된 문서는 text/html
  • JPEG 이미지는 image/jpeg

이 외에도 많고, 보내려는 데이터를 어떤 MIME 라벨이 붙어야 되는지는 필요할 때마다 찾아보시면 됩니다.

 

2.2 URI

URI는 인터넷의 우편물 주소 같은 것으로, 정보 리소스를 고유하게 식별하고 위치를 저장할 수 있습니다.

예를 들어 웹 서버에 있는 이미지 리소스에 대한 URI라면 다음과 같습니다.

http://www.daco.com/intro/hi.gif

 

※ URI는 URL과 URN을 포함하는 상위 개념입니다.

2.3 URL

URL은 리소스 식별자의 가장 흔한 형태입니다.

URL은 특정 서버의 한 리소스에 대한 구체적인 위치를 서술합니다.

그렇기에 리소스가 정확히 어디에 있고 어떻게 접근할 수 있는지 분형히 알려줍니다.

 

대부분의 URL은 세 부분으로 이루어진 표준 포맷을 따릅니다.

  • 첫 번째 부분은 스킴이라고 불리는데, 리소스에 접근하기 위해 사용되는 프로토콜을 서술합니다.
    ex) http://
  • 두 번째 부분은 도메인 이름 혹은 호스트 명이라고 불리는데, 서버의 인터넷 주소를 제공합니다.
    ex) www.daco.com
  • 세 번째 부분은 웹 서버의 리소스를 가리킵니다.
    ex) /intro/hi.gif

대부분 URI는 URL처럼 사용합니다.

2.4 URN

URN은 콘텐츠를 이루는 한 리소스에 대해, 그 리소스의 위치에 영향 받지 않는 유일무이한 이름 역할을 합니다.

예를 들어, 인터넷 표준 문서 RFC 2648를 나타내는 URN은 다음과 같습니다.

urn:ietf:rfc:2648

 

이해가 잘 안되신다면 URN은 잘 쓰이지 않기 때문에 이런게 있구나하고 넘어가시면 됩니다.

 

3. 트랜잭션

HTTP 트랜잭션은 요청 명령과 응답 결과로 구성되어 있습니다.

 

3.1 메서드

HTTP는 HTTP 메서드라고 불리는 여러 가지 종류의 요청 명령을 지원합니다.

 

3.2 상태 코드

모든 HTTP 응답 메시지는 상태 코드와 함께 반환됩니다.

 

4. 메세지

HTTP 메시지는 단순한 줄 단위의 문자열입니다.

HTTP 메시지에는 요청 메시지와 응답 메시지가 있습니다.

 

위의 그림 처럼 HTTP 메시지는 다음의 세 부분으로 이루어집니다.

  • 시작줄
    메시지의 첫 줄은 요청이라면 무엇을 해야하는지, 응답이라면 무슨 일이 일어났는지 나타냅니다.
  • 헤더
    시작줄 다음에는 0개 이상의 헤더 필드가 이어집니다.
    각 헤더 필드는 쉬운 구문분석을 위해 :으로 구분되어 있는 하나의 키 값으로 구성됩니다.
    헤더는 초록색 박스처럼 빈 줄로 끝납니다.
  • 본문
    빈 줄 다음에는 어떤 종류의 데이터든 들어갈 수 있는 메시지 본문이 필요에 따라 올 수 있습니다.

5. TCP 커넥션

TCP는 인터넷 전송 프로토콜 중 하나로 전송 제어 프로토콜입니다.

메시지가 TCP 커넥션을 통해서 한 곳에서 다른 곳으로 옮겨갈 수 있습니다.

 

5.1 TCP/IP

HTTP는 애플리케이션 계층 프로토콜로써, 네트워크 통신의 핵심적인 세부사항에 대해서 신경 쓰지 않습니다.

대신 대중적이고 신뢰성 있는 인터넷 전송 프로토콜인 TCP/IP에게 맡깁니다.

 

TCP는 다음과 같은 특징이 있습니다.

  • 오류없는 데이터 전송
  • 언제나 보낸 순서대로 도착
  • 언제든 어떤 크기로든 전송 가능

TCP/IP는 TCP와 IP가 층을 이루는, 패킷 교환 네트워크 프로토콜의 집합입니다.

TCP/IP는 각 네트워크와 하드웨어의 특성을 숨기고, 어떤 종류의 컴퓨터나 네트워크든 서로 신뢰성 있는 의사소통을 하게 해줍니다.

 

※ TCP는 IP 위의 계층

 

5.2 IP 주소와 포트번호

HTTP 클라이언트가 서버에 메시지를 전송할 수 있게 되기 전에, 인터넷 프로토콜(IP) 주소와 포트번호를 사용해 클라이언트와 서버 사이에 TCP/IP 커넥션을 맺어야 합니다.

http://145.32.211.22:80/index.html

 

위와 같은 URL이 있다고 하면 IP 주소는 145.32.211.22, 포트번호는 80입니다.

 

※ 글자로 된 도메인 이름 또는 호스트 명은 URL에 대한 이해하기 쉬운 형태의 별명이라 보시면 됩니다.

 

6. 프로토콜 버전

프로토콜 버전은 크게 0.9, 1.0, 1.1, 2.0, 3.0이 있습니다.

 

HTTP/0.9

간단한 HTML 객체를 받아오기 위해 만들어졌습니다.

 

HTTP/1.0

버전 번호, HTTP 헤더, 추가 메서드, 멀티미디어 객체 처리 추가

 

HTTP/1.1

기존 HTTP 설계의 구조적 결함 교정, 두드러진 성능 최적화, 잘못된 기능 제거에 집중

 

HTTP/2.0

기존 HTTP/1.x 버전의 성능 향상에 초점을 둔 프로토콜

 

HTTP/3.0

QUIC을 기반으로 나온 새로운 HTTP 메이저 버전

 

※ QUIC는 구글에서 개발한 UDP 기반의 전송 프로토콜입니다.

 

7. 웹의 구성요소

웹의 구성요소로 프락시, 캐시, 게이트웨이, 터널, 에이전트가 있습니다.

 

7.1 프락시

프락시는 클라이언트와 서버 사이에 위치한 HTTP 중개자입니다.

웹 보안, 애플리케이션 통합, 성능 최적화를 위한 중요한 구성요소입니다.

주로 보안을 위해 사용됩니다.

 

7.2 캐시

웹 캐시와 캐시 프락시는 자신을 거쳐 가는 문서들 중 자주 찾는 것의 사본을 저장해 두는, 특별한 종류의 HTTP 프락시 서버입니다.

멀리 떨어진 웹 서버보다 근처의 캐시에서 훨씬 더 빨리 문서를 받을 수 있습니다.

 

7.3 게이트웨이

게이트웨이는 다른 서버들의 중개자로 동작하는 특별한 웹 서버입니다.

주로 HTTP 트래픽을 다른 프로토콜로 변환하기 위해 사용됩니다.

7.4 터널

터널은 단순히 HTTP 통신을 전달하기만 하는 특별한 프락시입니다.

7.5 에이전트

에이전트는 사용자를 위해 자동화된 HTTP 요청을 만드는 준지능적 웹클라이언트 프로그램입니다.

자동화된 에이전트는 스파이더 또는 웹로봇라는 이름을 갖고 있습니다.

스파이더는 웹을 돌아다니며 전 세계의 웹페이지를 수집합니다.

 

마치며...

http에 대한 기본적인 내용만을 다루었기에,  이 글은 가볍게 봐주셨으면 좋겠습니다.

각 내용에 대한 좀 더 자세한 글은 책을 공부하며 추후에 쓸 예정입니다. ^-^

'채워가는 지식 > 네트워크' 카테고리의 다른 글

HTTP 메시지  (0) 2023.12.18
URL  (1) 2023.12.18
네트워크  (0) 2023.09.11
OSI 7계층 모델, TCP/IP 4계층 모델  (0) 2023.06.22
VPC  (0) 2023.03.31

+ Recent posts