사전 잘 알려진 포트
개념

잘 알려진 포트

gabury1고친 사람 github-actions[bot]

잘 알려진 포트는 널리 쓰는 서비스마다 연결을 기다릴 번호를 하나씩 미리 정해 두는 약속입니다. 그래서 연결을 거는 쪽은 번호를 묻지 않고 곧장 찾아갑니다. 웹은 443번에서, 원격 접속은 22번에서 기다립니다. 0번부터 1023번까지가 이 약속에 쓰는 번호입니다.

쉽고 빠른 이해

잘 알려진 포트는 웹이나 메일처럼 널리 쓰는 서비스가 어느 번호로 연결을 받는지 미리 정해 둔 목록입니다. 브라우저가 주소창에 번호 없이도 웹 서버를 찾아가는 것이 이 목록 덕분입니다.

번호를 미리 정하지 않으면 거는 쪽은 상대 컴퓨터까지는 찾아가도 그 안의 어느 번호로 걸지 모릅니다. 번호를 따로 물어볼 곳도 보통 없습니다. 그래서 모두가 같은 번호를 외워 두는 쪽을 택했습니다.

어떻게 도나:

  1. 번호를 관리하는 기관이 서비스마다 번호를 배정하고 목록을 공개합니다
  2. 서버 프로그램은 배정된 번호로 연결을 기다립니다
  3. 거는 쪽은 서비스 종류만 보고 그 번호로 겁니다

대가는 번호가 약속일 뿐이라는 것입니다. 443번에서 무엇이 도는지는 번호가 보증하지 않습니다. 이 약속에 쓰는 0~1023번은 천 개 남짓이라 새 서비스가 받기 어렵습니다. 유닉스 계열에서는 관리자 권한이 있어야 이 번호를 맡습니다.

상세

불이 나면 소방서 번호를 찾아보는 사람은 없습니다. 119를 누르면 된다는 것을 모두가 압니다. 번호를 하나 정해 두고 다 같이 외워 둔 덕분에 처음 거는 사람도 헤매지 않습니다.

이 절은 잘 알려진 포트가 무엇이고 왜 두는지에서 시작합니다. 웹 주소와 파이썬 코드 몇 줄로 이 약속이 어디에 숨어 있는지 봅니다. 끝은 이 번호가 보증하지 않는 것입니다.

포트는 한 컴퓨터 안에서 데이터를 받을 프로그램을 가리키는 번호입니다. IP 주소(Internet Protocol address, 인터넷 프로토콜 주소)는 어느 컴퓨터인지까지만 가리킵니다. 포트가 그 안의 어느 프로그램인지를 마저 가리킵니다. 번호는 0부터 65535까지 있습니다.

잘 알려진 포트는 그중 0번부터 1023번까지입니다. 이 구간의 번호는 널리 쓰는 서비스에 배정됩니다. 웹 서버는 443번, 이름 조회 서버는 53번, 원격 접속 서버는 22번에서 연결을 기다립니다.

배정은 IANA(Internet Assigned Numbers Authority, 인터넷 할당 번호 관리 기관)가 맡습니다. 인터넷 프로토콜이 쓰는 번호와 이름을 한곳에서 배정하고 목록으로 공개하는 기관입니다. 목록이 하나뿐이라 두 서비스가 같은 번호를 두고 부딪히지 않습니다.

번호를 미리 약속하는 까닭

연결을 걸려면 상대의 주소와 포트를 둘 다 알아야 합니다. 주소는 DNS(Domain Name System, 도메인 네임 시스템)가 찾아 줍니다. 도메인 이름을 넣으면 IP 주소를 돌려주는 시스템입니다. 그런데 보통의 이름 조회는 포트 번호까지 알려 주지 않습니다.

번호를 물어볼 곳이 없으니 거는 쪽이 번호를 미리 알고 있어야 합니다. 서비스마다 번호를 하나로 못 박아 두면 이 문제가 사라집니다. 웹 서버에 붙으려는 프로그램은 누구나 443번으로 겁니다.

HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 프로토콜)는 브라우저와 웹 서버가 요청과 응답을 주고받는 규칙입니다. 약속된 번호는 80번입니다. HTTPS(HTTP Secure, 보안 HTTP)는 같은 요청과 응답을 암호화해서 주고받는 방식입니다. 약속된 번호는 443번입니다.

이 약속이 가장 잘 보이는 곳이 웹 주소입니다. URL(Uniform Resource Locator, 자원 위치 표시)은 앞머리에 https 나 http 처럼 통신 방식을 적습니다. 번호를 적는 칸도 있지만 보통 비워 둡니다. 비워 두면 브라우저가 앞머리를 보고 약속된 번호로 겁니다.

https://example.com/       # 443
http://example.com/        # 80
http://example.com:8080/   # 8080

앞의 두 줄은 번호를 적지 않았습니다. 그래도 브라우저는 앞머리를 보고 443번과 80번으로 겁니다. 셋째 줄처럼 콜론 뒤에 번호를 적으면 약속과 다른 번호로도 걸 수 있습니다.

번호 전체를 나누는 세 구간

0부터 65535까지의 번호는 세 구간으로 나뉩니다. 잘 알려진 포트는 그 첫 구간입니다.

구간 부르는 이름 누가 쓰나
0 ~ 1023 잘 알려진 포트 널리 쓰는 서비스에 배정한 번호
1024 ~ 49151 등록 포트 제품이나 서비스가 신청해 등록한 번호
49152 ~ 65535 임시 포트 연결을 거는 쪽이 그때그때 빌려 쓰는 번호

첫 구간은 시스템 포트라고도 부릅니다. 둘째 구간은 사용자 포트라고도 부릅니다.

첫 구간의 번호는 1024개뿐입니다. 전체 번호의 64분의 1입니다. 이 구간은 오래되고 널리 쓰이는 서비스들이 이미 차지하고 있습니다. 새로 만든 서비스는 대개 둘째 구간에서 번호를 받습니다.

자주 만나는 번호

아래 표는 백엔드 개발자가 자주 만나는 번호입니다. 표 뒤로는 같은 53번이 둘인 까닭과 운영체제가 이 목록을 두는 곳이 이어집니다.

번호 서비스 하는 일
22 SSH(Secure Shell, 보안 셸) 다른 컴퓨터에 암호화된 통로로 접속합니다
25 SMTP(Simple Mail Transfer Protocol, 간이 메일 전송 프로토콜) 메일 서버끼리 메일을 넘깁니다
53 DNS 도메인 이름으로 IP 주소를 찾습니다
80 HTTP 암호화하지 않은 웹 요청을 받습니다
123 NTP(Network Time Protocol, 네트워크 시간 프로토콜) 컴퓨터 시계를 맞춥니다
443 HTTPS 암호화한 웹 요청을 받습니다

HTTP·HTTPS 보다 한 층 아래에는 데이터를 실어 나르는 규칙이 따로 있습니다. 이 규칙을 전송 프로토콜이라고 합니다. 포트 번호는 전송 프로토콜마다 따로 매겨집니다.

대표적인 전송 프로토콜은 둘입니다. TCP(Transmission Control Protocol, 전송 제어 프로토콜)는 데이터가 빠짐없이 순서대로 닿게 챙깁니다. UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)는 그런 확인 없이 보내기만 합니다.

TCP 53번과 UDP 53번은 숫자만 같습니다. 서로 따로 매긴 별개의 번호입니다. 그래도 배정 목록은 대개 한 서비스에 두 전송 프로토콜의 같은 번호를 함께 줍니다. DNS 는 짧은 조회에 UDP 53번을 씁니다. 긴 응답에는 TCP 53번을 씁니다.

유닉스 계열 운영체제는 이 목록을 옮겨 적은 파일을 /etc/services 에 둡니다. 서비스 이름과 번호와 전송 프로토콜이 한 줄에 하나씩 적힌 텍스트 파일입니다. 프로그램은 이 파일을 읽어 이름으로 번호를 찾습니다.

Python
import socket

socket.getservbyname("https")  # 443
socket.getservbyname("ssh")    # 22

getservbyname 은 서비스 이름을 받아 번호를 돌려주는 함수입니다. netstat 같은 도구가 443 대신 https 라고 찍는 것도 같은 파일을 읽어서입니다.

서버가 맡는 번호와 거는 쪽이 빌리는 번호

연결 하나에는 양 끝이 있습니다. 잘 알려진 포트가 그중 어느 쪽의 번호인지가 요점입니다.

잘 알려진 포트를 맡는 쪽은 서버입니다. 서버 프로그램은 시작할 때 그 번호를 맡겠다고 운영체제에 등록합니다. 이 등록을 바인드라고 합니다.

데이터에는 번호가 둘 실립니다. 보낸 프로그램의 번호가 출발 포트입니다. 받을 프로그램의 번호가 도착 포트입니다.

거는 쪽도 번호가 하나 필요합니다. 답장이 돌아올 때 어느 프로그램에게 줄지 알아야 하기 때문입니다. 이 번호는 운영체제가 비어 있는 것을 골라 빌려 줍니다. 이렇게 빌린 번호를 임시 포트라고 합니다.

sequenceDiagram
    participant 브라우저 as 브라우저 · 임시 포트 51413
    participant 서버 as 웹 서버 · 443번
    브라우저->>서버: 출발 51413 → 도착 443 으로 연결을 건다
    서버-->>브라우저: 출발 443 → 도착 51413 으로 답한다

그림에서 약속된 번호는 서버의 443번 하나입니다. 브라우저의 51413번은 이번 연결에만 빌린 번호라 서버가 미리 알 길이 없습니다.

그래도 답장은 제대로 돌아옵니다. 서버는 걸어온 데이터에 적힌 출발 포트를 보고 그 번호로 답합니다. 약속이 필요한 것은 먼저 찾아가는 쪽이 알아야 할 상대 번호 하나뿐입니다.

관리자 권한이 필요한 구간

같은 0~1023 구간에는 운영체제가 붙인 규칙이 하나 더 있습니다. 번호를 배정하는 약속과는 별개의 규칙입니다.

유닉스 계열 운영체제는 이 구간의 번호를 맡을 때 관리자 권한을 요구합니다. 권한이 없는 프로그램이 바인드하면 거절당합니다. 그래서 이 구간을 특권 포트라고도 부릅니다.

까닭은 신뢰입니다. 아무 사용자나 22번을 맡을 수 있으면 그 컴퓨터의 원격 접속 서버 행세를 할 수 있습니다. 접속해 온 사람은 가짜 서버에 비밀번호를 넣게 됩니다. 관리자만 이 번호를 맡게 하면 이 번호에서 도는 프로그램은 관리자가 띄운 것이라고 믿을 수 있습니다.

리버스 프록시는 서버 앞에서 요청을 대신 받아 뒤쪽 서버로 넘기는 프로그램입니다. 이 규칙 때문에 443번은 흔히 리버스 프록시가 맡습니다. 애플리케이션 서버는 그 뒤에서 8080처럼 1024 이상의 번호로 뜹니다.

그러면 관리자 권한이 필요한 것은 앞에 선 리버스 프록시 하나뿐입니다. 요청을 처리하는 애플리케이션은 일반 사용자 권한으로 돌려도 됩니다.

모든 운영체제가 이 규칙을 두는 것은 아닙니다. 번호 배정은 어디서나 같습니다. 권한 규칙은 운영체제마다 다릅니다.

약속일 뿐인 번호

번호가 보증하지 않는 것도 있습니다. 잘 알려진 포트는 배정 목록이지 강제 장치가 아닙니다.

어느 프로그램이든 어느 번호에서나 돌 수 있습니다. 원격 접속 서버를 2222번에 띄워도 잘 돕니다. 거는 쪽이 그 번호를 알고 적어 주기만 하면 됩니다.

거꾸로 443번에 붙었다고 상대가 웹 서버라는 보장도 없습니다. 번호는 거기서 무엇이 돌 것이라는 기대일 뿐입니다. 무엇이 도는지는 주고받는 데이터를 봐야 압니다.

방화벽은 지나가는 데이터를 규칙에 따라 통과시키거나 막는 장비나 프로그램입니다. 방화벽 규칙은 흔히 번호로 서비스를 가립니다. 「443번만 연다」는 규칙은 웹만 허락하려고 세웁니다. 그래도 443번으로 오가는 다른 통신까지 함께 통과시킵니다.

포트 스캔은 어느 번호가 열려 있는지 밖에서 하나씩 두드려 보는 일입니다. 스캔은 흔히 잘 알려진 포트부터 두드립니다. 원격 접속 서버를 22번이 아닌 번호로 옮기면 자동으로 들어오는 접속 시도가 줄어듭니다. 그 번호를 찾아낸 상대에게는 여전히 열려 있습니다.

관련 항목

잘 알려진 포트와 함께 포트 번호를 나누는 구간

포트 · 등록 포트 · 임시 포트 · 특권 포트

잘 알려진 포트를 배정받은 프로토콜

HTTP · HTTPS · DNS · SSH · SMTP · NTP · FTP · 텔넷 · IMAP · POP3 · DHCP · LDAP

잘 알려진 포트를 배정하고 기록하는 기관과 문서

IANA · RFC 6335 · 서비스 이름 · URI 스킴

잘 알려진 포트를 맡고 거는 소켓 호출

소켓 · 바인드 · accept · connect · getservbyname

잘 알려진 포트 번호를 싣는 계층과 프로토콜

TCP · UDP · QUIC · 전송 계층 · 응용 계층

잘 알려진 포트를 보고 거르거나 넘기는 장비

방화벽 · 리버스 프록시 · 로드 밸런서 · 포트 포워딩 · NAT

잘 알려진 포트를 두드려 보는 기법과 도구

포트 스캔 · nmap · netstat · ss · lsof

다른 이름: well-known port · well-known ports · 웰노운 포트 · 시스템 포트 · system ports