개발자라면 누구나 매일같이 웹과 씨름합니다. 프론트엔드든 백엔드든, API 호출 한 번, 웹페이지 로딩 한 번에도 어김없이 등장하는 기술이 바로 DNS와 HTTP죠. 너무 당연하게 사용하다 보니 깊게 들여다볼 기회가 없었을 수도 있지만, 이 둘의 작동 원리를 이해하는 것은 웹 기반 시스템의 성능 개선, 트러블슈팅, 그리고 안정적인 서비스 구축에 생각보다 큰 영향을 미칩니다.
이번 글에서는 웹 통신의 근간을 이루는 DNS와 HTTP의 핵심, 그리고 자주 혼용되는 URI, URL, URN의 차이와 HTTP 버전별 특징까지 다시 한번 짚어보겠습니다. 이미 알고 있는 내용이라도 리마인드하는 느낌으로 가볍게 읽어보시면 좋을 것 같네요.
우리는 api.example.com
같은 도메인 이름으로 서버에 접속하지만, 실제 네트워크 통신은 IP 주소(172.16.10.5
같은)를 기반으로 이루어집니다. DNS(Domain Name System)는 이 도메인 이름을 IP 주소로 바꿔주는 일종의 분산된 데이터베이스 시스템입니다. 없으면 인터넷 사용 자체가 거의 불가능하죠.
www.google.com
을 입력하면 무슨 일이 벌어질까요?매번 일어나는 일이지만, 그 과정은 꽤 여러 단계를 거칩니다.
hosts
파일에 해당 도메인의 IP 정보가 있는지 뒤져봅니다. 있으면 여기서 바로 끝나죠. (캐시 만세!)이 과정 덕분에 우리는 복잡한 IP 대신 편리한 도메인 이름을 사용할 수 있는 거죠. 서비스가 느리거나 접속이 안 될 때 nslookup
이나 dig
같은 명령어로 DNS 조회가 제대로 되는지 확인해보는 게 트러블슈팅의 기본 중 하나입니다.
DNS는 도메인과 IP 주소(IPv4는 A
, IPv6는 AAAA
레코드) 매핑 외에도 다양한 정보를 관리합니다. 개발하다 보면 종종 마주치는 레코드 타입들이 있죠.
A
: 도메인 이름에 대한 IPv4 주소AAAA
: 도메인 이름에 대한 IPv6 주소CNAME
: 특정 도메인을 다른 도메인의 별칭으로 사용하고 싶을 때 (예: blog.example.com
을 gh-pages.github.io
로 연결)MX
: 이메일을 어떤 서버로 보내야 하는지 알려줄 때 (메일 서버 설정 시 필수)TXT
: 도메인 소유 확인이나 이메일 보안(SPF, DKIM) 설정 등에 임의의 텍스트 값을 넣을 때서비스 도메인을 세팅하거나, 서드파티 서비스(메일 발송, CDN 등)를 연동할 때 이런 레코드들을 직접 만지게 되는 경우가 많습니다.
우리는 웹상의 자원(Resource, 예: 웹 페이지, 이미지, API 엔드포인트 등)에 접근하기 위해 주소를 사용합니다. 이때 URI, URL, URN이라는 용어가 등장하는데, 이들의 관계를 명확히 이해해 봅시다.
URI (Uniform Resource Identifier: 통합 자원 식별자)
https://example.com/path
, mailto:user@example.com
, urn:isbn:9780134685991
URL (Uniform Resource Locator: 통합 자원 위치 지정자)
http
, https
, ftp
등), 호스트 주소, 경로 등을 포함합니다.https://www.google.com
, ftp://example.com/download/file.zip
URN (Uniform Resource Name: 통합 자원 이름)
urn:
스키마를 사용하며, ISBN(국제 표준 도서 번호)이나 UUID 등이 대표적인 예입니다.urn:isbn:9780134685991
, urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66
결론적으로, URI는 식별자(Identifier)이고 URL은 위치(Locator), URN은 이름(Name)입니다. 웹 개발에서는 주로 자원의 위치를 나타내는 URL을 다루게 되지만, 이들의 관계를 이해하고 있으면 기술 문서를 읽거나 커뮤니케이션할 때 더 명확하게 소통할 수 있습니다.
이제 우리가 가장 많이 사용하는 URL의 구조를 자세히 살펴보겠습니다.
scheme://host[:port]/path[?query][#fragment]
http
, https
, ftp
등)/users/1
)key=value
형태, &
로 구분. 예: ?q=network&page=1
)#section-2
)특히 REST API를 설계할 때 path
변수와 query
파라미터를 어떻게 활용할지 고민하게 되죠.
DNS를 통해 IP 주소를 알아냈고, URL/URI를 통해 원하는 자원까지 특정했다면, 이제 클라이언트(웹 브라우저 등)와 서버는 서로 데이터를 주고받아야 합니다. 이때 사용하는 통신 규약이 바로 HTTP(HyperText Transfer Protocol)입니다.
기본적으로 요청(Request)과 응답(Response) 쌍으로 이루어집니다.
클라이언트가 서버에게 보내는 메시지입니다. 브라우저 개발자 도구의 'Network' 탭을 열면 흔히 볼 수 있죠.
[메서드] [요청 경로] [HTTP 버전]
으로 구성됩니다. (예: GET /users/123 HTTP/1.1
)Host
, User-Agent
, Accept
, Content-Type
, Authorization
등이 자주 쓰입니다. API 개발 시 커스텀 헤더를 정의하기도 하죠.POST
, PUT
, PATCH
요청 시 주로 사용됩니다. (예: JSON 페이로드)요청의 종류를 나타냅니다. REST API 설계 시 어떤 메서드를 사용할지 결정하는 것이 중요합니다.
GET
: 리소스 조회 (멱등)POST
: 리소스 생성 (멱등 아님)PUT
: 리소스 전체 교체 또는 생성 (멱등)PATCH
: 리소스 부분 수정 (멱등성 논란 있음)DELETE
: 리소스 삭제 (멱등)HEAD
, OPTIONS
등 기타 메서드도 특정 용도로 사용됩니다.서버가 요청을 처리하고 클라이언트에게 보내는 메시지입니다.
[HTTP 버전] [상태 코드] [상태 메시지]
로 구성됩니다. (예: HTTP/1.1 200 OK
, HTTP/1.1 404 Not Found
)Content-Type
, Content-Length
, Set-Cookie
, Location
등이 대표적입니다.요청 처리 결과를 알려주는 세 자리 숫자. 디버깅할 때 가장 먼저 확인하게 되는 정보 중 하나입니다.
2xx
(성공): 200 OK
, 201 Created
, 204 No Content
등. 서버가 요청을 잘 처리했다는 의미.3xx
(리다이렉션): 301 Moved Permanently
, 302 Found
, 304 Not Modified
등. 다른 주소로 가라고 알려주거나 캐시를 사용하라고 지시.4xx
(클라이언트 오류): 400 Bad Request
, 401 Unauthorized
, 403 Forbidden
, 404 Not Found
등. 요청 자체가 잘못되었을 가능성이 높음. 클라이언트 측에서 해결해야 할 문제.5xx
(서버 오류): 500 Internal Server Error
, 502 Bad Gateway
, 503 Service Unavailable
등. 서버 쪽에서 문제가 발생했음을 의미. 백엔드 개발자가 해결해야 할 문제.적절한 상태 코드를 반환하는 것은 잘 설계된 API의 기본 소양과도 같습니다.
우리가 사용하는 HTTP도 계속 발전해왔습니다. 각 버전의 주요 특징과 개선점을 알아두면 웹 성능 최적화 관점에서 도움이 됩니다.
HTTP/1.1 (1997년)
HTTP/2 (2015년)
HTTP/1.1의 성능 한계를 극복하기 위해 등장했습니다.
참고: HTTP/2는 HTTP 계층에서의 HOL Blocking은 해결했지만, 여전히 TCP 계층의 HOL Blocking 문제(패킷 손실 시 해당 TCP 연결 전체가 지연)는 가지고 있습니다.
HTTP/3 (2022년)
TCP의 한계를 넘어서기 위해 아예 전송 계층 프로토콜을 QUIC(Quick UDP Internet Connections)으로 바꾼 버전입니다. QUIC은 UDP 기반이지만 TCP의 신뢰성(패킷 재전송 등)과 TLS 1.3의 보안 기능을 내장하고 있습니다.
요약 비교
특징 | HTTP/1.1 | HTTP/2 | HTTP/3 |
---|---|---|---|
기반 프로토콜 | TCP | TCP | QUIC (UDP 기반) |
메시지 형식 | 텍스트 | 바이너리 | 바이너리 |
HOL Blocking | HTTP/TCP 모두 존재 | TCP 계층에 존재 | 해결 |
동시 전송 | 파이프라이닝 (제한적) | 멀티플렉싱 | 멀티플렉싱 (QUIC) |
헤더 처리 | 비압축, 중복 | HPACK 압축 | QPACK 압축 |
연결 설정 | TCP + TLS 핸드셰이크 (느림) | TCP + TLS 핸드셰이크 (느림) | QUIC 핸드셰이크 (빠름) |
암호화 | 선택 (HTTPS) | 필수 (사실상) | 필수 |
연결 유지 | Keep-Alive | 단일 연결 | 연결 마이그레이션 지원 |
현재 많은 웹사이트들이 HTTP/2를 사용하고 있으며, Google, Facebook 등 대규모 서비스들을 중심으로 HTTP/3 도입이 점차 확산되고 있습니다.
DNS와 HTTP는 웹 기술의 가장 바탕을 이루는 약속입니다. 여기에 URI/URL/URN 같은 자원 식별 체계, 그리고 계속 발전해 온 HTTP 버전들의 특징까지 이해하고 있다면 웹 애플리케이션을 개발하고 운영하는 데 있어 훨씬 넓은 시야를 가질 수 있습니다.
API 엔드포인트 하나를 설계하더라도 URL 구조, HTTP 메서드, 상태 코드의 의미를 고민하고, 서비스 접속이 느릴 때 DNS 문제나 네트워크 지연, 혹은 사용 중인 HTTP 버전의 한계 등을 의심해보는 등, 기본 원리에 대한 이해는 문제 해결 능력과 직결됩니다.
혹시 잘못된 내용이나 추가하고 싶은 의견이 있다면 댓글로 편하게 남겨주세요!