0. Introduction
HTTP에 관한 학습내용의 기본 출처: 김영한님의 모든 개발자를 위한 HTTP 웹 기본지식
강의를 듣고 정리한 내용과 모르는 부분에 대한 추가 내용을 합쳐 올린다.
이 강의는 HTTP에 대한 웹 기본지식을 설명하는 강의이므로, 내용이 간략할 수 있다.
학습 이유: 프레임워크를 사용하여 웹 개발을 배우기 전에, HTTP에 대해 기본적인 지식을 알고 시작하고 싶어 HTTP 공부를 시작한다. 이 강의에 대해 공부 후, 네트워크 전반에 대해 공부한다.
1. URI
- URI (Uniform Resource Identifier)란??
- 로케이터(locater), 이름(name) 또는 둘 다 추가로 분류될 수 있다.
- from https://www.ietf.org/rfc/rfc3986.txt - 1.1.3. URI, URL, and URN
- 로케이터(locater), 이름(name) 또는 둘 다 추가로 분류될 수 있다.
1.1 URI, URL, URN의 각 의미
URI의 단어 뜻
- 통일된 방식으로 다른 자원들과 구별할 수 있는 정보
- Uniform: 리소스를 식별하는 통일된 방식
- Resource: URI로 식별하는 수 있는 모든 자원으로, 제한 없다.
- Identifier: 다른 항목과 구분하는데 필요한 정보 (식별자)
URL
- Locator: resource가 있는 위치를 지정한다.
URN
- Name: resource에 이름을 부여한다.
- urn:isbn:8960777331 (어떤 책의 isbn URN)
- URN 이름만으로 실제 리소스를 찾을 수 있는 방법이 보편화 되지 않았다.
- 위치는 변할 수 있지만, 이름은 변하지 않는다.
그래서 앞으로 URI를 URL과 같은 의미로 이야기하겠다
1.2 URL 분석
URL 전체 문법 구조
scheme://[userinfo@]host[:port][/path][?query][#fragment]
- 예시: https://www.google.com:443/search?q=hello&hl=ko
- 프로토콜:
https
- 호스트명:
google.com
- 포트번호:
443
- path:
\search
- query parameter:
?q=hello&hl=ko
1.2.1 scheme
scheme://[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 Secure)
1.2.2 userinfo
scheme:// [userinfo@] host[:port][/path][?query][#fragment]
https://www.google.com:443/search?q=hello&hl=ko
- URL에 사용자 정보를 포함해서 인증할 때 사용한다.
- 하지만 거의 사용하지 않는다.
1.2.3 host
scheme://[userinfo@]host[:port][/path][?query][#fragment]
https:// www.google.com :443/search?q=hello&hl=ko
- 호스트명이다.
- domain 명 또는 IP 주소를 직접 입력한다.
1.2.4 PORT
scheme://[userinfo@]host [:port][/path][?query][#fragment]
https://www.google.com :443 /search?q=hello&hl=ko
- 접속 포트
- 일반적으로 생략한다. 생략시 http는 80, https는 443이다.
1.2.5 path
scheme://[userinfo@]host[:port][/path][?query][#fragment]
https://www.google.com:443 /search ?q=hello&hl=ko
- 리소스의 경로다.
- 계층적 구조로 되어있다.
- /home/file1.jpg
- /members
- /members/100, /item/iphone12
1.2.6 query
scheme://[userinfo@]host[:port][/path][?query][#fragment]
https://www.google.com:443/search ?q=hello&hl=ko
- key = value 형태로 되어 있다.
- ?로 시작하며 &로 추가 가능하다.
- ex) ?keyA=valueA&keyB=valueB
- query parameer, query string 등으로 불린다. 웹서버에 제공하는 파라미터, 문자형태다.
1.2.7 fragment
scheme://[userinfo@]host[:port][/path][?query][#fragment]
https://docs.spring.io/spring-boot/docs/current/reference/html/gettingstarted.html #getting-started-introducing-spring-boot
- html 내부 북마크 등에 사용한다.
- 서버에 전송하는 정보가 아니다.
2. 웹 브라우저 요청 흐름
다음 URL을 가지고 https://www.google.com:443/search?q=hello&hl=ko
웹 브라우저가 어떻게 요청해서 진행되는지 흐름을 파악해보자.
- DNS 조회: google.comd을 DNS에서 조회하여 해당 IP 주소를 찾는다.
- HTTPS PORT는 생략한다.
443
- HTTP 요청 메시지를 클라이언트가 생성한다. HTTP 요청 메시지는 다음과 같다.
그러면 ‘Introduction 1: Internet Network’ 에서 학습한 과정이 진행된다.
HTTP 메시지 전송
- resource 요청 시, Application layer에서 HTTP 메세지를 생성한다.
- 3 way handshake를 통해 socket에 연결한다.
- socket library를 통해 transport layer으로 데이터를 전송한다.
- transport layer에서 HTTP를 포함한 TCP 정보를 씌운다.
- Internet layer에서 TCP 정보를 포함하는 IP 패킷을 생성한다.
- 패킷이 도착하면 서버는 패킷 내부 HTTP method를 해석하여 정보에 맞는 동작을 한다.
- 서버에서 HTTP 응답 메세지를 생성한다.
- 클라이언트에서는 응답 메세지를 받아 HTML 렌더링을 한다.