이 글은 김영한님이 작성하셨습니다. 모든 개발자를 위한 HTTP 웹 기초 강의를 듣고 작성한 글입니다. 오타나 부정확한 내용이 있으면 언제든지 알려주세요! 감사합니다.
URI 및 웹 브라우저 요청 흐름
URI(Uniform Resource Identifier)
URL은 자원을 식별하는 통일된 방법입니다.
너나? 너엘? 너N? 이 세 가지의 차이점은 무엇입니까?
“URI는 로케이터, 이름 또는 둘 다로 더 분류될 수 있습니다.”

- URI라는 큰 개념이 있습니다. 자원 식별 예) 주민등록번호를 지정합니다.
- URL: 리소스 로케이터, 리소스 위치, 예: B. 내 위치
- URN: 리소스 이름, 리소스 이름, 예: B. 나 자신
- 웹 브라우저에 URL을 작성합니다!
- URN은 실명을 부여합니다!
- 문제는 이름을 지어도 찾을 수 없다는 점이다. 따라서 거의 URL만 사용됩니다.
URI
- 유niform: 리소스를 식별하기 위한 균일한 방법
- 아르 자형esource: 리소스, URI로 식별할 수 있는 모든 것(제한 없음)
- B.) 웹 브라우저의 HTML 파일, 실시간 교통 정보, 구분할 수 있는 모든 것.
- 나식별자: 다른 항목과 구별하기 위해 필요한 정보
- 예) 주민등록번호
URL(유균일하게 아르 자형자원 엘ocator), URN(유균일하게 아르 자형자원 N오전)
- URL – 로케이터: 리소스의 위치를 나타냅니다.
- URN – 이름: 리소스에 이름을 부여합니다.
- 위치는 변경할 수 있지만 이름은 변경할 수 없습니다.
- URN 이름만으로 실제 리소스를 찾는 보편적인 방법은 없습니다.
- 예) urn:isbn:8960777331 (책의 isbn URN)
- 예) 책의 isbn을 검색해도 실제 책이 나오지 않는다.
URL을 분석해 봅시다!
https://www.google.com/search?q=hello&hl=de
URL
완전한 문법
- scheme://(userinfo@)host(:port)(/path)(?query)(#fragment)
- https://www.google.com:443/search?q=hello&hl=de
- 프로토콜(https)
- 호스트 이름(www.google.com)
- 포트 번호(443)
- 일어나다
- 쿼리 매개변수(q=hello&hl=en)
URL
계획하다
- 계획하다://(userinfo@)host(:port)(/path)(?query)(#fragment)
- https://www.google.com:443/search?q=hello&hl=ko
- 주로 로그를 사용합니다.
- 로그란 무엇입니까? 리소스에 액세스하기 위한 일련의 약속 및 규칙입니다.
- 예) http, https, ftp 등
- http는 포트 80을 사용하고 https는 포트 443을 사용합니다. 포트는 생략할 수 있습니다.
- https는 보안이 강화된 http입니다. (HTTP 보안)
- 현재 대부분의 웹사이트는 https를 통해 실행됩니다.
URL
사용자 정보
- 계획하다://(사용자 정보@)host(:port)(/path)(?query)(#fragment)
- https://www.google.com:443/search?q=hello&hl=de
- URL에 사용자 정보를 포함하여 인증이 필요할 때 사용합니다.
- 거의 사용하지 않습니다.
URL
주인
- scheme://(사용자 정보@)주인(:포트)(/경로)(?쿼리)(#단편)
- https://www.google.com:443/search?q=hello&hl=ko
- 호스트 이름
- 일반적으로 도메인 이름이나 IP 주소를 직접 입력할 수 있습니다.
URL
항구
- 체계://(userinfo@)호스트(:항구)(/path)(?query)(#fragment)
- https://www.google.com:443/search?q=hello&hl=ko
- 항구
- 연결 포트
- 기본적으로 생략. 생략하면 http는 80이고 https는 443입니다.
URL
떨어져 있는
- 체계://(사용자 정보@)호스트(:포트)(/떨어져 있는)(?Query)(#Fragment)
- https://www.google.com:443/구하다?q=안녕하세요&hl=ko
- 리소스가 있는 경로입니다.
- 일반적으로 계층 구조를 가지고 있습니다.
- 예)
- /홈/file1.jpg
- /구성원 -> 구성원 정보
- /구성원/100, /items/iphone12
URL
문의
- 체계://(사용자 정보@)호스트(:포트)(/경로)(?문의)(#파편)
- https://www.google.com:443/search?q=안녕하세요&hl=de
- 키=값 형식
- ?로 시작하고 &로 추가 가능
- 예) ?keyA=valueA&keyB=valueB
- 일반적으로 쿼리 매개변수(웹 서버에 제공되는 매개변수 정보), 쿼리 문자열(모두 텍스트이기 때문에) 등으로 불립니다.
- 웹 서버에 제공되는 매개변수, 텍스트 형식
URL
파편
- scheme://(userinfo@)host(:port)(/path)(?query)(#파편)
- https://docs.spring.io/spring-boot/docs/current/reference/html/getting-시작됨.html#시작-소개-스프링 부트
- 잘 사용하지 않습니다.
- 파편
- HTML의 북마크에 사용됩니다.
- 서버로 전송되는 정보가 아닙니다.
웹 브라우저 요청 흐름
https://www.google.com:443/search?q=hello&hl=de
- 웹 브라우저는 먼저 Google 서버를 찾아야 합니다.
- 먼저 DNS 서버에 쿼리합니다. -> IP 200.200.200.2, 포트 443(생략). IP 및 PORT 정보를 찾습니다.
- 그리고 HTTP 요청 메시지를 생성합니다.
생성된 HTTP 요청 메시지

HTTP 메시지 보내기

- 웹 브라우저는 HTTP 메시지를 생성합니다.
- SOCKET 라이브러리를 통해 OS 계층의 TCP/IP 계층으로 전달되어야 합니다.
- 찾은 IP와 PORT 정보를 통해 3-way handshake를 수행하여 Google 서버에 접속합니다.
- 연결 후 데이터를 보냅니다.
- 데이터를 캡슐화하여 TCP/IP 패킷을 생성하고 HTTP 메시지를 포함합니다.
- 패키지 정보는 인터넷으로 유입됩니다.
패키지 생성

- 전송 데이터는 웹 브라우저에서 생성됩니다.
- 여기에는 HTTP 메시지가 포함됩니다.
클라이언트 패킷 포워딩
- 생성된 패킷은 수많은 인터넷 노드를 통해 Google 서버로 전달됩니다.
- 요청 패킷이 도착하면 Google 서버는 TCP/IP 패킷을 버리고 HTTP 메시지를 가져옵니다.
- 검색된 HTTP 메시지를 구문 분석합니다. -> 검색어는 안녕하세요, 검색하러 오셨나요? 등
HTTP 응답 메시지

- Google 서버에서 HTTP 응답 메시지를 생성합니다.
- 콘텐츠 유형이 중요합니다. 예) 응답 데이터는 text/HTML 형식이고 언어는 UTF-8 문자 집합입니다.
- Content-Length: 예) 실제 HTML 데이터의 길이
서버 패킷 포워딩
- Google 서버도 같은 방식으로 응답 패킷을 생성하고 동일한 방식으로 TCP/IP 패킷으로 덮습니다.
- 생성된 패키지는 수많은 인터넷 노드를 통해 클라이언트로 전달됩니다.
- 클라이언트는 도착한 패킷에서 HTTP 메시지를 검사합니다.
- HTML 데이터의 유효성이 검사되고 웹 브라우저가 HTML을 렌더링합니다.
- HTML 결과를 확인합니다.