모든 개발자를 위한 HTTP 웹 기본 지식
이 글은 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 정리한 내용입니다.
1. 소개
- 웹 개발은 HTTP 기반위에서 개발하는데 언젠가 한번은 정리해야 함
강의 목표
- HTTP 전체 흐름 이해
- 실무에 필요한 핵심 내용
- 쉽게 설명
2. 인터넷 네트워크
인터넷 통신
- 인터넷에서 컴퓨터 둘은 어떻게 통신할까?
IP(인터넷 프로토콜)
- 지정한 IP 주소(IP Address)에 데이터 전달
- 패킷(Packet)이라는 통신 단위로 데이터 전달
- 통신에는 클라이언트와 서버의 IP가 필요하다.
IP 프로토콜의 한계
- 비연결성
- 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송 -> 받을 수 있는 상태인지 모름
- 비신뢰성
- 중간에 패킷이 사라지면? -> 패킷이 소실되어도 모름
- 패킷이 순서대로 안오면?
- 일반적으로 1.5KB 이상이면 끊어서 보내는데, 메세지의 순서가 다르게 도착해도 모름
- 프로그램 구분
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면?
TCP, UDP
위 IP 프로토콜의 단점을 TCP가 해결해준다
인터넷 프로토콜 스택의 4계층
- 애플리케이션 계층 - HTTP, FTP
- 전송 계층 - TCP, UDP
- 인터넷 계층 - IP
- 네트워크 인터페이스 계층 - LAN 카드, 드라이버, 장비
- 프로그램이 Hello, world! 메시지 생성 - Application
- SOCKET 라이브러리를 통해 전달 - Application -> OS
- TCP 세그먼트 생성, 메시지 데이터 포함 - OS
- IP 패킷 생성, TCP 데이터 포함 - OS
- 이더넷 프레임 생성(MAC 주소 포함), IP 데이터 포함 - LAN
MAC과 IP
-
MAC(Media Access Control) 주소: 네트워크 카드에 부여된 하드웨어 주소
- 변하지 않는 식별자 (물론 수동으로 변경 가능하지만 일반적으로 고정)
- 로컬 네트워크(LAN)에서만 의미 있음
-
IP(Internet Protocol) 주소: 네트워크 상의 논리 주소
- 동적으로 할당 가능 (예: DHCP)
- 인터넷 또는 내부 네트워크에서 사용
둘은 1:1, 1:N, N:1, N:M등 다양하게 매핑되어 ARP, RARP 프로토콜을 통해 연결되어 있다.
TCP 특징
전송 제어 프로토콜(Transmission Control Protocol)
-
연결지향 - TCP 3 way handshake(가상 연결)
-
SYN: 접속 요 청 - 클라이언트 -> 서버
-
SYN + ACK: 서버의 요청 수락 및 클라이언트 접속 요청 - 서버 -> 클라이언트
-
ACK: 클라이언트의 승인(최적화로 함께 데이터 전송) - 클라이언트 -> 서버
- 과거에는 랜선을 직접 꽂아줬다고 하는데(물리적 연결), TCP 연결은 수많은 노드들을 거치지만 가상연결
-
-
데이터 전달 보증
-
순서 보장
- 패킷 순서가 달라지면 달라진 패킷부터 다시 보내달라고 요청 보냄(내부적 최적화가 있을수도)
-
데이터 전달 보증, 순서 보장을 해주기에 신뢰할 수 있는 프로토콜
-
현재는 대부분 TCP 사용
UDP
-
하얀 도화지에 비유(기능이 거의 없음)
-
연결지향 X - TCP 3 way handshake X
-
데이터 전달 보증 X
-
순서 보장 X
-
데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠름
-
정리
- IP와 거의 같다. + PORT + 체크섬정도만 추가
- 애플리케이션에서 추가 작업 필요
-
HTTP/3는 UDP 위에서 동작함
-
HTTP/2까지는 TCP위에서 동작하지만 TCP의 한계
- 연결 설정에 3-way handshake 필요 → 느림
- TCP 연결은 OS 커널 레벨에서 관리 → 브라우저/앱에서 자유롭게 개선 불가
- TCP 멀티플렉싱 시 한 패킷 손실이 모든 스트림에 영향을 줌(HOL Blocking)
PORT
- 한번에 둘 이상 연결해야 하면?
- PORT - 같은 IP 내에서 프로세스 구분
- 0 ~ 65535 할당 가능
- 0 ~ 1023: 잘 알려진 포트, 사용하지 않는 것이 좋음
- FTP - 20, 21
- TELNET - 23
- HTTP - 80
- HTTPS - 443
내 로컬에 클라이언트, 서버 둘다 띄우고 통신할 때 HTTP로 통신하지만 당연히 요청이 외부를 거치지는 않는다.
이때는 OS가 주소를 해석하여 localhost
,127.0.0.1
내부라면, 실제 NIC(이더넷, 와이파이 등)를 사용하지 않고,
루프백 인터페이스를 통해 요청 전송하여, 해당 포트로 라우팅 함
DNS
3. URI와 웹 브라우저 요청 흐름
URI
-
URI(Uniform Resource Identifier)
-
"URI는 로케이터(locator), 이름(name) 또는 둘 다 추가로 분류될 수 있다"
-
URI는 자원을 식별하는 문자열
-
URL(Resource Locator): foo://example.com:8042/over/there?name=ferret#nose
- URL - Locator: 리소스가 있는 위치를 지정
- 앞으로 URI를 URL과 같은 의미로 이야기하겠음
-
URN(Resource Name): urn:example:animal:ferret:nose
- URN - Name: 리소스에 이름을 부여
URL
-
scheme://[userinfo@]host[:port][/path][?query][#fragment]
-
프로토콜(https)
- 프로토콜: 어떤 방식으로 자원에 접근할 것인가 하는 약속 규칙
-
호스트명(www.google.com)
-
포트 번호(443)
-
path(/search)
- 계층적 구조
-
쿼리 파라미터(q=hello&hl=ko)
- 키 밸류
-
fragment
- html 내부 북마크 등에 사용
- 서버에 전송하는 정보 아님
웹 브라우저 요청 흐름
- HTTP 요청 메세지 생성
- TCP/IP 4계층 따라 메세지 -> 패킷 -> 프레임으로 변환되어 LAN으로 전달
- 전달 받은 서버는 응답 메세지를 생성해 역으로 클라이언트에 전송
4. HTTP 기본
모든 것 이 HTTP
-
HTML, TEXT
-
IMAGE, 음성, 영상, 파일
-
JSON, XML (API)
-
거의 모든 형태의 데이터 전송 가능
-
서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용
-
지금은 HTTP 시대!
-
HTTP/0.9 1991년: GET 메서드만 지원, HTTP 헤더X
-
HTTP/1.0 1996년: 메서드, 헤더 추가
-
HTTP/1.1 1997년: 가장 많이 사용, 우리에게 가장 중요한 버전
- RFC2068 (1997) -> RFC2616 (1999) -> RFC7230~7235 (2014)
-
HTTP/2 2015년: 성능 개선
-
HTTP/3 진행중: TCP 대신에 UDP 사용, 성능 개선
특징
- 클라이언트 서버 구조
- 무상태 프로토콜(스테이스리스), 비연결성
- HTTP 메시지
- 단순함, 확장 가능
클라이언트 서버 구조
- Request Response 구조
- 클라이언트는 서버에 요청을 보내고, 응답을 대기
- 서버가 요청에 대한 결과를 만들어서 응답