HTTP(1) - 인터넷 네트워크
인프런 김영한 님 강의(모든 개발자를 위한 HTTP 웹 기본 지식)를
기반으로 필기했던 내용 위주로 정리해봤습니다.
그리고 뒷 부분에 (제 중심으로ㅡㅡ;) 이해하기 편하게
정리해보는 것이 가벼운 목표입니다.
HTTP를 배워야하는 이유부터 알고 가자.
우리가 만드는 웹 서비스는 전부 HTTP 기반으로 동작을 한다.
즉, HTTP를 모르고 개발 업무를 한다는 것은 원리나 기반 없이 당장 눈에 보이는 기능만 보게 된다.
나를 비롯하여 그냥 당장 기능이 필요하여 구글링 해서 만드는 사람들이 많았을 텐데
제일 기본적인 HTTP부터 확실하게 알고 가면 업무에 더 도움이 될 것이다.
인터넷 네트워크
우리가 숱하게 많이 보는 IP(Internet Protocol)부터 알아보자.
- 지정한 IP Address(ex : 100.100.100.1)에 데이터를 전달
- 패킷(Packet)이라는 통신 단위로 데이터를 전달
- 패킷 내에 IP Address와 데이터를 넣으면 목적지까지 가는 길에 수많은 노드들이 원하는 목적지로 전달해준다고 보면 된다.
하지만 한계점이 있다.
- 비연결성 : 대상이 없거나 서비스가 불능이어도 전송한다.
- 비신뢰성 : 중간에 분실되거나 데이터 순서가 바뀔 수 있다.
- 프로그램 구분 : 같은 IP 주소인데 해당 주소에 애플리케이션이 둘 이상이라면 알 수가 없다.
이를 해결하기 위해 우리가 많이 들어본 놈이 나타난다. 그건 바로 TCP다.
TCP의 특징은 아래와 같다.
- 연결 지향 : 비연결성을 해결하기 위해 3 way handshake 방식을 써서 목적지와 통신이 가능하다는 걸 알 수 있다.
- 데이터 전달 보증 : 데이터를 전송해서 잘 받았다면, 목적지에서도 해당 응답을 보내준다.
- 순서 보장 : 패킷 내에 데이터의 순서를 명시하여 잘못 도착하면, 다시 올바른 순서의 데이터를 보낸다.
저기 그럼 UDP는 뭔가요? 옛날에 스타1 할 때 피방에서 많이 썼는데...
- 기능이 거의 없는 녀석이다. IP와 거의 같음.
- 하지만 PORT와 체크섬 기능이 추가되어있다.
- 단순하면 뭐다? 빠르다.
- 하지만 단순하니 당연히 애플리케이션에서의 추가 작업이 필요하다.
- HTTP/3에서 UDP를 적극 활용하고 있다고 한다.
여기까지 쓰고 보니, IP의 단점인 프로그램 구분 방법에 대한 해결책이 없다.
이를 위한 해결책이 PORT라고 볼 수 있다.
- PORT가 뭐냐고? 개발하다 보면 보게 되는 주소에 있는 http://localhost:8080의 8080 같은 애들이다.
- 같은 주소여도 PORT에 따라 원하는 애플리케이션을 호출할 수 있다.
- 주소 보니까 PORT같은 거 없는데요? -> 이것도 기본 규칙이 있다. 일단 넘어가자.
- 0 ~ 1023은 이미 선점한 애들이 있고 해서 잘 쓰지 않는다.
- FTP : 20, 21 사용 중
- TELNET : 23 사용 중
- HTTP : 80
- HTTPS : 443
근데 우리는 실제로 IP로 통신하는 경우는 드물다. 일반인은 잘 모르기도 하고. 기억하기도 어렵다.
이를 위해 만든 것이 Domain이고 DNS(Domain Name System) Server를 이용하여 통신할 수 있다.
예를 들어, google.com이라는 domain을 DNS 서버에 요청하면, DNS 서버가 google.com에 맞는 IP를 알려주고,
이 IP를 통해 실제 접속이 가능하다.
이해하기 쉽게 써보기! (틀릴 수도 있음)
출발지~목적지를 단순한 집이라고 생각하자.
나는 목적지에 편지를 쓰고 싶다.
이 편지가 패킷이고, 편지에 쓰는 주소가 IP Address다.
근데 편지를 보낼 때 거기서 편지를 받을 수 있는 상태인지도 모르고,
아파트 동은 아는데 호수는 모르고,
중간에 편지가 사라질 수도 있고, 편지를 여러 장 보내는데 편지 순서가 뒤죽박죽이 될 수도 있다.
이를 해결하는 것이 TCP다.
TCP를 통해 미리 전화도 해서 '야, 너 거기 살고 있지?'라고 확인도 받고,
우체국이 잘 편지 보낼 수 있게 호수도 적고, 상대방이 잘 받았다고 답장도 해주고,
먼저 받아서 읽어야 할 편지 순서도 적어줄 수 있다.
근데 딱 봐도 TCP는 하는 게 너무 많다. 그러니 간소화하고 체크섬 정도 기능 넣은 것이 UDP다.
하지만 간소화한 만큼 UDP의 부족한 점은 애플리케이션이 대신해줘야 한다.
PORT는 아파트 호수다. 같은 아파트라 기본 주소는 같지만, 동 호수로 구분하는 것이다.
DNS는 설명하기 조금 애매한데... 예를 들어 나는 철수네 집에 편지를 보내고 싶을 때,
여기서 철수네 집이 DNS를 의미한다 생각한다.
내가 아는 곳에 "죄송한데 철수네 집 주소 좀.." 하고 물어보면
그쪽에서 어디 어디 몇 동 몇 호라고 알려줄 것이고, 이를 편지(패킷)에 적어 보내는 것이다.