애정코딩 💻

BASIC 2021.05.03 댓글 0 Joana

03. HTTP 웹 기본 지식 - 모든것이 HTTP

2021.05.03 - [BASIC] - 01. HTTP 웹 기본 지식 - 인터넷 네트워크

2021.05.03 - [분류 전체보기] - 02. HTTP 웹 기본 지식 - URI

 

HTTP - HyperText Transfer Protocol

HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON, XML 등등 거의 모든 형태의 데이터 전송이 가능하다.

서버간에 데이터를 주고 받을 때도 대부분 HTTP를 사용한다.

 

HTTP의 발전

 

HTTP/0.9(GET만 지원 HTTP 헤더 X)

-> HTTP/1.0 (메서드, 헤더 추가)

-> HTTP/1.1 (가장 많이 사용, 가장 중요한 버전)   -> TCP기반 프로토콜

-> HTTP/2 (성능개선)  -> TCP기반 프로토콜

-> HTTP/3 (진행중: TCP 대신에 UDP사용, 성능 개선)  -> UDP기반 프로토콜

 

클라이언트 / 서버 구조

Request / Response구조

 

1. 클라이언트는 서버에 요청을 보내고, 응답이 올때 까지 대기

2. 서버가 요청에 대한 결과를 만들어서 응답한다.

 

서버와 클라이언트가 하나로 되어있다가 분리되었다. 

-> 데이터는 서버가 집중, 사용성은 클라이언트가 집중하여 독립적으로 집중이 가능하다.

 

예 ) 서비스 트래픽이 갑자기 튈 때 클라이언트 수정 필요 없이 서버에서 아키텍쳐 변경으로 해결할 수 있다.

 

1. 무상태 프로토콜 

 

무상태는 무슨뜻일까?

Stateful과 Stateless의 차이

Stateful -> 클라이언트의 상태를 보존하여 다음 요청이 들어와도 클라이언트의 상태를 알 수 있다.

Stateless -> 응답 서버를 쉽게 바꿀 수 있다. 

                -> 클라이언트의 상태를 보존하지 않기 때문에  무한 서버 증설이 가능하다.

                -> 클라이언트의 상태를 보존하지 않아 추가 데이터를 주지않으면 모른다.

 

예를 들어보면 session 로그인을 사용했을 때 서버에서 session을 저장한다.

하지만 token을 사용한다면 서버에서 클라이언트의 정보를 모르기 때문에 Request 마다 token을 확인하여 클라이언트의 정보를 식별한다.

 

- 서버가 클라이언트의 생태를 보존하지 않는다

- 서버 확장성이 높다 ( 스케일 아웃 )

- 하지만 클라이언트가 추가 데이터를 전송해야한다. ( 많은 데이터를 보내야 함 )

- 로그인한 사용자의 경우 로그인 했다는 상태를 유지 하기 어렵다

   -> 브라우저의 쿠키와 서버의 세션을 조합하여 사용한다. -> 상태 유지는 최소한만 사용

 

   -> 무슨뜻일까?

사용자가 웹서버에 접근 할때 보내는 Request Header 쿠키에 사용자를 식별할 수 있는 세션ID값을 집어 넣어 이 ID의 존재여부를 통해 사용자 식별 및 상태 유지를 도와주는 방법을 세션이라고 한다.

세션ID는 단순히 사용자를 식별할 수 있는 의미없는 문자만들로 만들어져 쿠키와 서버 저장소에 동시에저장되고, 클라이언트의 Request마다 세션ID를 서버측에 저장된 세션ID와 비교하여 식별된다.

출처 medium.com/@ddinggu/session을-활용한-로그인-상태유지-df31db7f1089

 

문제점은 서버에서 많은 세션의 정보를 저장하고 있어야 하기 때문에 속도이슈가 발생할 수 있다.

세션을 저장하는 서버를 두거나, 토큰 기반 서버를 구축하는것도 방법이다. 예) jwt

 

 

2. 비 연결성

 

연결을 유지하는 모델일 경우 서버 자원이 계속 소모하지만

연결을 유지하지 않는 비 연결성 모델은 최소한의 자원을 유지하고 요청할 때만 연결한다.

- HTTP 는 기본적으로 연결을 유지하지 않는 모델이다.

- 일반적으로 초 단위 이하의 빠른 속도로 응답한다.

- 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 적다. -> 한 요청을 연속해서 보내지 않는 이상

- 서버 자원을 매우 효율적으로 사용할 수 있다.

 

하지만 요청이 있을 때 마다 

TCP/IP 연결을 새로 맺어야 한다.

웹 브라우저로 사이트를 요청하면 HTML, javascript, css, img  등 수많은 자원이 함께 다운로드 된다. -> HTTP 지속 연결로 문제 해결

 

HTTP 초기 - 연결 종료를 반복하여 자원낭비

모든 개발자를 위한 HTTP - 김영한 / 인프런

 

HTTP 현재 - 지속 연결

HTML 정보를 모두 받을 때 까지 지속 연결을 통해 데이터를 받는다.

모든 개발자를 위한 HTTP - 김영한 / 인프런

 

 

HTTP 메시지의 구조

 

요청 메시지

start-line 시작라인                  GET /search?q=heelo&hl=ko HTTP/1.1     HTTP 메서드, 요청대상, HTTP Version

header 헤더                            Host: www.google.com

empty line 공백라인(crlf)

message body                        POST일 경우 BODY, 물론 GET도 되지만 권장하지 않음.

 

응답 메시지

start-line 시작라인                  HTTP/1.1 200 OK                                     HTTP Version, HTTP 상태코드, 이유 문구

header 헤더                            Content-Type: text/html;charset=UTF-8

                                               Content-Length: 3423

empty line 공백라인(crlf)

message body                        <html> <body>...</body></html>

 

 

header의 용도

HTTP 전송에 필요한 모든 부가정보가 포함되어있다. 예를들어 메시지 바디의 내용, 바디의 크기, 압축, 인증, 요청 클라이언트 정보, 캐시 관리 정보 등등.. 필요시 임의의 헤더 추가도 가능하다.

 

body의 용도

실제 전송할 데이터를 포함한다. HTML 문서, 이미지, 영상, JSON 등등 ...

단순하며 확장가능하다 

 

반응형