- 0
- 93 words
컴퓨터가 네트워크를 통해 다른 컴퓨터와 통신할 때 가장 먼저 떠오르는 것이 IP 주소다.
예를 들어 어떤 서버의 IP 주소가 192.168.0.10이라고 해보자.
그런데 여기서 한 가지 문제가 생긴다.
서버 한 대에서는 웹 서버만 실행되는 것이 아니다. SSH 서버도 실행할 수 있고, 데이터베이스나 다른 프로그램도 동시에 실행할 수 있다.
그렇다면 컴퓨터는 들어온 데이터가 어떤 프로그램으로 가야 하는지 어떻게 구분할까?
여기에서 등장하는 것이 **포트 번호(Port Number)**다.
IP 주소만으로는 부족하다
IP 주소는 네트워크에서 데이터를 전달할 컴퓨터나 네트워크 인터페이스를 찾는 데 사용된다.
하지만 목적지 컴퓨터에 도착했다고 해서 통신이 끝나는 것은 아니다.
예를 들어:
인터넷
↓
192.168.0.10
├── 웹 서버
├── SSH 서버
├── 데이터베이스
└── 기타 프로그램
이렇게 여러 프로그램이 동시에 네트워크를 사용하고 있을 수 있다.
IP 주소가 건물 주소라면 포트 번호는 그 건물 안에서 어느 서비스로 들어갈 것인지 알려주는 번호라고 생각하면 이해하기 쉽다.
IP 주소
→ 어느 컴퓨터인가?
포트 번호
→ 그 컴퓨터의 어느 서비스인가?
포트 번호란?
포트 번호는 네트워크 통신에서 특정 애플리케이션이나 서비스를 구분하기 위해 사용하는 번호다.
포트 번호는 0부터 65535까지 사용할 수 있다.
0 ─────────────────────────────── 65535
│ │
포트 번호의 범위
다만 모든 번호를 아무렇게나 사용하는 것은 아니다.
일반적으로 잘 알려진 서비스에는 특정 포트 번호가 할당되어 있다.
대표적인 예를 보면:
| 서비스 | 대표적인 포트 |
|---|---|
| HTTP | 80 |
| HTTPS | 443 |
| SSH | 22 |
| FTP | 21 |
| DNS | 53 |
| SMTP | 25 |
| DHCP | 67 / 68 |
이런 번호를 보면 어떤 서비스와 통신하고 있는지 어느 정도 짐작할 수 있다.
80번 포트는 왜 HTTP일까?
웹사이트에 접속할 때 HTTP를 사용하면 기본적으로 80번 포트를 사용한다.
예를 들어:
http://example.com
이라고 접속했다고 해보자.
사용자가 URL에 포트 번호를 직접 적지 않아도 HTTP에서는 기본 포트가 80이라는 것을 알고 있기 때문에 일반적으로 다음과 같은 형태로 통신한다고 볼 수 있다.
클라이언트
│
│ TCP 80
↓
웹 서버
HTTPS라면 기본적으로 443번 포트를 사용한다.
클라이언트
│
│ TCP 443
↓
HTTPS 서버
물론 실제 서버에서는 다른 포트를 사용할 수도 있다.
예를 들어 개발 환경에서 웹 서버를 실행하다 보면:
http://localhost:8080
같은 주소를 자주 보게 된다.
이 경우에는 80번이 아니라 8080번 포트에서 해당 웹 서비스를 기다리고 있는 것이다.
포트 번호를 직접 입력할 수도 있다
URL 뒤에 :를 붙이고 포트 번호를 적으면 특정 포트로 접속할 수 있다.
http://192.168.0.10:8080
여기서:
192.168.0.10
↓
목적지 IP 주소
8080
↓
목적지 포트
라고 볼 수 있다.
실제로 개발을 하다 보면 localhost:8080, localhost:3000, localhost:5173 같은 주소를 자주 접하게 된다.
각각 다른 프로그램이 해당 포트에서 실행되고 있을 수 있기 때문에 같은 컴퓨터에서도 여러 웹 서비스를 동시에 실행할 수 있다.
포트 번호는 TCP와 UDP에서 따로 사용한다
여기서 하나 알아둘 부분이 있다.
포트 번호는 TCP와 UDP에서 각각 사용된다.
예를 들어 TCP 53번과 UDP 53번은 숫자는 같지만 서로 다른 전송 프로토콜에 속한다.
TCP 53
UDP 53
따라서 단순히 “53번 포트”라고만 말하기보다는 TCP 53번인지 UDP 53번인지까지 확인하는 것이 정확하다.
DNS가 대표적인 예다.
일반적인 DNS 질의에서는 UDP 53번을 사용하는 경우가 많지만, 특정 상황에서는 TCP 53번도 사용한다.
서버는 특정 포트에서 연결을 기다린다
네트워크 프로그램을 실행하면 서버 프로그램은 특정 포트를 사용해서 클라이언트의 연결이나 데이터를 기다릴 수 있다.
예를 들어 웹 서버가 TCP 8080 포트를 사용한다고 해보자.
서버
192.168.0.10
TCP 8080
↓
웹 서버 프로그램
클라이언트가:
192.168.0.10:8080
으로 접속하면 운영체제는 해당 네트워크 데이터를 적절한 프로그램으로 전달한다.
이렇게 생각하면 포트 번호가 단순히 숫자 하나가 아니라 네트워크 통신과 프로그램을 연결하는 역할을 한다는 것이 조금 더 잘 보인다.
클라이언트도 포트 번호를 사용한다
여기서 처음 공부할 때 헷갈리기 쉬운 부분이 있다.
“서버만 포트 번호를 사용하는 것 아닌가?”
그렇지 않다.
클라이언트도 통신할 때 자신의 포트 번호를 사용한다.
다만 서버처럼 항상 같은 번호를 사용하는 것이 아니라, 보통 운영체제가 **임시 포트(Ephemeral Port)**를 할당한다.
예를 들어:
클라이언트 서버
192.168.0.20:52143
│
│ TCP
↓
192.168.0.10:443
여기서:
52143
→ 클라이언트의 임시 포트
443
→ 서버의 HTTPS 포트
가 된다.
웹 브라우저에서 여러 사이트를 동시에 접속할 수 있는 것도 이런 구조와 관련이 있다.
하나의 컴퓨터에서 여러 연결을 구분할 수 있다
예를 들어 내 컴퓨터에서 웹사이트 두 곳에 동시에 접속한다고 생각해보자.
내 컴퓨터
192.168.0.20:51001
↓
→ 서버 A:443
192.168.0.20:51002
↓
→ 서버 B:443
두 서버 모두 443번 포트를 사용하고 있지만 클라이언트의 출발지 포트가 다르다.
그래서 운영체제는 각각의 연결을 구분할 수 있다.
TCP 연결을 구분할 때는 일반적으로 다음과 같은 정보가 함께 사용된다.
출발지 IP
출발지 포트
목적지 IP
목적지 포트
여기에 TCP라는 전송 프로토콜까지 포함해서 생각하면 된다.
이런 구조 덕분에 하나의 컴퓨터에서도 수많은 네트워크 연결을 동시에 관리할 수 있다.
포트 번호에도 범위가 나뉘어 있다
포트 번호는 크게 세 가지 범위로 나누어 생각할 수 있다.
1. Well-Known Ports
0~1023번 영역이다.
HTTP 80, HTTPS 443, SSH 22처럼 널리 알려진 서비스들이 여기에 포함된다.
2. Registered Ports
1024~49151번 영역이다.
특정 애플리케이션이나 서비스에서 사용하는 포트들이 등록되어 있다.
3. Dynamic / Private Ports
49152~65535번 영역이다.
클라이언트가 임시 포트로 사용하는 경우가 많다.
다만 실제 운영체제에서 사용하는 임시 포트 범위는 설정이나 운영체제에 따라 달라질 수 있기 때문에 이 범위를 무조건 외워서 적용할 필요는 없다.
포트 번호가 있다고 항상 서비스가 있는 것은 아니다
여기서도 조심해야 한다.
예를 들어 443번 포트라고 해서 반드시 HTTPS 서버가 실행되고 있는 것은 아니다.
포트 번호는 어디까지나 통신을 구분하기 위한 번호다.
어떤 프로그램이 실제로 그 포트를 열고 있는지는 별개의 문제다.
예를 들어:
192.168.0.10:8080
으로 접속했는데 서버에서 8080번 포트를 사용하는 프로그램이 없다면 연결이 되지 않을 수 있다.
반대로 관리자가 설정하면 일반적인 웹 서비스를 80번이 아닌 다른 포트에서 실행하는 것도 가능하다.
그래서 포트 번호만 보고 서비스를 100% 확정해서는 안 된다.
방화벽에서도 포트 번호를 사용한다
포트 번호는 보안 설정에서도 상당히 중요하다.
예를 들어 서버에서:
TCP 22 → 허용
TCP 80 → 허용
TCP 443 → 허용
처럼 특정 포트만 외부에서 접근할 수 있도록 설정할 수 있다.
반대로 사용하지 않는 포트에 대한 외부 접근을 막는 것도 가능하다.
이런 식으로 방화벽은 IP 주소뿐만 아니라 프로토콜과 포트 번호 등을 기준으로 트래픽을 허용하거나 차단할 수 있다.
그래서 서버를 운영하다 보면 “포트가 열려 있나?”라는 말을 자주 듣게 된다.
여기서 말하는 것은 보통 해당 포트로 들어오는 네트워크 연결을 받을 수 있는 상태인지 확인하는 것이다.
포트 포워딩에서도 포트가 등장한다
공유기를 사용하는 환경에서도 포트 번호를 볼 수 있다.
예를 들어 내부 서버의 주소가:
192.168.0.100:8080
이라고 해보자.
외부에서 특정 포트로 들어온 요청을 내부 서버의 8080번 포트로 전달하도록 공유기에 설정할 수 있다.
외부
│
│ 특정 포트
↓
공유기
│
│ 포트 포워딩
↓
192.168.0.100:8080
이것이 흔히 말하는 포트 포워딩이다.
NAT 환경에서 내부에 있는 서버나 장비에 외부에서 접근해야 할 때 사용되는 경우가 있다.
포트 번호를 확인하는 방법
실제로 서버를 관리하거나 개발하다 보면 특정 포트를 어떤 프로그램이 사용하고 있는지 확인해야 할 때가 있다.
운영체제에서는 이런 정보를 확인할 수 있는 명령어들이 제공된다.
예를 들어 Linux에서는:
ss -tuln
같은 명령어를 사용할 수 있다.
실행 중인 프로그램이 어떤 포트에서 연결을 기다리고 있는지 확인할 때 유용하다.
개발 중에 “분명 서버를 실행했는데 접속이 안 된다”는 상황이 생겼을 때도 포트가 제대로 열려 있는지 확인해보면 원인을 찾는 데 도움이 된다.
포트 번호를 쉽게 이해하면
포트 번호는 처음에는 그냥 숫자처럼 보인다.
그런데 IP 주소와 같이 생각하면 훨씬 간단하다.
IP 주소
→ 어느 컴퓨터인가?
포트 번호
→ 그 컴퓨터의 어느 서비스인가?
예를 들어:
192.168.0.10:443
이라고 하면
192.168.0.10
→ 목적지 컴퓨터
443
→ 목적지 포트
가 된다.
그리고 통신이 TCP인지 UDP인지까지 같이 봐야 정확하게 이해할 수 있다.
정리
포트 번호는 하나의 컴퓨터에서 여러 네트워크 서비스와 연결을 구분하기 위해 사용된다.
IP 주소가 데이터를 어느 컴퓨터로 보낼지 결정하는 역할을 한다면, 포트 번호는 그 컴퓨터 안에서 어떤 네트워크 서비스나 연결로 데이터를 전달할지 구분하는 역할을 한다.
대표적으로:
HTTP → 80
HTTPS → 443
SSH → 22
DNS → 53
같은 포트가 있다.
하지만 포트 번호 자체가 특정 서비스와 절대적으로 묶여 있는 것은 아니다. 서버 설정에 따라 다른 포트를 사용할 수도 있다.
또한 클라이언트는 보통 임시 포트를 사용하고, 서버의 목적지 포트와 함께 출발지·목적지 IP 및 포트 정보를 이용해 각각의 통신을 구분한다.
처음에는 192.168.0.10:443 같은 주소가 그냥 숫자와 숫자를 콜론으로 붙여놓은 것처럼 보였는데, 여기서 IP:Port 구조를 알고 나면 네트워크 설정을 볼 때 훨씬 이해하기 편해진다.
다음에 소켓을 살펴보면 이 포트 번호가 실제 프로그램의 네트워크 통신과 어떻게 연결되는지도 자연스럽게 이어진다.