네트워크
네트워크(network)는 컴퓨터들이 통신망을 통해 서로 그물처럼 연결돼 있는 것이고, 인터넷(internet)은 네트워크가 전 세계적으로 연결된 통신망이다.
IP주소
클라이언트가 요청하고 서버가 응답하려면 주소가 필요하다. 서로의 위치를 알아야 통신할 수 있기 때문이다. 네트워크에 연결된 각 컴퓨터를 구분하는 유일한 주소를 IP(Internet Protocol adress)라고 한다. IP주소는 4바이트로 이뤄진 고유한 값으로 사람이 알아보기 쉽게 1바이트씩 10진수로 나타낸 총 10진수 4개의 숫자로 구성된다.
IP주소 버전
- IP주소에는 IPv4와 IPv6가 있다. IPv6는 네트워크에 연결된 컴퓨터가 증가함에 따라 IPv4로 구분할 수 있는 주소의 수가 부족해져서 기존 4바이트의 주소 체계를 16바이트로 확장한 주소 체계이다.
도메인 네임
대부분의 사용자는 IP주소보다 도메인 네임(domain name)으로 웹 사이트에 접속한다. 도메인 네임은 사용자가 쉽게 기억할 수 있도록 IP주소를 문자열로 변환한 것이다. ex) www.google.com -> IP주소 : 142.250.207.100
DNS
DNS(Domain Name System)는 도메인과 IP 주소의 매핑 정보를 가지고 있는 시스템이다.
DNS의 동작 방식은 다음과 같다.
- 사용자가 웹 브라우저의 주소 표시줄에 도메인을 입력한다.
- 웹 브라우저는 입력받는 도메인에 해당하는 IP주소를 DNS 서버(DNS를 운영하는 서버로, 네임 서버라고도 함)에 문의한다.
- DNS 서버는 도메인에 해당하는 IP 주소를 찾아 반환한다.
- 웹 브라우저는 IP주소를 할당 받아 해당 IP주소의 컴퓨터에 접속한다.
일반 사용자는 DNS를 따로 설정하지 않고 인터넷 서비스 제공 업체(ISP, Internet Service Provider)가 제공하는 정보(IP 주소와 도메인 매핑 정보)를 받아서 사용한다.
DNS 서버의 계층 구조
DNS 서버는 도메인을 체계적으로 관리하기 위해 도메인과 IP주소의 매핑 정보를 계층 구조로 분산해 저장한다. 이는 도메인을 계층화하고 각 계층마다 DNS 서버를 따로 둬서 운영한다는 의미이다. 도메인의 각 계층은 ‘.(닷, dot)’을 기준으로 구분한다. www.google.com과 같은 도메인에 ‘.(닷)’이 포함돼 있는 이유가 바로 이것이다.
www.google.com(.)의 계층 구조를 살펴보자. 마지막에 생략된 닷(.)이 루트 도메인이고, com은 최상위 레벨 도메인, google은 2레벨 도메인, www는 3레벨 도메인이다. 이 중에서 3레벨 도메인은 서브 도메인(sub-domain)이라고도 부른다. (해당 과정을 포함해 세부적으로 더 많은 단계가 존재한다. 네트워크에 특화된 직무를 맡고 싶다면 DNS 질의 프로세스, DNS 캐시, DNS 보안 등을 공부하자) 각 계층 마다 해당 도메인을 관리하는 DNS 서버가 존재한다.
포트와 포트 번호
IP주소로 특정 컴퓨터에 요청을 보냈다고 가정했을 때, 해당 컴퓨터에서 여러 프로그램이 실행되고 있다면 필요한 프로그램을 어떻게 찾아 접속할까? 바로 포트(port)를 통해 찾을 수 있다. 이를 통해 구동 중인 프로그램을 구분할 수 있다.
세 프로그램이 구동 중인 서버를 예로 들자. 해당 서버는 HTTP 프로토콜을 기반으로 웹 서비스 프로그램을(port 번호 : 80), SSH 프로토콜을 기반으로 외부 접속 프로그램을(port 번호 : 22), FTP 프로토콜을 기반으로 파일 전송 프로그램을(port 번호 : 20,21) 구동 중이다. 이 상태에서 클라이언트가 웹 서비스 프로그램에 접속하려면 해당 서버의 IP주소로 가서 80번 포트에 접속하면 된다.
이처럼 한 컴퓨터에서 구동중인 프로그램은 포트 번호로 구분한다. 포트 번호는 0 ~ 65535번까지이며, 그중 첫 번째인 0번과 마지막의 65535번은 사용하지 않는다. 또한 1~1023번은 ‘잘 알려진 포트(well-known port)’번호로, 이는 잘 알려진 프로그램의 용도에 따라 이미 할당돼 있다.
- 잘 알려진 포트 번호 | 포트번호 | 프로그램 | 프로토콜 | 설명 | |—|—|—|—| |80|웹 서비스|HTTP|웹 페이지의 데이터를 주고 받음| |443|보안이 강화된 웹 서비스|HTTPS|보안을 위해 웹 페이지에서 데이터를 주고 받는 과정을 암호화| |22|외부 접속 서비스|SSH|보안을 위해 컴퓨터를 원격에서 제어하는 과정을 암호화| |53|DNS 서비스|DNS|도메인 네임과 IP주소를 서로 변환| |20,21|파일 전송 서비스|FTP|파일 전송| |25|메일 전송|SMTP|메일 전송|
프로토콜
프로토콜(protocol)은 컴퓨터 네트워크에서 컴퓨터 간에 통신할 수 있도록 정해놓은 규칙과 절차를 말한다. 이는 컴퓨터 통신 간에 미리 정한 약속이다. 백엔드 개발과 관련된 주요 프로토콜은 TCP, IP, HTTP, HTTPS 등이 있다.
TCP와 IP
TCP(Transmission Control Protocol)과 IP(Internet Protocol)는 인터넷으로 연결된 컴퓨터들이 서로 정보를 주고 받는데 사용하는 프로토콜이다. 인터넷에서 데이터 통신은 대부분 이 두 프로토콜을 기반으로 이뤄지기 때문에 둘을 합쳐 TCP/IP라고 한다.
TCP/IP에서는 데이터를 패킷(packet)이라는 작은 단위로 나눠 전송한다. 이때 IP는 목적지 주소로 패킷을 빠르게 전달하는 역할을 한다.
하지만 패킷은 목적지가 잘 전달되는지, 패킷의 순서가 맞게 도착하는지 등을 신경 쓰지 않고 전송한다. 그렇기 때문에 IP로 전송된 패킷은 순서가 뒤섞이거나 중간에 유실될 수도 있다.
TCP는 이러한 문제를 해결한 신뢰성 있는 프로토콜이다. TCP는 목적지에 도착한 패킷을 순서에 맞게 정렬하고, 통신 중 유실된 패킷이 있으면 송신 측에 다시 보내달라고 요청한다.
인터넷에서 통신할 때는 TCP와 IP 프로토콜을 사용해 데이터를 빠르게 전달하면서도 데이터 전송의 신뢰성을 보장한다.
예시) 송신측 : HTTPS,HTTP(4계층 : 응용 계층) -> TCP(3계층 : 전송 계층) -> IP(2계층 : 인터넷 계층) -> 이더넷(1계층 : 네트워크 접근 계층)
수신측 : 이더넷(1계층 : 네트워크 접근 계층) -> IP(2계층 : 인터넷 계층) -> TCP(3계층 : 전송 계층) -> HTTPS,HTTP(4계층 : 응용 계층)
HTTP
HTTP(HyperText Transfer Protocol)는 인터넷에서 클라이언트와 서버 간에 데이터를 주고 받기 위해 사용하는 프로토콜이다. 위의 예시에서 보듯 HTTP로 처리한 데이터는 TCP와 IP를 거쳐 인터넷 통신망으로 전송됨.
HTTP는 ‘요청-응답 프로토콜’이라고도 한다. HTTP 요청과 HTTP 응답은 메시지 형태로 주고 받는데, 이를 HTTP 메시지(HTTP message)라고 한다. 두 메시지는 모두 시작 행(start line), 헤더(header), 빈 행(empty line), 본문(body)으로 구성된다.
- 시작 행 : 요청 혹은 응답과 관련된 주요 정보가 들어있다.
- 헤더 : 요청 혹은 응답과 관련된 부가 정보가 들어있다.
- 빈 행 : 헤더의 끝을 표시하기 위해 빈 행을 넣어 구분한다.
- 본문 : 통신을 통해 실제로 주고받는 데이터가 들어 있다. 요청 메시지의 본문에는 요청 시 전달할 데이터가, 응답 메시지의 본문에는 응답으로 보내는 데이터가 담긴다. 전달할 데이터나 응답할 데이터가 없으면 생략할 수 있다.
HTTP 메시지의 구성요소 중에 특히 시작행이 특히 중요하다. 무엇을 요청했고, 요청에 대한 응답이 성공적으로 이뤄졌는지 여부 등의 정보가 들어있기 때문이다.
요청 메시지의 시작 행
요청 메시지의 시작 행에는 HTTP 메서드(HTTP method), 요청 URI(Uniform Resource Identifier), HTTP의 버전 정보가 들어간다.
- HTTP 메서드 : 클라이언트가 서버로 보내는 요청의 종류를 나타낸다. |메서드|설명| |—|—| |GET|데이터 조회를 요청할 때 사용한다| |POST|새 데이터 등록을 요청할 때 사용한다| |PUT|전체 데이터 수정을 요청할 때 사용한다| |PATCH|일부 데이터 수정을 요청할 때 사용한다| |DELETE|데이터 삭제를 요청할 때 사용한다|
- 요청 URI : URI는 웹상의 고유한 자원을 식별하는 통합 자원 식별자로, 클라이언트로부터 요청을 받아 처리할 서버의 자원을 가리킨다.
- HTTP버전 : 해당 메세지에서 사용하는 HTTP 버전을 나타낸다. HTTP 버전은 기존 버전의 문제점을 해결하기 위해 더 높은 버전이 개발되고 있다.
응답 메시지의 시작 행
응답 메시지의 시작 행에는 HTTP 버전 정보, 상태 코드, 상태 메시지가 들어간다.
- 상태 코드 : HTTP 요청이 성공적으로 완료됐는지 여부를 총 5개 그룹으로 나타낸다. 이러한 상태 코드를 통해 앞 자리만 보고도 대략 어떤 에러인지 유추할 수 있다.
- 1xx번대는 정보를 제공하는 응답
- 2xx번대는 요청을 성공적으로 처리했다는 응답
- 3xx번대는 리다이렉션(redirection) 응답(리다이렉션이란 새 URI로 재요청하라는 의미)
- 4xx번대는 클라이언트 에러 응답
- 5xx번대는 서버 에러 응답
- 상태 메시지 : 상태 코드 뒤에 붙는 간략한 문구로, 상태 코드에 대한 해설을 제공한다.
HTTPS
HTTPS(HyperText Transfer Protocol over Secure Socket Layer)는 보안 요소가 강화된 HTTP 프로토콜이다. HTTP는 데이터를 암호화하지 않고 전송하기 때문에 중간에서 데이터를 탈취 당할 위험이 크다. 반면 HTTPS는 SSL(Secure Socket Layer) 또는 TLS(Transport Layer Security) 암호화 프로토콜을 사용해 데이터를 암호화하기 때문에 HTTP보다 데이터를 안전하게 전송할 수 있다.
HTTPS를 사용하면 클라이언트와 서버 간의 통신 내용이 제3자에 의해 변경되거나 변조될 위험이 줄어들어 데이터의 무결성과 인증이 보장된다. HTTPS는 SSL 인증서를 사용해 서버의 신원을 확인하기 때문에 클라이언트는 접속하는 웹 사이트의 신뢰성을 판단할 수 있다.
네트워크 정리
네트워크는 웹 애플리케이션 개발과 배포 시 적용되는 핵심 기술이므로 웹 개발자라면 반드시 공부해야 한다. 특히 백엔드 개발자는 네트워크의 구성이나 서버 배포 방법을 고민해야 하는 경우가 많아서 네트워크 관련 지식을 갖춰야 한다. 예를 들어 웹 브라우저와 DNS의 동작 방식을 이해하면 클라이언트와 서버의 통신 시간을 단축해 웹 페이지의 로딩 시간을 줄이고, 사용자에게 더 빠른 인터넷 경험을 제공할 수 있다.
더 깊게 공부하기 위해선 다음과 같은 키워드를 공부해야 한다.
- 내부 IP, 외부 IP
- 유동 IP, 고정 IP
- DNS, hosts 파일
- 레지스트리(registry), 레지스트라(registrar)
- well-known port, registered port, dynamic port
- 포트 포워딩(port forwarding)
- OSI 7 layer, TCP/IP 4 layer