System/Linux

[Linux] HTTP

Yoonsoo Park 2024. 10. 17. 11:21
더보기

1. 웹 서비스에 사용되는 프로토콜: HTTP(HyperText Transfer Protocol)

 HTTP(hypertext transfer protocol)응용 계층(application, L7)의 프로토콜HTML(HyperText Markup Language)를 전송하는 데 사용되는 프로토콜이다. 최근에는 HTML 이외에도 모든 웹 관련 API 통신에 이용되고 있다. HTTP는 기본적으로 비연결성(Connectionless), 무상태성(Stateless) 특성을 가지고, 요청(request)/응답(response) 동작에 기반하여 아주 단순한 방식으로 서비스를 제공한다. 하지만 HTTP 통신은 신뢰성 있는 데이터 통신이 필요하기 때문에 전송 계층(transfer, L4) 프로토콜인 TCP 위에서 동작하며, 뒤에서 언급할 HTTP의 버전 중 HTTP/1.1 이후에는 상시 연결(persistent connection)이 지원된다. 

 

HTTP와 HTTPS(HTTP 프로토콜을 SSL/TLS를 이용해 암호화한 프로토콜)은 서비스 포트로 각각 TCP 80/443을 사용한다. HTTP의 버전에는 HTTP/0.9, HTTP/1.0, HTTP/1.1, HTTP/2.0, HTTP/3.0 등이 있다. 다음 정리를 참고하자. 

 

HTTP의 버전과 특징

*0.9는 완전 초기 버전이라 따로 설명하지 않겠다 

 

1) HTTP/1.0

  • 헤더 지원: 요청과 응답에서 헤더를 사용할 수 있게 되어, 다양한 메타데이터를 교환 가능해졌다
  • GET, POST 메소드 사용 가능 (뒤의 메소드에서 더 자세히 다루겠다)
  • 상태 코드: 서버 응답에 상태 코드를 추가해, 요청이 성공했는지 실패했는지를 알 수 있게 했다
  • 요청/응답 마다 새로운 TCP 연결을 해야해서 비효율적이다

 

2) HTTP/1.1

  • 상시 연결(Persistent Connection): 한 번의 TCP 연결을 여러 요청에 재사용할 수 있어 성능이 향상되었다
  • Proxy Server를 지원한다
  • Cache: Web Cache 지원으로 체감속도와 보안성이 향상되었다

 

3) HTTP/2.0

  • 멀티플렉싱(Multiplexing): 하나의 TCP 연결에서 여러 요청과 응답을 동시에 처리할 수 있어 성능이 크게 향상되었
  • 이진 포맷 사용: HTTP/2는 텍스트 기반이 아닌 이진 형식으로 데이터를 전송해 더 빠르고 효율적인 전송이 가능해졌다

4) HTTP/3.0

  • TCP 대신 UDP 위에서 작동하는 QUIC라는 새로운 전송 프로토콜을 사용한다
  • 전송 방식 멀티 플랙싱이라는 부분에서는 HTTP/2.0과 유사하지만, QUIC를 사용하여 더 빠르고, 신뢰성도 보장되는 버전이다. 
  • HTTPS의 경우 TWHS의 뒤에 TLS 핸드쉐이크를 하는데, HTTP/3.0에서는 이 두 핸드쉐이크가 통합되었다. 

 

 

 HTTP는 MIME 타입과 content-type 헤더를 사용할 수 있다. 여기서 MIME(Multipurpose Internet Mail Extentions)인터넷의 다양한 종류의 데이터를 어떻게 식별하고 전달할지에 대한 표준이다. HTTP는 MIME 타입을 명시함으로서 클라이언트(웹 브라우저..)가 어떤 종류의 데이터를 수신하고 있는지 알 수 있게 하고, HTML, 이미지 등을 올바르게 처리하고 표시할 수 있게 한다. MIME의 다양한 타입들에 대해 궁금하다면 아래 참고 자료를 펼쳐보자.

 

더보기

MIME의 주요 타입들

 

 

  • text/plain: 일반 텍스트 파일
  • text/html: HTML 문서
  • image/jpeg: JPEG 이미지
  • image/png: PNG 이미지
  • application/json: JSON 형식의 데이터
  • application/xml: XML 형식의 데이터
  • audio/mpeg: MP3 오디오 파일
  • video/mp4: MP4 비디오 파일

 

 

 

2. HTTP Request/Response Message 구성

앞서 HTTP는 요청(request)/응답(response) 방식으로 통신한다고 언급하였다. 이제 요청/응답 메세지의 형식(구성)에 대해 알아보자.

 

1) HTTP Request Message 구성

<HTTP 요청 메세지 레이아웃과 실제 패킷 구성>

 

HTTP 요청 메세지는 다음과 같이 request line, headers, body로 구성되어 있다. request line부터 하나씩 보자. 

 

1. Request Line

 

메소드(Method)

  • 서버에서 무엇을 할지 정의하는 명령어(서버에 ~해줘)
  • 주요 메소드 
    • GET: 클라이언트가 서버로부터 자원(문서, 이미지, 영상)을 읽어오려고 할 때 사용
    • POST: 클라이언트가 서버에 데이터를 전송하고, 처리를 요청할 때 사용

URL(Uniform Resource Locator)

  • 기본 형식: Protocol://Host:Port/Path  
    • Protocol: HTTP, HTTPS
    • Host: IP 주소, FQDN
    • Port: 해당 프로토콜의 기본 포트를 사용하지 않는 경우 지정 가능
    • Path: 서버 내에서의 경로 
  • ex) http://www.daum.net/test.html
  • 풀이: www.daum.net 웹서버에 기본포트(80) 접속하고 http 프로토콜을 사용하여 서버의 DocumentRoot 있는 test.html 파일을 다운로드 받고 싶다

HTTP Version 

  • 사용할 HTTP 버전을 알리는 역할

 

2. Headers

 

헤더는 요청에 대한 추가적인 정보들을 전달한다. 각 헤더는 키-값 쌍과 개행 문자로 구성되어 있다.

 

주요 헤더들

  • Host: 브라우저 주소 창에 입력한 서버의 이름(FQDN, IP)가 기재 
  • User-Agent: 클라이언트(브라우저..)의 종류/버전 정보
  • Content-Type: 요청에 포함된 데이터의 MIME type 명시
  • Accept: 클라이언트가 수신 가능한 콘텐츠 유형 명시
  • Accept-Language: 클라이언트가 처리할 수 있는 언어를 서버에 알림
  • Accept-Incoding: 클라이언트가 처리할 수 있는 데이터 인코딩(압축) 방식을 서버에 알림
  • Referrer: 요청된 URL을 참조하는 문자의 URL에 전달
  • If-modified-since: 클라이언트의 캐시를 사용할지 캐시 된 데이터의 날짜로 확인하는 것으로, 이 헤더가 없으면 서버를 처음 방문한 것으로 여기고 데이터를 새로 보내줌
  • If-none-match: 브라우저 캐시를 사용할지 말지를 캐시된 데이터의 고유번호로 확인

 

3. Blank Line, Body

  • Blank Line: Headers와 Body 부분을 구분해 주기 위한 공란 
  • Body: 주로 POST 메소드를 사용하여 서버로 데이터를 적재하는 부분

 

2) HTTP Response Message 구성

<HTTP 응답 메세지의 구성과 실제 패킷>

 

HTTP 응답 메세지는 다음과 같이 Status Line, Headers, Body로 구성되어 있다. 

 

1) Status Line 

 

HTTP Version 

  • 사용할 HTTP 버전을 알리는 역할

Status Code

  • 서버가 클라이언트의 요청에 응답할 때, 요청에 대한 처리 상태를 알리는 목적의 코드
  • 상태 코드는 세 자리 숫자로 구성되며, HTTP 처리에 관한 고유의 정보를 의미한다
  • 코드 범위와 의미 (더 자세한 내용은 아래 자료를 참고하자)
    • 200~299 : 클라이언트 요청에 심각한 문제가 없고, 처리에도 큰 문제가 없었다
    • 300~399 : 클라이언트 요청에는 큰 문제가 없었으나, 서버가 서비스할 수 없다
    • 400~499 : 클라이언트가 요청한 내용에 문제가 있어 응답이 불가 ex) 문법 문제, 권한 문제..
    • 500~599 : 클라이언트 요청에는 큰 문제가 없으나 오류가 발생해 처리할 수 없다

Status Phrase

  • 상태 코드에 대한 보조 설명
더보기

주로 나오는 Status Code & Phrase 상세 설명

 

Success
200 OK
Client의 요청이 성공적이었으며,  
Server는 요청한 Data를 포함하여 정상적으로 응답함 
Redirection
301 Moves Permanently
요청한 URL은 더 이상 안써… 주소 바꼈어. 완전히 이전했어. 바뀐주소 알려줄테니 가봐. 
Location 헤더에 변경된 주소를 적어서 알려준다. 
302 Found
요청한 URL 임시로 변경됐어...임시주소 알려줄테니 가봐… 
Location 헤더에 변경된 주소를 적어서 알려준다. 
304 Not Modified
If-Modified-Since 헤더에 대한 응답 코드로 
지정한 날짜 이래로 수정되지 않음 
Client Error
400 Bad Request  Client의 요청에 문법적 오류가 있음.
401 Unauthorized  웹서비스에 로그인(인증)하는 과정에서 실패했을  
403 Forbidden  요청한 문서에 대해서 권한이 없어서   없어.... 
404 Not Found  니가 요청한 웹문서가 서버에 다고 
408 Request Time-out  너(Client)의 모든 요청이 지정된 시간안에 처리가안됐어..너무 오래걸려
Server Error
500 Internal Server Error 서버에서 클라이언트의 요청을 처리하던 중에 오류가 발생하여 멈추거나 오작동하는 상태. 
501 Not Implemented  Client의 요청을 Server에서 수행할 수 없음 
502 Bad Gateway Server가 다른 Server로부터 응답이 적절치 않음 
503 Service Unavailable Service를 일시적으로 제공하지 못하는 상태 (접속자 폭증 또는 자원의 일시적인 부족 ) 
**DoS, DDoS 공격 시 나타나는 현상

 

2. Headers

  • 요청 메세지와 동일한 구조 
  • 주요 헤더들
    • Server : 브라우저에게 서버의 종류와 버전 등을 알리기 위해 사용. Server Name과 Version를 표시한다
    • Set-Cookie : URL을 위해 보유한 정보의 이름/값을 표시한다
    • Date : 날짜를 표시한다  

 

3. Body 

  • 요청한 리소스나 데이터가 포함(JSON, HTML..)

 

 

 

 힘들지만 오늘도 해낸 나를 위한 한 마디,

"유쾌하면서도 가볍지 않을 것, 할 말은 할지라도 사려 깊은 태도를 가질 것, 말이 아닌 행동으로 승리하는 사람이 될 것"

 

 

 

'System > Linux' 카테고리의 다른 글

[Linux] Local Repository 만들기  (2) 2024.10.16
[Linux] e-mail(Mail Server)  (8) 2024.10.09
[Linux] FTP  (1) 2024.10.07
[Linux] DNS part 2  (2) 2024.10.03
[Linux] DNS part 1  (0) 2024.10.01