HTTP(HyperText Transfer Protocol)는 웹상에서 데이터를 주고 받는 방식을 정의하는 프로토콜이다. HTTP의 기본적인 특징을 이해하면 웹의 동작 방식을 더욱 잘 이해할 수 있다. HTTP의 핵심 특징 3가지인 클라이언트-서버구조, 무상태 프로토콜(Stateless), 그리고 단순하면서도 확장 가능한 특징에 대해 자세히 알아보겠다.

 

< 1. HTTP는 클라이언트-서버 구조로 되어 있다.>

HTTP는 클라이언트-서버 구조를 가지고 있다. 클라이언트는 HTTP 메세지를 통해 서버에게 요청을 보내고, 그 요청에 대한 응답을 기다린다. 응답이 오면, 클라이언트는 해당 응답을 통해 웹페이지를 렌더링한다. 이때, 클라이언트는 사용자 인터페이스와 사용자 경험에 집중 하고, 데이터와 비즈니스 로직 처리는 서버에게 맡긴다. 이런 분업 체계 덕분에 클라이언트와 서버는 각각 독립적으로 발전할 수 있다.

 

예를 들어, 서버 트래픽이 발전하더라도 클라이언트를 수정할 필요는 없다. 백엔드에서 트래픽 관리에 집중하면 되는 것이다. 

 

 

< 2. HTTP는 무상태 프로토콜(Stateless)상태를 지향한다.>

HTTP는 클라이언트의 상태를 보존하지 않는다. 이 말은 클라이언트의 이전 요청을 기억하지 않는다는 뜻이다.

이해를 돕기 위해 간단한 예들이 있다.

 

예를 들어, 노트북을 사려는 고객과 점원 간의 대화가 있다고 가정해보자. 고객이 노트북 가격을 묻고, 점원이 가격을 말한 후, 고객이 두 대를 사겠다고 하면, 점원은 전에 언급된 노트북 가격을 기억하고 두 대의 가격을 계산할 수 있다. 이 상황이 Stateful 상황이다.

 

반면에, Stateful 상황에서 점원이 중간에 바뀌면 문제가  생긴다. 

이러한 것에 대한 단점이 있으며,

 

Stateless Protocol은 이는 HTTP가 클라이언트의 상태를 기억하지 않는다는 뜻이다.

즉, 중간에 점원(서버)가 바뀌어도  대화(요청)이 이어갈 수 있다는 것이다.

 

이러한 방식은 대규모 시스템에서 확장성을 크게 향상 시킨다.

 

<Stateless의 실무 한계>

예를 들어, 사용자가 로그인한 상태를 유지하는 것은 "무상태 프로토콜"로는 어렵다. 이러한 한계를 극복하기 위해, '쿠키'나 '세션'과 같은 기술이 개발되었다. 이런 기술들은 클라이언트와 서버 사이에 추가적인 정보를 주고 받을수 있도록 하여, 상태를 일정하게 유지할 수 있게 한다.

 

 

<비연결성>

비연결성이란 말 그대로 서버와 클라이언트 사이의 연결을 계속 유지하지 않는다는 것을 의미한다. 서버는 클라이언트의 요청에 응답하고나면 연결을 끊어버린다. 이렇게 함으로써 서버의 자원을 최적화 하고, 많은 클라이언트의 요청을 동시에 처리할 수 있게 된다.

 

예를 들어, 웹 브라우저에서 한 번에 여러 개의 요청을 보내는 경우, HTTP는 각 요청마다 독립적인 연결을 생성한다. 그래서 한 요청이 처리되고 나면 해당 연결은 끊어지고, 다음 요청이 올 때까지 연결은 유지되지 않는다. 이렇게 비연결성을 가진 덕분에, 서버는 동시에 많은 수의 클라이언트의 요청을 처리할 수 있게 된다. 

 

그러나, 단점도 존재 한다. 

첫째로, 매 요청마다 새로운 연결을 만들어야 하기 때문에 이로 인해 추가적인 시간이 소모된다. 그리고 이로 인해 웹 페이지를 로딩하는 시간이 늘어나 사용자의 경험이 저하될 수 있다.

 

둘째로, 웹 페이지를 로딩하는데 필요한 많은 자원들(예:이미지,Javascript,CSS등)을 요청해야 한다. 이는 많은 네트워크 트래픽을 증가시키며, 비효율적인 작업이 될 수 있다.

hello 단어 하나만 쳐도 무수히 많은 것이 다운로드 되고 있다.

그래서 생긴 해결책: 지속 연결(Persistent Connection)

이런 단점들을 해결하기 위해 HTTP는 '지속 연결(Persistent Connection)'이라는 개념을 도입했다. 이는 한 번의 연결로 여러 요청과 응답을 처리할 수 있도록 하는 방법이다. 이후의 HTTP 버전인 HTTP/2,HTTP/3에서는 이 개념을 더욱 발전시켜, 여러 요청을 동시에 처리할 수 있는 능력을 더욱 강화시켰다.

 

 

요약하면, HTTP의 비연결성은 서버의 자원을 효율적으로 관리하는데 큰 도움을 주지만, 그로 인한 사용자 경험의 저하와 같은 단점을 가지고 있다. 이를 해결하기 위해 '지속 연결'이라는 개념이 도입되어, 현재의 웹 통신에서는 이를 통해 더욱 효율적이고 빠른 통신이 가능해졌다.


 

Reference : 모든 개발자를 위한 HTTP 웹 기본 지식

https://www.inflearn.com/

 

인프런 - 라이프타임 커리어 플랫폼

프로그래밍, 인공지능, 데이터, 마케팅, 디자인, 엑셀 실무 등 입문부터 실전까지 업계 최고 선배들에게 배울 수 있는 곳. 우리는 성장 기회의 평등을 추구합니다.

www.inflearn.com

 

'HTTP 웹 기본 지식' 카테고리의 다른 글

HTTP의 변천사  (0) 2023.05.30
웹 브라우저의 URL 요청 과정  (0) 2023.05.30
URI  (0) 2023.05.30
DNS  (0) 2023.05.29
네트워크 상에서 데이터의 이동 이해하기  (0) 2023.05.29

HTTP(HyperText Transfer Protocol)은 처음에는 HTML 문서 간의 연결을 위한 프로토콜로 시작되었으나, 지금은 거의 모든 데이터의 전송을 담당하고 있다.

 

🤔< HTTP와 데이터 전송 > 🤔

HTTP는 HTML,TEXT,IMAGE,음성,영상,파일,JSON,XML 등과 같은 다양한 형태의 데이터를 전송할 수 있다. 심지어는 서버 간에 데이터를 주고 받을 때도 대부분 HTTP를 사용한다. 이는 HTTP가 굉장히 다양한 형태의 데이터를 지원하고, 웹에서 가장 흔히 사용되는 프로토콜이기 때문이다.

 

🎁<HTTP의 역사를 통해 보는 발전>🎁

  • HTTP/0.9(1991년):HTTP의 첫 번째 버전으로, 가장 기본적인 GET 메서드만 지원하였다. 또한 HTTP 헤더는 존재하지 않았다.
  • HTTP/1.0(1996년): 이 버전에서는 다양한 메서드와 헤더가 추가되었다.
  • HTTP/1.1(1997년):이는 가장 널리 사용되는 버전으로, 지금도 많은 곳에서 사용되고 있다.
  • HTTP/2 (2015년): 이 버전에서는 HTTP/1.1의 성능 문제를 개선 하였다.
  • HTTP/3: 이 버전은 아직 개발 중에 있으며, 이전 버전과 달리 UDP를 사용하여 통신한다. 이 변경의 목표는 통신의 성능을 더욱 향상시키는 것이다. 

[ 기반 프로토콜 ]

HTTP는 데이터를 전송하는 기반 프로토콜을 사용한다.

HTTP/1.1과 HTTP/2는 TCP를 기반으로 동작하는 반면, 개발 중인 HTTP/3은 UDP를 기반으로 동작한다.

 

이런 변화의 이유는 TCP가 비교적 느린 시작 속도(예: 3 way handshake)와 같은 특성 때문에, 더 빠른 데이터 전송을 위해 UDP를 사용하는 HTTP/3로 전환하는 것이다. 

 

 

< 실제 Web Browser에 사용 사례들 들여다 보기 >

실제로 어떤 것들이 HTTP를 통해 통신이 이루어지고 있는지 확인 할 수 있다. 웹 브라우저에서는 개발자 도구를 통해 이를 확인할 수 있다.

 

1.Web Browser를 열고 F12를 눌러 개발자 도구를 연 다음,

2.'Network' 탭을 선택하고,

3.Protocol'체크박스를 체크하면,

 

실제로 어떤 데이터가 어떤 HTTP 버전을 통해 전송되고 있는지 확인 할 수 있다.

 

아래의 사진과 같이 h3라는 것이 보일 것이다.

 

 

Reference : 모든 개발자를 위한 HTTP 웹 기본 지식

https://www.inflearn.com/

 

인프런 - 라이프타임 커리어 플랫폼

프로그래밍, 인공지능, 데이터, 마케팅, 디자인, 엑셀 실무 등 입문부터 실전까지 업계 최고 선배들에게 배울 수 있는 곳. 우리는 성장 기회의 평등을 추구합니다.

www.inflearn.com

 

'HTTP 웹 기본 지식' 카테고리의 다른 글

http의 특징(Stateless,Stateful,비연결성)  (0) 2023.05.30
웹 브라우저의 URL 요청 과정  (0) 2023.05.30
URI  (0) 2023.05.30
DNS  (0) 2023.05.29
네트워크 상에서 데이터의 이동 이해하기  (0) 2023.05.29

인터넷 브라우저를 이용해 웹 페이지를 열어볼 때 무슨 일이 일어날까? 예를 들어, 'https://www.google.com:443/search?q=hello&hl=ko' 라는 URL을 웹 브라우저에 입력하면 다음과 같은 단계들이 일어난다.

 

[ 1. DNS 조회(DNS Lookup) ]

먼저, 브라우저는 'www.google.com'이라는 도메인 이름을 이용해 해당 IP 주소를 찾아야 한다. 이 작업은 DNS(Domain Name System) 서버를 조회하여 진행한다. 예를 들어, 이 경우에는 DNS 서버가 'www.google.com'의 IP 주소를 '200.200.200.2'로 알려줄 수 있다. 

[ 2. 포트 번호 확인 ]

다음으로 브라우저는 웹 서버와 통신할 수 있는 '문'을 찾아야 하는데, 이 '문'이 바로 포트 번호이다. 보통 HTTPS 프로토콜은 443 포트를 사용한다. URL에서 ':443'이라고 명시되어 있으면 이는 HTTPS 프로토콜의 기본 포트인 443번을 사용하겠다는 의미이다.

[ 3. HTTP 요청 메세지 생성 ]

이제 브라우저는 웹서버에 정보를 요청하기 위한 HTTP 요청 메세지를 생성한다. 이 메세지는 요청 유형(GET,POST 등), 요청하는 URL, 사용하는 프로토콜 버전 등의 정보를 포함한다. 이 예시에서는 'hello'라는 단어를 한국어 페이지에서 검색하는 요청을 보내는 것이다. 이에 대한 HTTP 요청 메세지는 대략 다음과 같다.

GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com

위의 사진과 같이, 요청 패킷이 도착하면 HTTPS 메세지를 받은 다음 해석을 한다.

https://www.google.com 같은 것을 해석 하여서 HTTP 응답 메세지를 만들어낸다.

 

Content Type이라는 것은 html 형식, UTF-8 형식등을 알 수 있고,

Content-Length은 html의 길이를 알 수 있다. 

 

이걸 받으면, HTMl 데이터가 들어 있으니, 웹 브라우저가 렌더링을 통하여 사용자가 화면을 볼 수 있다. 

 

Reference : 모든 개발자를 위한 HTTP 웹 기본 지식

https://www.inflearn.com/

'HTTP 웹 기본 지식' 카테고리의 다른 글

http의 특징(Stateless,Stateful,비연결성)  (0) 2023.05.30
HTTP의 변천사  (0) 2023.05.30
URI  (0) 2023.05.30
DNS  (0) 2023.05.29
네트워크 상에서 데이터의 이동 이해하기  (0) 2023.05.29

 

🔥<URI(Uniform Resource Identifier)>🔥

리소스를 식별하는 가장 큰 개념. "리소스"라는 단어는 웹브라우저에 있는 HTML,File,실시간 교통정보와 같은 모든 것을 포괄한다. 이런 리소스를 식별하는 방법이 바로 URI이다. URI를 통해 인터넷의 모든 자원을 식별하고 구별할 수 있다.

이런 개념을 더 쉽게 이해하려면, 사람의 주민번호를 생각하면 쉽다. 각 사람마다 고유한 주민번호가 있어서 각각의 사람을 쉽게 구별하고 쉽게 식별할 수 있다.  URI도 이런 역할을 한다.

 

그러나 URI는 다시 두 가지 하위 개념으로 나뉜다. URL(Uniform Resource Locator)과 URN(Uniform Resource Name)이다.

 

URL은 리소스의 위치를 지정하는 방법이다. 예를 들어

https://www.google.com/search?q=hello&hl=ko

 

헬로

아델의 노래

www.google.com

이 링크는 구글에서 "hello"를 검색하는 페이지의 위치를 지정하는 URL이다. 다시 말해, URL은 특정 웹페이지에 도달하는 방법을 제공한다.

 

반면에 URN은 리소스에 이름을 부여하는 방법이다. URN은 URL과 달리 위치에 의존하지 않는다. 즉, 리소스의 위치가 변하더라도 URN은 변하지 않는다. 하지만, 이름만으로 실제 리소스를 찾는 방법이 보편화되지 않아 URN은 실제로는 잘 사용되지 않는다.

 

이런 이유로, 보통의 경우 URI와  URL을 같은 의미로 사용한다.

 

< URL 문법 구조 >

URL의 기본 구조는 다음과 같다.

scheme://[userinfo@]host[:port][/path][?query][#fragment]

 

"scheme": 프로토콜을 의미한다. 어떤 방식으로 자원에 접근할 것인가를 나타낸다. 예를 들면 http,https,ftp 등이 있다.

"[userinfo@]": URL에 사용자 정보를 포함해야 하는 경우 사용한다. 그러나 이 부분은 거의 사용되지 않는다.

"host[:port]":호스트 이름과 포트 번호를 나타낸다. 포트 번호는 생략 가능하며, 생략시 http는 80,https는 443을 기본으로 사용한다.

"[/path]":자원의 경로를 나타낸다.  계층적 구조로 표현할 수 있으며, 자원의 위치를 더욱 명확하게 나타낸다.

"[?query]": URL에 포함된 쿼리를 나타낸다. "key=value"형태로 이루어져 있으며, 여러 개의 쿼리는 "&"로 연결한다.

"[#fragment]": 페이지 내부 북마크 등에 사용된다. URL의 특정 부분을 가리키는 데 사용된다.

 

Reference : 모든 개발자를 위한 HTTP 웹 기본 지식

https://www.inflearn.com/course/lecture?courseSlug=http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC&unitId=61357&tab=curriculum 

 

학습 페이지

 

www.inflearn.com

 

'HTTP 웹 기본 지식' 카테고리의 다른 글

HTTP의 변천사  (0) 2023.05.30
웹 브라우저의 URL 요청 과정  (0) 2023.05.30
DNS  (0) 2023.05.29
네트워크 상에서 데이터의 이동 이해하기  (0) 2023.05.29
HTTP 1.1/2.0/3.0  (0) 2023.04.21

우리는 매일 수없이 많은 웹사이트를 방문한다. 이 과정에서 우리가 입력하는 것은 대부분 도메인 이름이며, 이는 우리에게 익숙하고 기억하기 쉽게 만들어진 주소이다.하지만 컴퓨터와 서버 사이의 실질적 통신은 이 도메인 이름이 아닌 IP 주소를 통해 이루어진다.

그런데 여기서 문제가 있다. IP 주소는 변경될 수 있으며, 그렇다면 웹 사이트의 IP 주소가 바뀐다면 어떻게 해당 웹사이트로 접속할 수가 있는 것일까? 이에 대한 해답은 오늘의 주제인 DNS, 즉 도메인 이름 시스템(Domain Name System)에 있다.

🌳 < DNS > 🌳

DNS는 이름 그대로 도메인 이름을 IP 주소로 바꿔주는 시스템이다. 이 시스템의 중요성을 이해하려면, 우선 IP 주소의 중요성을 이해해야만 한다. IP 주소는 인터넷 상의 각 컴퓨터나 서버에 부여되는 고유한 식별자로, 이를 통해 데이터 패킷이 올바른 목적지로 전달된다. 하지만, IP 주소는 사람에게는 외우기 어렵고, 무엇보다 고정적이지 않을 수 있다.

 

그래서 DNS는 사람이 기억하기 쉬운 도메인 이름을 기계가 이해할 수 있는 IP주소로 변환하는 역할을 한다.

이렇게 함으로써 사용자는 웹 사이트의 IP 주소가 변경되더라도 도메인 이름만 알고 있다면 문제없이 해당 웹사이트에 접속할 수 있게 된다.

 

예를 들어, "google.com"이라는 도메인 이름을 가진 웹사이트에 접속하려고 할 때, 우리의 컴퓨터는 먼저 DNS 서버에게 "google.com"의 IP 주소를 물어본다. DNS 서버는 이에 대한 답으로 해당 도메인의 IP주소, 예를 들어 "200.200.200.2"를 응답하게 된다. 그런 다음, 우리의 컴퓨터는 이 IP 주소를 통해 실제로 Google 서버에 접속하게 된다.

 

정리하자면, DNS는 우리가 인터넷을 쉽게 이용할 수 있도록 해주는 매우 중요한 시스템이다. 이를 통해 우리는 복잡하고 어려운 IP 주소 대신에 익숙하고 기억하기 쉬운 도메인 이름을 사용할 수 있게 된다.

 


Reference : 모든 개발자를 위한 HTTP 웹 기본 지식

https://www.inflearn.com/

 

 

 

'HTTP 웹 기본 지식' 카테고리의 다른 글

웹 브라우저의 URL 요청 과정  (0) 2023.05.30
URI  (0) 2023.05.30
네트워크 상에서 데이터의 이동 이해하기  (0) 2023.05.29
HTTP 1.1/2.0/3.0  (0) 2023.04.21
TCP/UDP  (0) 2023.04.20

 

데이터가 네트워크를 통해 이동하는 것은 컴퓨터를 하면서 굉장히 중요한 부분중 하나이다.

컴퓨터를 이용해서 게임을 하거나 화상통화를 하거나 웹브라우저를 사용하는 모든 행동들은 네트워크 상의 데이터 패킷들을 주고 받는 과정에 기반을 두고 있다. 하지만, 이 모든 데이터 들이 우리의 컴퓨터에 동시에 도착하면, 어떻게 컴퓨터는 그들이 각기 어떤 애플리케이션에 속한 데이터인지 알 수 있을까?

 

이 질문에 대한 답은 TCP/IP 프로토콜과 포트(port)이다.

 

TCP/IP는 인터넷 프로토콜 스위트로서, 그 중심에는 두 가지 기본적인 프로토콜인 TCP가 있다. IP는 인터넷 프로토콜로서 데이터 패킷을 올바른 목적지로 보내는 데 쓰이며, TCP는 패킷들이 올바르게, 순서대로 도착했는지 확인하는 역할을 한다.

 

TCP/IP 패킷은 출발지 IP, 출발지 PORT, 목적지 IP, 목적지 PORT 등을 포함한다. 

그렇다면 이 "PORT"라는 것은 무엇일까?

🤔 < PORT > 🤔

포트는 한 컴퓨터 내에서 네트워크 통신을 처리하는 여러 프로세스들을 구분하기 위한 개념이다.

각 애플리케이션은 고유한 포트 번호를 가지고 있으며, 이를 통해 동시에 수신된 데이터 패킷들을 알맞은 애플리케이션으로 정확하게 전달할 수 있다.

 

예를 들어, A라는 사람이 게임을 하며 8090번 포트를 사용하고 있고, 동시에 친구들과 화상통화를 하면서 21000번 포트를 사용하면서, 또 웹브라우저는 10010번 포트를 이용하고 있다면, 이 모든 데이터 패킷들은 각각의 포트 번호를 통해 올바른 애플리케이션으로 정확하게 전달될 것이다.

 

패킷이 발신될 때, 그 출발지 IP와 포트 정보도 함께 보내지기 때문에, 응답 패킷은 이 정보를 바탕으로 원래의 발신자에게 정확하게 돌아갈 수 있다.

 

포트 번호는 0에서 65535까지의 범위에서 할당될 수 있으며, 0에서 1023까지의 범위는 잘 알려진 포트로 예약되어 있다.

이 범위의 포트는 일반적으로 특정 서비스나 프로토콜에 대응된다. 예를 들어, FTP는 20과 21번, Telnet은 23번, HTTP는 80번, HTTPS는 443번 포트를 사용한다. 이 범위의 포트는 특별한 목적을 위해 예약되어 있으므로, 일반적으로 사용자 정의 애플리케이션에는 사용하지 않는 것이 좋다.

 

TCP/IP와 포트의 개념을 이해하면, 컴퓨터가 동시에 다양한 애플리케이션의 데이터를 어떻게 처리하는지 이해할 수 있게 된다.

 

 

Reference :모든 개발자를 위한 HTTP 웹 기본 지식

https://www.inflearn.com/

 

학습 페이지

 

www.inflearn.com

 

 

'HTTP 웹 기본 지식' 카테고리의 다른 글

URI  (0) 2023.05.30
DNS  (0) 2023.05.29
HTTP 1.1/2.0/3.0  (0) 2023.04.21
TCP/UDP  (0) 2023.04.20
html에서 이미지를 보는 방법  (0) 2023.04.13

HTTP 1.1/2.0/3.0

HTTP 1.1

HTTP/1.1은 1999년에 발표된 HTTP 프로토콜의 최신 버전이며, 이전 버전인 HTTP/1.0보다 개선된 기능을 제공한다. HTTP/1.1에서는 커넥션 관리, 캐시, 프락시 지원, 인증 등의 기능이 개선되었으며, 보안 기능도 추가되었다.

또한, HTTP/1.1은 기본적으로 지속 커넥션(Persistent Connection)을 사용하므로, 클라이언트와 서버 간의 연결을 유지하고, 한 번의 연결로 여러 개의 요청과 응답을 처리할 수 있다. 이로 인해 네트워크 부하를 줄이고, 웹 페이지 로딩 속도를 높일 수 있다.

현재도 많은 웹 브라우저와 웹 서버가 이 버전을 지원하고 있다.


HTTP 2.0

2015년 IETF에 의해 공식적으로 발표된 HTTP/1.1의 후속 버전이다. HTTP/2의 차기 버전은 HTTP/3이다.

표준에서 TLS를 요구하는 것은 아니지만, SPDY에서 TLS를 요구했던 여파로 인해 모든 메이저 브라우저들이 TLS없이는 HTTP/2를 지원하지 않고 있다. 즉,TLS가 없으면 무조건 HTTP/1.1로 요청한다.

웹2.0과는 전혀 관계가 없다. 웹2.0은 2004년 나온 웹의 포괄적 개념으로 현재는 사문화되었다. HTTP/2는 프로토콜로 분야가 다르다.

2020년부터 HTTP/3 규격도 진행되고 있으며, 구글이나 유튜브 등의 주요 웹사이트들에서는 이미 적용 중이다.

바이너리 프로토콜을 사용한다.


HTTP/1.1에서의 개선점

① Head of line blocking(HOL)

HTTP/1.1까지는 한 번에 한 파일밖에 보내지 못했다. 그래서 특정 파일의 로딩이 늦어지면 다른 파일까지 줄줄이 느려지는 병목 현상이 생기게 된다. 그래서 여러 파일을 한꺼번에 병렬 전송을 하는 식으로 로딩 시간을 줄이는 방법을 사용한다.

② 중복 헤더의 제거

같은 내용의 헤더를 보낼 경우, 생략해버리는 식으로 처리함으로써 속도를 높이는 방식이다.

③ Header compression

이전까지는 HTTP 헤더가 평문이었지만, HTTP/2에서는 헤더를 압축하여 용량 대비 처리 효율성을 높이는 방법을 사용한다. 압축을 하기 때문에 헤더 크기 자체도 크게 줄어든다.

④ Server push

특정 파일을 서버에 지정해서 HTTP 전송 시 같이 밀어 넣는 방식이다. 주로 JavaScript나 CSS, 글꼴, 이미지 파일 등을 지정한다.

⑤ Prioritization

웹 페이지를 구성하는 파일의 우선순위를 둘 수 있다. 로딩이 빨리 되어야 하는 파일과 그렇지 않은 파일을 구분해줄 수 있고, 이들 사이에서도 중요도를 차등 배분할 수 있다.


이전까지는 HTTP/2를 지원하는 한국 사이트는 손에 꼽힐 정도였으나, 2020년을 기점으로 꾸준히 증가하여 현재는 대부분의 웹사이트가 지원하고 있다.

하지만, HTTP/2.0을 지원하지 않는 서버나 브라우저가 여전히 많이 사용되고 있다.

HTTP/2.0을 사용하는 경우 일부 사용자들이 웹사이트를 제대로 사용할 수 없는 경우도 있다. 또한, HTTP/2.0은 TCP 커넥션을 유지하는 동안 메모리 사용량이 증가하는 문제가 있을 수 있다.

HTTP/2.0을 사용하기 위해서는 SSL/TLS 암호화가 필수적이다. HTTP/2.0은 바이너리 프로토콜을 사용하여 데이터를 전송하므로, 데이터의 보안성이 중요합니다. 따라서, HTTP/2.0은 반드시 SSL/TLS 암호화된 연결을 사용해야 한다.

실제로, 모든 주요 브라우저에서 HTTP/2.0을 지원할 때는 SSL/TLS 암호화된 연결을 사용해야만 한다. 이를 위해 HTTPS 프로토콜을 사용하여 웹사이트의 보안을 강화하고, HTTP/2.0의 장점을 최대한 활용할 수 있다.

따라서, HTTP/2.0을 사용하려면 SSL/TLS 암호화된 연결을 설정해야 한다. SSL/TLS 인증서를 구매하거나, Let's Encrypt와 같은 무료 인증 기관을 통해 SSL/TLS 인증서를 발급받을 수 있다.

HTTP/1,HTTP/2 성능 비교


                              HTTP version 확인 하기

이렇게 Protocol tap에 오른쪽 클릭 후, protocol을 누르면, 해당 웹사이트의 HTTP 버전을 확인가능하다.

안 보인다면 Name tap에서 오른쪽 클릭 하면,

프로토콜을 체크하면 된다.


HTTP/3

HTTP의 3번째 메이저 버전으로 HTTP/2의 차기 버전이다. 2022년 6월 6일, IETF RFC 9114로 표준화되었다.

HTTP/1 및 HTTP/2가 TCP로 통신하는 것과는 달리 HTTP/3는 UDP 기반의 QUIC 프로토콜을 사용하여 통신한다. 원래는 이름이 HTTP-over-QUIC였지만, IETF 내에 있는 QUIC 작업 그룹의 의장인 마크 노팅업이 HTTP/3라는 이름을 제안하여 변경되었다. HTTP/3의 기반이 되는 QUIC도 역시 웹 표준이며 RFC 9000으로 표준화되어 있다.

HTTP/2 대비하여 가장 큰 장점 3가지는, Zero RTT(Round Trip Time), 패킷 손실에 대한 빠른 대응, 사용자 IP가 바뀌어도 연결이 유지되는 것이다. 일반적인 웹 환경에서는 HTTP/2와 HTTP/3의 차이가 크지 않을 수 있으나, 동영상 서비스 등에서는 큰 차이를 보인다. 예를들어, 모바일 기기처럼 인터넷 연결 상태가 고르지 못한 경우라든지, WiFi에 연결하여 동영상을 시청하는 도중에 자리를 이탈하여 셀룰러 신호로 바뀌더라도 HTTP/3로 연결되어 있으면 영상을 끊김없이 시청할 수 있다. 패킷 전송에 있어서 제약이 거의 없는 비연결성 전송 계층을 기반으로 TCP 프로토콜의 무결성 보장 알고리즘과 SSL이 이식됨으로써 높은 성능과 동시에 충분히 괜찮은 정확성과 부인방지 특성을 충족시켰다.

HTTP/3와 그 기반 기술인 QUIC은 TLS 암호화를 기본적으로 사용한다. 다만, TLS가 TCP를 염두에 두고 설계되어 있기 때문에 QUIC의 원저작자인 구글의 알고리즘대로 일부 수정을 거쳐서 사용한다. UDP와 TLS가 결합된 기술로는 DTLS라는 기술도 있지만 'TCP의 재구현'이 목표 중 하나인 QUIC와는 지향하는 바가 다르다.

구글 자체 프로토콜이었던 QUIC가 HTTP/3로 표준화됨에 따라서 IETF 측에서는 구글이 독자적으로 개발했던 QUIC 프로토콜의 파편화된 구현 알고리즘을 기존의 다른 프로토콜과 상호운용이 용이하도록 대폭 수정하는 과정을 진행중이다. QUIC 내에서 IETF 표준 대비 가장 큰 파편화를 보인 부분이 보안 소켓이다. IETF는 구글이 자체적으로 개발한 보안 소켓을 IETF 표준 프로토콜인 DTLS로 대체하는 QUIC over DTLS 표준을 만들고 있었지만 QUIC 워킹 그룹에서 다른 방법을 모색하는 것으로 결론짓고 해당 표준의 제작을 중단했다. #

성능이 떨어지는 컴퓨터는 QUIC 프로토콜로 인해 크롬 브라우저가 느려진다. 그럴 때는 주소창에 "chrome://flags/"를 입력해 Experiments로 들어간 다음 Experimental QUIC protocol을 검색하여 비활성화해주면 빨라질 수 있다.


HTTP/3가 적용된 사이트

HTTP/3를 지원하는 주요 웹사이트로는,

구글

유튜브

구글이 제공 중인 대부분에 서비스에 적용되어 있다.

네이버

나무위키

페이스북

인스타그램

넷플릭스

줌 비디오 커뮤니케이션

 

 

 

 

 

참고 사이트

1.https://blog.bespinglobal.com/post/http1-1-http2/

HTTP1.1, HTTP2 비교 - BESPIN Tech Blog

2.https://developnote-blog.tistory.com/entry/HTTP20-%EC%A0%81%EC%9A%A9

HTTP/2.0 적용

3.https://pythonblog.co.kr/blog/79/

73 HTTP/2 적용 및 확인하기-curl

'HTTP 웹 기본 지식' 카테고리의 다른 글

DNS  (0) 2023.05.29
네트워크 상에서 데이터의 이동 이해하기  (0) 2023.05.29
TCP/UDP  (0) 2023.04.20
html에서 이미지를 보는 방법  (0) 2023.04.13
IP(인터넷 프로토콜)  (0) 2023.04.13

TCP/UDP

미국에 있는 친구에게 Message를 보내고 싶다. 그러면 먼저, Socket library를 통해, OS 계층에다 Message를 넘긴다.OS 계층에서 TCP가 MEssage에다가 TCP정보를 감싼다.

이제 한번 더 내려가서 IP와 관련된 데이터들을 TCP감싼 곳에 또 감싼다.

이렇게 감싸지면서 IP Packet이 생성되고, IP,TCP정보,Message가 담겨져있다.

그다음 LAN카드를 통해 전송 될 때, Ethernet frame이라는 것이 포함되어 전송 된다.

Ethernet frame은 MAC Adress같이, 실제 그런 물리적인 정보들이 포함되어져 있다.

IP패킷 같은 경우, 출발지 IP,목적지 IP가 있었다고 했었다.

참고로 패킷은 Package(수하물)라는 뜻과 덩어리를 합친 합성어라고 생각하면 된다.

즉, 택배 박스로 포장해서 보내는 것과 비슷한 것이다.

TCP에 관해서-

IP 패킷안에다 TCP 관련된 정보가 들어간다. PORT,전송제어,순서,검증 정보 등...

그런 것들이 더 들어가서 IP만으로 해결이 안됐던, 순서 문제들이 해결된다.

그리고 그 안에 만들었던 전송 데이터를 넣게 된다.

TCP 특징

전송 제어 프로토콜(Transmission Control Protocol)

①.연결지향 - TCP 3 Way handshake(가상 연결)

IP로만 감싸서 보냈을 때는 상대방 컴퓨터가 꺼져있으면 전송이 안됐다. 하지만, TCP를 통해

연결을 하고 나서 보내기 때문에, 연결 지향적이다.

②.데이터 전달 보증

메세지를 보냈을 때, 중간에 Packet이 누락이 되면, 내가 알 수있다.

③.순서 보장

④.신뢰할 수 있는 프로토콜

⑤.현재는 대부분 TCP를 사용한다.

이제 ①.연결지향 - TCP 3 Way handshake(가상 연결)에 대해 자세히 알아보자.

먼저 TCP IP 프로토콜로 연결하게 되면, 클라이언트에서 서버로 1.SYN(Synchronize) 메세지를 보낸다.

서버에서 오면, 클라이언트에게 2.SYN+ACK를 보내준다. 그런 다음 클라이언트가 ACK를 서버에게 보낸다. 이렇게 해서, 3 Way Handshake가 된다. 그러한 과정을 다 거치고 나서, 연결이 되고 나면 데이터를 전송하게 된다.

그렇지만, 그것은 어디까지나 가상연결이며, 개념적으로만 연결이 된 것이다. 나를 위한 전용 랜선이 된 것이 아니라, 논리적으로만 연결이 됐다고 "판단"만 하자 라는 것이다.

②.데이터 전달 보증에 대해 자세히 알아보자

TCP/IP에서는 클라이언트에서 데이터를 전송 하게 되면 서버에서 데이터를 잘 받았다고 보내줘서

내가 잘 보냈는지 판단을 할 수 있다.

③.순서 보장

패킷을 1번,2번,3번 순서로 보냈다고 가정해보자. 그러면 서버가 도착 했는데 1번 3번 2번 이렇게 잘 못 왔다고 가정 해보면 기본 적으로는 다 버리고, 패킷 2번부터 다시 보내라고 해서, 2번부터 다시 보내게 된다.

그런걸 다 어떻게 가능하냐면,

TCP 정보에는 출발지 정보, 목적지 정보,전송 제어, 순서,검증 정보들이 다 들어있기에 가능 하다.

 

 

출처: 김영한 모든 개발자를 위한 HTTP 웹 기본 지식

html에서 이미지를 보는 방법은 두 가지가 있다.

1.이미 렌더링된 이미지

2.클릭 시 다운로드

CODE가 있는데, 사이트 내에서 "공통"으로 뽑기 위해 테이블 자체를 둔 것이다.

CODE를 보고 상품관리에 등록된 거구나 등 유추해야 한다.

RID는 게시판의 몇번글에 대한 첨부파일이다.

파일 첨부는 coomon->entity->uploadfile

에서 DTO부터 먼저 만들어보자

UploadFileId

code

rid

store_filename

upload_filename

fsize

ftype

cdate

udate

이렇게 DTO를 만들고

UploadFileDAO

package com.kh.app.domain.common.dao;

import com.kh.app.domain.entity.UploadFile;

import java.util.List;
import java.util.Optional;

public interface UploadFileDAO {

  /**
   * 업로드 파일 등록 - 단건
   * @param uploadFile
   * @return 파일Id
   */
  Long addFile(UploadFile uploadFile);

  /**
   * 업로드 파일 등록 - 여러건
   * @param uploadFiles
   */
  void addFiles(List uploadFiles);

  /**
   * 업로드파일조회
   * @param code
   * @param rid
   * @return
   */
  List findFilesByCodeWithRid(String code,Long rid);

  /**
   * 첨부파일조회
   * @param uploadfileId
   * @return
   */
  Optional findFileByUploadFileId(Long uploadfileId);


  /**
   * 첨부파일 삭제 by uplaodfileId
   * @param uploadfileId 첨부파일아이디
   * @return 삭제한 레코드수
   */
  int deleteFileByUploadFildId(Long uploadfileId);

  /**
   * 첨부파일 삭제 By code, rid
   * @param code 첨부파일 분류코드
   * @param rid 첨부파일아이디
   * @return 삭제한 레코드수
   */
  int deleteFileByCodeWithRid(String code, Long rid);
}
package com.kh.app.domain.common.dao;

import com.kh.app.domain.entity.UploadFile;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.*;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
import java.util.Optional;

@Slf4j
@Repository
@RequiredArgsConstructor
public class UploadFileDAOImpl implements UploadFileDAO{

  private final NamedParameterJdbcTemplate template;

  //업로드파일 등록-단건
  @Override
  public Long addFile(UploadFile uploadFile) {

    StringBuffer sql = makeAddFileSql();
    SqlParameterSource param = new BeanPropertySqlParameterSource(UploadFile.class);
    KeyHolder keyHolder = new GeneratedKeyHolder();
    template.update(sql.toString(),param,keyHolder,new String[]{"uploadfile_id"});

    return keyHolder.getKey().longValue();
  }

  //업로드파일 등록-여러건
  @Override
  public void addFiles(List uploadFiles) {

    StringBuffer sql = makeAddFileSql();
    if(uploadFiles.size() == 1){
      SqlParameterSource param = new BeanPropertySqlParameterSource(uploadFiles.get(0));
      template.update(sql.toString(),param);
    }else {
      SqlParameterSource[] params = SqlParameterSourceUtils.createBatch(uploadFiles);
      //배치 처리 : 여러건의 갱신작업을 한꺼번에 처리하므로 단건처리할때보다 성능이 좋다.
      template.batchUpdate(sql.toString(), params);
    }
  }

  private StringBuffer makeAddFileSql() {
    StringBuffer sql = new StringBuffer();
    sql.append("INSERT INTO uploadfile ( ");
    sql.append("  uploadfile_id, ");
    sql.append("  code, ");
    sql.append("  rid, ");
    sql.append("  store_filename, ");
    sql.append("  upload_filename, ");
    sql.append("  fsize, ");
    sql.append("  ftype ");
    sql.append(") VALUES ( ");
    sql.append("  uploadfile_uploadfile_id_seq.nextval, ");
    sql.append("  :code, ");
    sql.append("  :rid, ");
    sql.append("  :store_filename, ");
    sql.append("  :upload_filename, ");
    sql.append("  :fsize, ");
    sql.append("  :ftype ");
    sql.append(") ");
    return sql;
  }

  //조회
  @Override
  public List findFilesByCodeWithRid(String code, Long rid) {
    StringBuffer sql = new StringBuffer();

    sql.append("SELECT  ");
    sql.append("   uploadfile_id, ");
    sql.append("   code, ");
    sql.append("   rid,  ");
    sql.append("   store_filename, ");
    sql.append("   upload_filename,  ");
    sql.append("   fsize,  ");
    sql.append("   ftype,  ");
    sql.append("   cdate,  ");
    sql.append("   udate ");
    sql.append("  FROM  uploadfile  ");
    sql.append(" WHERE CODE = :code  ");
    sql.append("   AND RID = :rid  ");

    return template.query(
        sql.toString(),
        Map.of("code",code,"rid",rid),
        BeanPropertyRowMapper.newInstance(UploadFile.class));
  }

  //첨부파일 조회
  @Override
  public Optional findFileByUploadFileId(Long uploadfileId) {
    StringBuffer sql = new StringBuffer();
    sql.append(" select * ");
    sql.append("  from uploadfile ");
    sql.append(" where uploadfile_id = :uploadfile_id ");

    UploadFile uploadFile = null;
    try {
      Map param = Map.of("uploadfile_id", uploadfileId);
      uploadFile = template.queryForObject(sql.toString(),param,BeanPropertyRowMapper.newInstance(UploadFile.class));
      return Optional.of(uploadFile);
    }catch (EmptyResultDataAccessException e){
      return Optional.empty();
    }
  }

  // 첨부파일 삭제 by uplaodfileId
  @Override
  public int deleteFileByUploadFildId(Long uploadfileId) {
    StringBuffer sql = new StringBuffer();
    sql.append("delete from uploadfile ");
    sql.append(" where uploadfile_id = :uploadfile_id ");

    return template.update(sql.toString(), Map.of("uploadFile_id",uploadfileId));
  }

  // 첨부파일 삭제 by code, rid
  @Override
  public int deleteFileByCodeWithRid(String code, Long rid) {
    StringBuffer sql = new StringBuffer();
    sql.append("delete from uploadfile ");
    sql.append(" where code = :code ");
    sql.append("   and rid = :rid ");

    return template.update(sql.toString(),Map.of("code",code,"rid",rid));
  }
}

SqlParameterSource[] params = SqlParameterSourceUtils.createBatch(uploadFiles);는 uploadfile의 정보를 배열로 담은 것이다.

template.batchUpdate(sql.toString(), params);이건 배열에 담긴 걸 한 꺼번에 처리한다는 뜻이다.

배치처리란 insert문 여러 개를 한 꺼번에 쏘는 것이다.

이번엔 Test를 할 차례다.

ctrl+shift+T로 구조를 똑같게 테스트 환경을 만들 수 있다

@SpringBootTest

UploadDAOImplTest {
  @Autowired
  private UploadFileDAO uploadFileDAO
    
 @Test
 @Displayname("단건 첨부")   
  
}

IOC는 개발자가 직접 객체를 생성하지 않고, 프레임워크가 직접 생성하는 객체다.

DI는 private UploadFileDAO uploadFileDAO즉 DAO에 담긴 객체를 내게 달라는 뜻이다.

@RequiredArgsConstrutor는

final 생성자를 재료로 삼아서, 매개변수를 만들어 준다.

그렇게 되면 객체 연관관계 , 즉 sql의 pk,fk와 같이 app같에도 객체와 객체사이 참조가 되버린다.

여기선 uploadFileDAOImpl과 NamedParameterJDBCTemplate이 그 관계다.

insert into code (code_id,decode,pcode_id,useyn) values('F01','첨부파일',null,'Y');
insert into code (code_id,decode,pcode_id,useyn) values('F010301','상품관리_일반','F01','Y');
insert into code (code_id,decode,pcode_id,useyn) values('F010302','상품관리_이미지','F01','Y');

F01은 파일 첨부다.

스프링프레임이 관리하는 객체를 Bean이라고 한다.

이제 SaveForm에서

private List<MultipartFile> attachFiles; // 일반파일

private List<MultipartFile> imageFiles; // 이미지파일 이렇게 해서 이미지,파일을 받을 수 있다.

단건으로 할려면

MulipartFile attachFile로 하면 됨.

그럼 saveform요청메세지 body에 담겨져 온다.

multipartFileTouploadFile

여기서 AttachfileType aa = AttachFileType.F010301

로 해서 이넘 타입의 상수 값을 가질 수 있다 .

여기서 aa앞에 있는 AttachfileType의 값만 소환 가능.

Enum은 한정된 값을 정한 타입이다. ex)요일,성별 등 정해진 값.

@Transaction은 논리적 최소 단위다 2 or not 즉 2개의 로직이 실행되지않으면 아예 실행안되는 것이다.

<div><label for="">일반첨부</label><input type="file"></div>

여기서 파일 여러 개 추가 할려면

<div><label for="">일반첨부</label><input type="file" multiple></div>

이렇게 하면 된다.

 

'HTTP 웹 기본 지식' 카테고리의 다른 글

네트워크 상에서 데이터의 이동 이해하기  (0) 2023.05.29
HTTP 1.1/2.0/3.0  (0) 2023.04.21
TCP/UDP  (0) 2023.04.20
IP(인터넷 프로토콜)  (0) 2023.04.13
인터넷에서 컴퓨터 둘은 어떻게 통신할까?  (0) 2023.04.08

+ Recent posts