| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자료구조
- URL
- servlet
- URN
- 과장님 죄송했어요
- port
- 배열
- 객체
- 생성자
- Class
- Hashtable
- 김영한님의 모든 개발자를 위한 HTTP 웹 기술 인강 꼭 들어보세요
- array
- URI
- queue
- 기본은 충실히
- 연결 리스트
- 인터넷 네트워크
- tcp
- 티스토리챌린지
- 이진트리
- 을 통한 웹 브라우저 흐름
- 기초 개념 잡기
- 자바
- 알고리즘
- Stack
- heap
- HTTP메시지
- HTTP
- 오블완
- Today
- Total
HeadCopter
본격 ! HTTP(1) 본문
HTTP ?
- HTTP(HyperText Transfer Protocol) 는 웹(Web) 상에서 정보를 주고 받을 수 있는 프로토콜이라 한다.
- HTTP는 버전 1.0 , 1.1, 2.0, 3.0 이 있는데 지금 현재 우리가 많이 사용하는 버전은 1999년에 나온 1.1이다.
2.0과 3.0 버전을 안쓰는 이유는 기존 1.1과 똑같고 바뀐건 성능개선 정도? 뿐이라 굳이 쓰지 않는다고 알고있다.
(그렇다고 대부분이 그렇다는거지 아예 2.0, 3.0 버전을 쓰지 않는다는건 아니다.)
- HTTP는 클라이언트와 서버 사이에 정보를 서로 전달하는 요청(Request)과 응답(Response)로 구성된 프로토콜이다.
HTTP의 특징 ?
- 무상태 프로토콜 (Stateless)
- 상태 유지 프로토콜 (Stateful)
- 비 연결성 (Connectionless)
무상태 프로토콜(Stateless)
- 클라이언트가 서버에 요청을 할 때 필요한 정보를 전부 다 담아서 서버에 보내기 때문에 중간에 서버가 바뀌더라도 문제가 일어나지 않는다.
- 클라이언트에서 요청이 무수히 많더라도 , 서버는 클라이언트에서 요청한 정보를 전혀 알 필요가 없기 때문에 요청에 대한 응답만을 수행한다.
- 만약 요청을 수행하는 서버가 오류가 발생하더라도 무상태(Stateless) 즉 , 클라이언트의 상태를 보관하지 않기 때문에
다른 서버에서 해당 요청을 바로 처리할 수 있다.
무상태 프로토콜(Stateless) 의 한계
- 서버는 클라이언트의 정보들을 보관하지 않기 때문에 어쩔수없이 클라이언트에서 필요한 데이터를 많이 보내게 된다.
- 단순한 페이지 같은 경우에는 상태를 유지할 필요가 없기 때문에 무상태로 설계하는게 맞지만
상태 유지가 반드시 필요한 로그인 같은 경우에는 무상태로 설계를 하지 못한다.
- 이럴 경우에는 쿠키와 서버 세션등을 이용하여 상태 유지는 최소한만 사용하게끔 설계를 한다.
상태 유지 프로토콜 (Stateful)
- 상태 유지 프로토콜은 무상태 프로토콜과 반대로 클라이언트에서 보낸 정보를 서버에서 보관하게된다. (상태 유지)
- 추가로 다른 정보가 들어오면 서버는 이미 상태를 보관하고 있기 때문에 어떤 요청에 대한 추가 데이터인지 알 수 있다.
상태 유지 프로토콜(Stateful) 의 한계
- 하지만 상태 유지 프로토콜은 서버가 해당 요청에 대한 상태를 보관하다 보니 중간에 만약 요청을 수행하는 서버가 바뀌게 된다면 바뀐 서버는 해당 요청에 대한 정보가 전혀 없기 때문에 요청에 대한 처리를 수행하지 못하게 되고 클라이언트는 다시 바뀐 서버에 요청을 다시 해야하는 번거로움이 생긴다.
비 연결성 (Connectionless)
- 예를들어 클라이언트1 이 서버1에 요청을 보내고 서버와 연결이 되었는데 클라이언트2도 서버1에 요청을 보내고 연결..
클라이언트3도 서버1에 요청을 보내고 연결.. 이렇게 많은 클라이언트를 하나의 서버가 연결을 계속 유지하고 감당한다면,
서버의 자원 소모는 엄청날 것이다.
- 반대로 클라이언트1이 서버1에 요청을 보내면 서버는 요청에 대한 응답을 끝내고 클라이언트1에 대한 연결을 끊어버린다면 자원을 낭비하는 일이 없어질 것이다 . 그게 바로 비 연결성(Connectionless)에 대한 정의다.
- 내가 지금 배우고 있는 HTTP는 기본적으로 연결을 유지하지 않는 비 연결성(Connectionless)을 사용하는 모델이다.
- 자원을 낭비하지 않고 최소한의 자원만 사용하기 때문에 당연히 서버에서 처리하여 보내는 응답 속도도 빠르다.
비 연결성 (Connectionless) 의 한계
- 하지만 해당 클라이언트의 요청을 수행하고 연결을 끊고 난 뒤 , 다시 해당 클라이언트의 요청이 발생하게 된다면
앞서 배운 TCP/IP 연결의 3-way handshake(SYN,SYN+ACK,ACK...* 2) 시간이 추가된다.
- 웹 브라우저 사이트를 요청하면 해당 페이지의 HTML 뿐만 아니라 자바 스크립트, CSS, 이미지 등 수 많은 자원들이 함께 다운로드가 된다.
- 그래서 HTTP는 기본적으로 클라이언트의 요청이 다 끝날때까지 연결을 유지한다(연결 시간 설정 가능하다) 이걸 Persistent Connections (지속 연결)로 부른다.
HTTP 메시지 구조
- Start-line
- Header
- empty-line
- message-body
Start-line
- HTTP 메시지 구조에서 가장 먼저 Start-line은 request-line과 status-line 으로 구분된다.
- request-line 에는 앞에 method를 넣고 request-target과 HTTP 버전이 들어간다.
// HTTP 요청 메시지
GET /search?q=apple&hl=ko HTTP/1.1
- HTTP 요청 메시지에 맨 앞에 들어오는 메서드의 종류에는 GET, POST, PUT, DELETE 등이 있다 (이건 다음장에서 다루기로 한다. )
서버가 수행해야 하는 동작에 따라 메서드를 정해준다.
// HTTP 응답 메시지
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length:1234
<html>
<body>....</body>
</html>
- HTTP 응답 메시지에는 맨 앞에 HTTP 버전이 들어오고 뒤에 (여기서는 200) HTTP 상태 코드를 보여준다.
Header
// HTTP 요청 메시지
GET /search?q=apple&hl=ko HTTP/1.1
Host: www.google.com
--------------------------------------------
//HTTP 응답 메시지
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length:1234
- HTTP에서 요청 Header는 Header-field = field-name : field-value 를 나타낸다.
위에 HTTP 요청 메시지에서 Host: www.googel.com 이 그 부분이다.
- HTTP에서 응답 Header에서도 Content-Type : text/html;charset=UTF-8과 Content-Length:1234가 응답 Header를 뜻한다.
- HTTP Header는 HTTP 전송에 필요한 모든 부가 정보를 담고있다. 메시지 바디의 내용 , 크기, 인증정보 , 웹 브라우저 정보 등이 포함되어 있다.
Empty-line
- 영문 그대로 HTTP 메시지 라인에서 공백 라인을 뜻한다.
message-body
- 실제 전송할 데이터가 담겨져있는 부분을 확인할 수 있다.
- HTTP 응답 메시지에서 <html></html> 같은 HTML문서가 될 수 있고 byte로 표현할 수 있는 모든 데이터를 전송할 수 있다. (HTML, 이미지, 영상 등)
공부를 마치며....
이번 내용은 알고 있던 내용이었기 때문에 그렇게 어려운 부분은 없었다. 사실 HTTP는 내가 회사에서 일할 때 매일 사용했던 거였기 때문에 너무나도 익숙했다. 하지만 알고 있었을뿐 깊이 아는건 아니였기에 오늘 이 공부도 나에게 너무나 도움이 되었다.
'개발관련' 카테고리의 다른 글
| 서블릿(Servlet)이란 ? (0) | 2022.07.22 |
|---|---|
| 본격! HTTP(2) (0) | 2022.07.14 |
| 클라이언트 서버 구조 (0) | 2022.07.13 |
| URI, URL, URN 정리와 웹 브라우저 요청 흐름 ! (0) | 2022.07.12 |
| 인터넷 네트워크 관련 정리 (0) | 2022.07.12 |