업데이트됨 1개월 전
웹페이지를 불러올 때, 우리 컴퓨터는 단순히 다른 컴퓨터에 연결하는 것이 아닙니다. 그 컴퓨터에서 실행 중인 특정 서비스에 연결하는 것입니다—이메일 서버도 아니고, 데이터베이스도 아닌, 바로 웹 서버에요. 그 컴퓨터가 동시에 수백 가지를 실행하고 있더라도 말입니다.
어떻게 어떤 서비스인지 알 수 있을까요? 바로 포트 덕분입니다.
건물과 사무실
IP 주소는 건물까지 안내해 줍니다. 포트는 알맞은 사무실로 데려다 줍니다.
포트가 없다면, 모든 컴퓨터는 한 번에 한 가지 일만 할 수 있습니다. IP 주소 하나에 서비스 하나. 웹 서버와 이메일 서버를 동시에 실행하고 싶다면? 컴퓨터 두 대와 IP 주소 두 개가 필요하겠죠. 인터넷은 지금보다 훨씬 더 많은 주소를 필요로 하게 될 것입니다.
포트가 이 문제를 해결합니다. 포트는 0부터 65535까지의 숫자로, 컴퓨터에서 실행 중인 특정 서비스를 식별합니다. IP 주소와 포트를 결합하면 소켓이 됩니다—IP:포트 형식으로 쓰이는 고유한 엔드포인트입니다:
192.168.1.1:80— 웹 서버208.67.222.222:53— DNS 서버10.0.0.5:22— SSH 서버172.16.0.10:443— HTTPS 서버
IP 주소는 "이 컴퓨터"를 가리킵니다. 포트는 "이 컴퓨터의 이 서비스"를 가리킵니다.
모든 연결에는 양쪽 끝이 있습니다
브라우저가 웹사이트에 연결할 때, 네 가지 숫자가 그 연결을 정의합니다:
- 내 IP 주소
- 내 포트
- 상대방의 IP 주소
- 상대방의 포트
이 네 가지 조합을 소켓 쌍이라고 부르는데, 연결을 고유하게 식별합니다:
포트 54321을 사용하는 내 컴퓨터(192.168.1.100)가 포트 443의 웹 서버(93.184.216.34)와 통신하고 있는 것입니다.
서버의 포트(443)는 예측 가능합니다—HTTPS가 사용하는 포트가 바로 거기니까요. 그런데 내 포트(54321)는요? 운영체제가 임시 포트 범위에서 무작위로 배정한 것입니다. 이 특정 통신을 위해 잠시 쓰이는 내 응답 주소인 셈입니다.
탭 열 개, 대화 열 개
같은 웹사이트에 브라우저 탭을 열 개 열어 보세요. 그러면 열 개의 별도 연결이 만들어집니다:
출발지 IP는 같습니다. 목적지 IP와 포트도 같습니다. 하지만 각 탭은 고유한 출발지 포트를 갖습니다. 이것이 컴퓨터가 열 개의 대화를 따로따로 구분하는 방법입니다—각 탭마다 서로 다른 응답 주소가 있기 때문입니다.
잘 알려진 포트
서비스는 예측 가능한 포트에서 수신 대기하기 때문에, 클라이언트가 어디서 찾아야 할지 알 수 있습니다:
| 포트 | 서비스 |
|---|---|
| 80 | HTTP (웹) |
| 443 | HTTPS (보안 웹) |
| 22 | SSH (원격 접속) |
| 25 | SMTP (이메일 발송) |
| 53 | DNS (이름 해석) |
| 3306 | MySQL (데이터베이스) |
이는 어디까지나 관례일 뿐, 반드시 따라야 하는 규칙은 아닙니다. 원한다면 웹 서버를 포트 9999에서 실행할 수도 있습니다. 다만 그렇게 하면 모든 사용자가 yoursite.com 대신 yoursite.com:9999를 입력해야 한다는 걸 알아야겠죠.
NAT: 공인 주소 하나로 여러 기기 연결하기
대부분의 가정용 네트워크에는 수십 개의 기기가 있지만 공인 IP 주소는 하나뿐입니다. 네트워크 주소 변환(NAT)은 포트를 조작하여 이것을 가능하게 합니다.
노트북이 웹사이트에 연결할 때:
- 노트북이
192.168.1.100:54321에서 패킷을 전송합니다 - 라우터가 이를
203.0.113.50:12345로 바꿔 씁니다 (새 포트가 붙은 라우터의 공인 IP) - 라우터가 기억합니다: "포트 12345는 192.168.1.100:54321에 속한다"
- 응답이 포트 12345에 도착하면, 라우터가 이를 노트북으로 다시 전달합니다
네트워크의 모든 기기는 저마다 변환된 포트를 갖습니다. 라우터는 수천 개의 매핑을 관리하면서 모든 기기의 통신을 서로 분리해 유지합니다.
포트 포워딩
NAT는 외부로 나가는 연결에 대해서는 자동으로 작동합니다. 그런데 외부에서 들어오는 연결을 받아야 하는 서버를 직접 운영하고 있다면 어떻게 할까요?
포트 포워딩은 라우터에게 이렇게 알려줍니다: "포트 8080으로 트래픽이 들어오면, 192.168.1.100의 포트 80으로 보내라."
이렇게 하면 인터넷에 있는 누구든 라우터의 공인 IP 포트 8080에 연결하여 내부 웹 서버에 접근할 수 있습니다.
실제로 확인하기
어떤 컴퓨터에서든 netstat -an 또는 ss -tuln을 실행하면 소켓 쌍을 볼 수 있습니다:
첫 번째 줄은 웹 서버와의 활성 연결입니다. 두 번째는 모든 인터페이스에서 수신 대기 중인 SSH를 보여줍니다. 세 번째는 로컬호스트에서만 수신 대기 중인 MySQL입니다—다른 컴퓨터에서는 접속할 수 없습니다.
0.0.0.0은 "모든 네트워크 인터페이스"를 의미합니다. 127.0.0.1은 "로컬 연결만 허용"을 의미합니다. 서비스가 어느 IP 주소에서 수신 대기하느냐에 따라 누가 접근할 수 있는지가 결정됩니다.
이것이 중요한 이유
방화벽은 IP-포트 조합을 기반으로 결정을 내립니다. "443 허용, 23 차단"은 "HTTPS는 통과시키고, Telnet은 막는다"는 뜻입니다.
로드 밸런서는 하나의 외부 소켓을 여러 내부 서버로 매핑하여 트래픽을 여러 컴퓨터에 분산시킵니다.
모든 네트워크 애플리케이션—모든 웹사이트, 모든 API, 모든 데이터베이스 연결—이 이 주소 체계에 의존합니다. IP 주소가 컴퓨터를 찾습니다. 포트가 서비스를 찾습니다. 소켓 쌍이 대화를 식별합니다.
이것이 수십억 개의 기기가 수백만 개의 서비스를 서로 방해하지 않고 실행할 수 있는 비결입니다.
포트와 IP 주소에 관한 자주 묻는 질문
두 서비스가 같은 포트를 사용할 수 있나요?
같은 IP 주소에서는 불가능합니다. 특정 인터페이스에서 하나의 포트는 한 번에 하나의 서비스만 사용할 수 있습니다. 하지만 같은 포트 번호를 서로 다른 IP 주소에서 사용하는 것은 가능합니다—여러 네트워크 인터페이스가 있는 컴퓨터라면 각 인터페이스의 포트 80에서 서로 다른 웹 서버를 실행할 수 있습니다.
수신 대기하는 서비스가 없는 포트에 연결하려고 하면 어떻게 되나요?
연결이 즉시 실패합니다. "연결 거부(connection refused)" 오류가 발생합니다. 운영체제가 해당 포트에서 수신 대기 중인 서비스가 없다는 것을 알고 즉시 요청을 거부합니다—타임아웃도 없고, 기다림도 없습니다.
왜 어떤 URL에는 포트 번호가 있고 다른 URL에는 없나요?
브라우저는 HTTP에 포트 80을, HTTPS에 포트 443을 기본으로 가정합니다. 서비스가 표준 포트에서 실행되면 포트를 따로 지정할 필요가 없습니다. https://example.com은 https://example.com:443과 동일합니다. 하지만 웹 서버가 포트 8080에서 실행된다면, http://example.com:8080처럼 전체 주소를 입력해야 합니다.
어떤 포트가 다른 포트보다 더 안전한가요?
아니요. 포트 443이 본질적으로 안전한 것이 아닙니다—단지 HTTPS가 관례적으로 사용하는 포트일 뿐입니다. 보안은 포트 번호가 아니라 프로토콜과 암호화에서 비롯됩니다. 포트 443에서 암호화되지 않은 서비스를 실행한다고 해서 마법처럼 안전해지지는 않습니다.
이 페이지가 도움이 되었나요?