Docker 컨테이너에서 Nginx, Apache, Spring Boot, Node.js와 같은 웹 애플리케이션을 실행했는데 브라우저에서 접속되지 않는 경우가 있습니다.
컨테이너 내부에서는 서비스가 정상적으로 실행되고 있지만, 컨테이너의 포트가 Docker 호스트에 공개되지 않았기 때문일 수 있습니다.
Docker 컨테이너는 기본적으로 독립된 네트워크 공간을 사용합니다. 따라서 외부 사용자가 컨테이너 내부 서비스에 접근하려면 호스트 포트와 컨테이너 포트를 연결하는 포트 매핑이 필요합니다.
이번 글에서는 Docker 포트의 기본 개념부터 -p, -P, EXPOSE, docker port 명령어, 특정 IP 주소에만 포트를 연결하는 방법과 포트 충돌 해결 방법까지 자세히 알아보겠습니다.
Docker Port란?
Docker Port는 컨테이너에서 실행되는 서비스를 Docker 호스트 또는 외부 네트워크에서 접근할 수 있도록 연결하는 기능입니다.
예를 들어 Nginx 컨테이너는 기본적으로 컨테이너 내부의 80번 포트에서 요청을 기다립니다.
하지만 컨테이너 내부 포트는 기본적으로 외부에 직접 공개되지 않습니다.
사용자 브라우저
↓
Docker Host
↓
Docker Container
↓
Nginx 80번 포트
사용자가 Docker 호스트의 8080번 포트로 접속했을 때 Nginx 컨테이너의 80번 포트로 요청을 전달하려면 다음과 같이 실행합니다.
docker run -d \
--name web \
-p 8080:80 \
nginx
포트 매핑 구조는 다음과 같습니다.
호스트 8080번 포트
↓
컨테이너 80번 포트
브라우저에서는 다음 주소로 접속합니다.
http://서버IP:8080
호스트 포트와 컨테이너 포트 차이
Docker 포트 매핑을 이해하려면 호스트 포트와 컨테이너 포트를 구분해야 합니다.
호스트 포트
Docker가 설치된 실제 서버에서 열리는 포트입니다.
8080
사용자는 이 포트로 접속합니다.
컨테이너 포트
컨테이너 내부에서 애플리케이션이 사용하는 포트입니다.
80
Nginx, Apache 또는 애플리케이션이 실제로 요청을 기다리는 포트입니다.
다음 명령의 포트 순서는 반드시 기억해야 합니다.
docker run -p 호스트포트:컨테이너포트 이미지
예시는 다음과 같습니다.
docker run -p 8080:80 nginx
왼쪽의 8080은 호스트 포트이고, 오른쪽의 80은 컨테이너 포트입니다.
-p 옵션 사용법
-p는 --publish의 축약형입니다.
특정 호스트 포트와 컨테이너 포트를 직접 연결할 때 사용합니다.
docker run -d \
-p 8080:80 \
nginx
전체 옵션 이름으로 작성할 수도 있습니다.
docker run -d \
--publish 8080:80 \
nginx
두 명령은 같은 의미입니다.
Docker 공식 문서에 따르면 호스트 주소를 별도로 지정하지 않고 포트를 게시하면 기본적으로 호스트의 모든 주소에 포트가 연결될 수 있습니다. 즉 -p 8080:80은 일반적으로 0.0.0.0:8080과 IPv6 주소를 통해 외부에서 접근 가능한 상태가 될 수 있으므로 방화벽과 접근 범위를 함께 확인해야 합니다.
여러 포트 연결하기
하나의 컨테이너에서 여러 포트를 공개할 수 있습니다.
docker run -d \
--name app \
-p 8080:80 \
-p 8443:443 \
nginx
연결 구조는 다음과 같습니다.
호스트 8080 → 컨테이너 80
호스트 8443 → 컨테이너 443
HTTP와 HTTPS 포트를 함께 공개할 때 사용할 수 있습니다.
동일한 컨테이너 포트를 다른 호스트 포트로 연결하기
같은 이미지를 사용한 여러 컨테이너를 각각 다른 호스트 포트로 실행할 수 있습니다.
첫 번째 컨테이너를 실행합니다.
docker run -d \
--name web1 \
-p 8081:80 \
nginx
두 번째 컨테이너를 실행합니다.
docker run -d \
--name web2 \
-p 8082:80 \
nginx
두 컨테이너 모두 내부에서는 80번 포트를 사용하지만 호스트에서는 서로 다른 포트를 사용합니다.
호스트 8081 → web1 컨테이너 80
호스트 8082 → web2 컨테이너 80
접속 주소는 다음과 같습니다.
http://서버IP:8081
http://서버IP:8082
특정 IP 주소에만 포트 연결하기
호스트에 여러 네트워크 인터페이스가 있다면 특정 IP 주소에만 포트를 연결할 수 있습니다.
docker run -d \
-p 192.168.0.10:8080:80 \
nginx
형식은 다음과 같습니다.
호스트IP:호스트포트:컨테이너포트
내부 네트워크 IP에만 연결하면 해당 네트워크에서만 서비스에 접근하도록 제한할 수 있습니다.
로컬 호스트에서만 접근하도록 설정하기
외부 인터넷에서는 접근하지 못하게 하고 Docker 호스트 내부에서만 접근하도록 설정하려면 127.0.0.1에 연결합니다.
docker run -d \
--name admin-web \
-p 127.0.0.1:8080:80 \
nginx
이 경우 Docker 호스트에서는 다음 주소로 접속할 수 있습니다.
http://127.0.0.1:8080
하지만 일반적인 외부 컴퓨터에서는 서버의 공인 IP 주소를 이용해 직접 접속할 수 없습니다.
관리자 페이지, 내부 API, 데이터베이스 관리 도구처럼 외부 공개가 필요하지 않은 서비스에 유용합니다.
0.0.0.0의 의미
다음 명령은 호스트의 모든 IPv4 네트워크 인터페이스에 포트를 연결한다는 의미입니다.
docker run -d \
-p 0.0.0.0:8080:80 \
nginx
다음과 같이 IP 주소를 생략한 명령도 일반적으로 같은 방식으로 처리됩니다.
docker run -d \
-p 8080:80 \
nginx
서버에 공인 IP가 있고 방화벽이 허용되어 있다면 외부에서도 접근할 수 있습니다.
따라서 데이터베이스나 관리자 도구를 무조건 0.0.0.0에 공개하지 않도록 주의해야 합니다.
TCP와 UDP 포트 지정하기
Docker의 포트 매핑은 기본적으로 TCP를 사용합니다.
다음 두 명령은 일반적으로 같은 의미입니다.
docker run -d \
-p 8080:80 \
nginx
docker run -d \
-p 8080:80/tcp \
nginx
UDP 서비스를 실행한다면 /udp를 지정합니다.
docker run -d \
-p 5353:53/udp \
dns-image
같은 포트 번호를 TCP와 UDP 모두로 공개할 수도 있습니다.
docker run -d \
-p 5353:53/tcp \
-p 5353:53/udp \
dns-image
-P 옵션이란?
대문자 -P는 --publish-all의 축약형입니다.
Dockerfile의 EXPOSE 또는 docker run --expose로 지정된 모든 컨테이너 포트를 호스트의 임의 포트에 연결합니다.
docker run -d \
--name web \
-P \
nginx
Docker는 컨테이너의 공개 대상 포트를 호스트의 사용 가능한 임시 포트에 자동으로 연결합니다. 공식 문서에 따르면 -P는 명시적으로 노출된 포트만 게시하며, 호스트 포트는 시스템의 임시 포트 범위에서 자동으로 선택됩니다.
포트 연결 상태를 확인합니다.
docker port web
출력 예시는 다음과 같습니다.
80/tcp -> 0.0.0.0:32768
80/tcp -> [::]:32768
접속 주소는 다음과 같습니다.
http://서버IP:32768
-p와 -P의 차이
| 옵션 | 의미 | 호스트 포트 |
|---|---|---|
-p | 특정 포트를 직접 연결 | 사용자가 지정 |
-P | 노출된 포트를 모두 게시 | Docker가 자동 지정 |
--publish | -p의 전체 이름 | 사용자가 지정 |
--publish-all | -P의 전체 이름 | Docker가 자동 지정 |
운영 환경에서는 접속 포트를 명확하게 관리할 수 있는 -p를 주로 사용합니다.
-P는 테스트 환경에서 빠르게 컨테이너를 실행하거나 호스트 포트 충돌을 피하고 싶을 때 유용합니다.
Dockerfile EXPOSE란?
Dockerfile의 EXPOSE는 이미지가 어떤 포트를 사용하도록 설계되었는지 나타냅니다.
FROM nginx:1.27
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
하지만 EXPOSE 80을 작성했다고 해서 호스트의 80번 포트가 자동으로 열리는 것은 아닙니다.
실제 포트 매핑은 컨테이너를 실행할 때 설정해야 합니다.
docker run -d \
-p 8080:80 \
my-nginx
EXPOSE는 이미지 사용자에게 해당 애플리케이션이 사용하는 포트를 알려주는 문서화 역할과 -P 옵션이 게시할 포트를 지정하는 역할을 합니다.
EXPOSE와 -p 차이
| 항목 | EXPOSE | -p |
|---|---|---|
| 작성 위치 | Dockerfile | docker run 명령 |
| 실제 호스트 공개 | 아니오 | 예 |
| 주요 목적 | 사용 포트 안내 | 호스트와 컨테이너 연결 |
| -P 옵션과 연동 | 예 | 해당 없음 |
다음 Dockerfile만으로는 외부 접속이 되지 않습니다.
EXPOSE 80
컨테이너 실행 시 포트를 게시해야 합니다.
docker run -d -p 8080:80 myimage
–expose 옵션 사용법
Dockerfile을 변경하지 않고 컨테이너 실행 시 노출 대상 포트를 지정할 수 있습니다.
docker run -d \
--expose 8080 \
myapp
다만 --expose만 사용하면 호스트에 포트가 자동으로 게시되는 것은 아닙니다.
-P와 함께 사용할 수 있습니다.
docker run -d \
--expose 8080 \
-P \
myapp
Docker는 컨테이너의 8080번 포트를 호스트의 임의 포트에 연결합니다.
docker port 명령어 사용법
실행 중인 컨테이너의 포트 매핑을 확인할 때 사용합니다.
docker port web
출력 예시는 다음과 같습니다.
80/tcp -> 0.0.0.0:8080
80/tcp -> [::]:8080
Docker 공식 실행 가이드에서도 컨테이너 내부 포트와 호스트 게시 포트의 연결 관계를 확인할 때 docker port 명령을 사용할 수 있다고 설명합니다.
특정 컨테이너 포트만 확인할 수도 있습니다.
docker port web 80
또는 프로토콜까지 지정합니다.
docker port web 80/tcp
docker ps로 포트 확인하기
컨테이너 목록에서도 포트 정보를 확인할 수 있습니다.
docker ps
출력 예시는 다음과 같습니다.
CONTAINER ID IMAGE PORTS NAMES
a1b2c3d4e5f6 nginx 0.0.0.0:8080->80/tcp web
PORTS 항목의 의미는 다음과 같습니다.
호스트 8080번 포트
↓
컨테이너 80번 TCP 포트
Docker Inspect로 포트 확인하기
더 자세한 포트 설정을 확인하려면 docker inspect를 사용합니다.
docker inspect \
--format='{{json .NetworkSettings.Ports}}' \
web
출력 예시는 다음과 같습니다.
{"80/tcp":[{"HostIp":"0.0.0.0","HostPort":"8080"}]}
컨테이너가 공개하도록 설정한 포트를 확인하려면 다음 명령을 사용할 수 있습니다.
docker inspect \
--format='{{json .Config.ExposedPorts}}' \
web
포트 매핑 문제를 분석할 때는 .Config.ExposedPorts와 .NetworkSettings.Ports를 구분해 확인하는 것이 좋습니다.
Docker Compose에서 포트 설정하기
Docker Compose에서는 ports 항목을 사용합니다.
services:
web:
image: nginx:1.27
ports:
- "8080:80"
실행합니다.
docker compose up -d
접속 주소는 다음과 같습니다.
http://서버IP:8080
Compose에서 여러 포트 연결하기
services:
web:
image: nginx:1.27
ports:
- "8080:80"
- "8443:443"
HTTP와 HTTPS 포트를 함께 연결할 수 있습니다.
Compose에서 특정 IP에 연결하기
외부 접근을 차단하고 로컬에서만 접속하도록 설정할 수 있습니다.
services:
admin:
image: nginx:1.27
ports:
- "127.0.0.1:8080:80"
내부 관리 페이지나 프록시 뒤에서만 사용할 서비스에 적합합니다.
Docker Compose expose 사용법
Compose의 expose는 컨테이너가 사용하는 포트를 다른 서비스에 알려주는 설정입니다.
services:
app:
image: myapp
expose:
- "8080"
nginx:
image: nginx
ports:
- "80:80"
expose는 일반적으로 호스트에 포트를 직접 공개하지 않습니다.
같은 Compose 네트워크에 연결된 다른 컨테이너는 다음 주소로 접근할 수 있습니다.
http://app:8080
외부 사용자는 app:8080에 직접 접근할 수 없으며, 필요하다면 ports를 별도로 설정해야 합니다.
ports와 expose 차이
| 항목 | ports | expose |
|---|---|---|
| 호스트 포트 연결 | 예 | 아니오 |
| 외부 접근 | 가능 | 일반적으로 불가능 |
| 컨테이너 간 통신 | 가능 | 가능 |
| 형식 | 8080:80 | 80 |
| 주요 목적 | 외부 서비스 공개 | 내부 서비스 정보 표시 |
데이터베이스처럼 외부 공개가 필요하지 않은 서비스에는 불필요한 ports 설정을 하지 않는 것이 좋습니다.
MySQL 포트 매핑 예제
MySQL 컨테이너를 호스트의 3307번 포트로 공개합니다.
docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=password \
-p 3307:3306 \
mysql:8.4
연결 구조는 다음과 같습니다.
호스트 3307
↓
MySQL 컨테이너 3306
호스트에서 MySQL에 연결할 때는 3307번 포트를 사용합니다.
mysql \
-h 127.0.0.1 \
-P 3307 \
-u root \
-p
같은 Docker Network에 있는 다른 컨테이너가 MySQL에 접근할 때는 호스트 포트가 아니라 컨테이너 포트를 사용합니다.
mysql:3306
이 차이를 이해하지 못하면 데이터베이스 연결 오류가 발생할 수 있습니다.
컨테이너 간 통신에는 -p가 필요한가?
같은 사용자 정의 Docker Network에 연결된 컨테이너끼리 통신할 때는 일반적으로 호스트 포트 매핑이 필요하지 않습니다.
네트워크를 생성합니다.
docker network create app-network
MySQL 컨테이너를 실행합니다.
docker run -d \
--name mysql \
--network app-network \
-e MYSQL_ROOT_PASSWORD=password \
mysql:8.4
애플리케이션 컨테이너를 같은 네트워크에 연결합니다.
docker run -d \
--name app \
--network app-network \
myapp
애플리케이션은 다음 주소로 MySQL에 연결할 수 있습니다.
mysql:3306
호스트나 외부 사용자가 MySQL에 직접 접근할 필요가 없다면 -p 3306:3306을 설정하지 않는 편이 보안상 더 안전합니다.
포트 충돌 오류란?
이미 호스트에서 사용 중인 포트를 다른 컨테이너에 연결하려고 하면 오류가 발생합니다.
첫 번째 컨테이너를 실행합니다.
docker run -d \
--name web1 \
-p 8080:80 \
nginx
같은 포트를 사용하는 두 번째 컨테이너를 실행합니다.
docker run -d \
--name web2 \
-p 8080:80 \
nginx
다음과 비슷한 오류가 발생할 수 있습니다.
port is already allocated
하나의 호스트 IP와 프로토콜 조합에서는 일반적으로 같은 포트를 동시에 중복 사용할 수 없습니다.
포트 충돌 해결 방법
1. 다른 호스트 포트 사용
docker run -d \
--name web2 \
-p 8081:80 \
nginx
2. 기존 컨테이너 확인
docker ps
3. 기존 컨테이너 중지
docker stop web1
4. 기존 컨테이너 삭제
docker rm web1
5. 호스트에서 포트를 사용하는 프로세스 확인
Linux에서는 다음 명령을 사용할 수 있습니다.
sudo ss -lntp
특정 포트를 확인합니다.
sudo ss -lntp | grep ':8080'
lsof가 설치되어 있다면 다음 명령도 사용할 수 있습니다.
sudo lsof -i :8080
포트 매핑은 실행 후 변경할 수 있나?
일반적인 Docker 컨테이너의 포트 매핑은 컨테이너를 생성할 때 결정됩니다.
이미 생성된 컨테이너에 docker update를 사용해 새로운 포트 매핑을 추가하는 방식은 지원되지 않습니다.
포트를 변경하려면 기존 컨테이너를 삭제하고 새로운 포트 설정으로 다시 생성하는 것이 일반적입니다.
docker stop web
docker rm web
새 포트로 실행합니다.
docker run -d \
--name web \
-p 9090:80 \
nginx
Docker Compose를 사용한다면 compose.yaml을 수정한 뒤 컨테이너를 재생성합니다.
docker compose up -d --force-recreate
컨테이너가 실행되는데 접속되지 않을 때 확인할 사항
1. 컨테이너 실행 상태 확인
docker ps
컨테이너가 종료됐다면 다음 명령으로 확인합니다.
docker ps -a
2. 컨테이너 로그 확인
docker logs --tail 100 web
3. 포트 매핑 확인
docker port web
또는 다음 명령을 사용합니다.
docker ps
4. 컨테이너 내부 서비스 확인
docker exec web ps -ef
Nginx라면 다음 명령으로 설정을 검사할 수 있습니다.
docker exec web nginx -t
5. 애플리케이션 수신 주소 확인
애플리케이션이 컨테이너 내부의 127.0.0.1에서만 요청을 기다리면 포트가 게시되어 있어도 외부 접근이 되지 않을 수 있습니다.
다음처럼 모든 컨테이너 인터페이스에서 요청을 수신하도록 설정해야 할 수 있습니다.
0.0.0.0
예를 들어 Python Flask는 다음처럼 실행할 수 있습니다.
app.run(host="0.0.0.0", port=5000)
6. 호스트에서 직접 테스트
curl http://127.0.0.1:8080
7. 호스트 방화벽 확인
Ubuntu UFW를 사용하는 경우 다음 명령으로 상태를 확인합니다.
sudo ufw status
8080번 포트를 허용하려면 다음 명령을 사용할 수 있습니다.
sudo ufw allow 8080/tcp
클라우드 서버라면 운영체제 방화벽뿐 아니라 보안 그룹이나 네트워크 방화벽도 확인해야 합니다.
보안상 주의해야 할 포트 설정
다음과 같이 포트를 게시하면 서비스가 외부에 노출될 수 있습니다.
docker run -d \
-p 3306:3306 \
mysql
공인 IP가 연결된 서버라면 데이터베이스 포트가 인터넷에서 접근 가능한 상태가 될 수 있습니다.
외부 접속이 필요하지 않다면 포트를 게시하지 않고 Docker 내부 네트워크만 사용하는 것이 좋습니다.
호스트에서만 접속해야 한다면 다음처럼 설정할 수 있습니다.
docker run -d \
-p 127.0.0.1:3306:3306 \
mysql
또한 다음 항목을 함께 적용해야 합니다.
- 호스트 방화벽 설정
- 클라우드 보안 그룹 제한
- 강력한 비밀번호 사용
- 데이터베이스 원격 접근 권한 제한
- 외부 공개가 필요 없는 포트 제거
- 관리 서비스는 VPN 또는 SSH 터널 사용
실무에서 자주 사용하는 명령어
Nginx 포트 연결
docker run -d \
--name web \
-p 8080:80 \
nginx
로컬에서만 접근
docker run -d \
--name web \
-p 127.0.0.1:8080:80 \
nginx
여러 포트 연결
docker run -d \
-p 8080:80 \
-p 8443:443 \
nginx
UDP 포트 연결
docker run -d \
-p 5353:53/udp \
dns-image
노출된 포트를 자동 게시
docker run -d \
-P \
nginx
포트 매핑 확인
docker port web
컨테이너 목록과 포트 확인
docker ps
Inspect로 상세 포트 확인
docker inspect \
--format='{{json .NetworkSettings.Ports}}' \
web
호스트 수신 포트 확인
sudo ss -lntp
Docker Port를 이용한 Linux 서버 문제 해결
Nginx 컨테이너를 실행했지만 브라우저에서 접속되지 않는 상황을 가정해 보겠습니다.
먼저 실행 상태를 확인합니다.
docker ps
출력 결과의 PORTS 항목이 다음과 같다고 가정합니다.
80/tcp
이는 컨테이너가 80번 포트를 사용한다는 정보만 있고 호스트 포트에는 게시되지 않았다는 의미일 수 있습니다.
다음 명령으로도 확인합니다.
docker port web
출력 결과가 없다면 호스트 포트 매핑이 설정되지 않은 것입니다.
기존 컨테이너를 삭제합니다.
docker stop web
docker rm web
포트 매핑을 추가해 다시 실행합니다.
docker run -d \
--name web \
-p 8080:80 \
nginx
다시 포트를 확인합니다.
docker port web
출력 결과는 다음과 같습니다.
80/tcp -> 0.0.0.0:8080
호스트에서 연결을 테스트합니다.
curl http://127.0.0.1:8080
응답이 정상이라면 외부 접근이 되지 않는 원인은 방화벽이나 클라우드 보안 그룹일 가능성이 있습니다.
이처럼 포트 문제는 컨테이너 상태, 포트 매핑, 애플리케이션 수신 주소, 호스트 방화벽의 순서로 확인하면 원인을 빠르게 찾을 수 있습니다.
자주 묻는 질문
-p 8080:80에서 어느 쪽이 호스트 포트인가요?
왼쪽의 8080이 호스트 포트이고 오른쪽의 80이 컨테이너 포트입니다.
호스트포트:컨테이너포트
Dockerfile에 EXPOSE를 작성하면 외부에서 접속할 수 있나요?
아닙니다. EXPOSE는 이미지가 사용하는 포트를 설명하는 역할입니다. 외부 접근을 위해서는 docker run -p 또는 Compose의 ports 설정이 필요합니다.
-p와 -P는 무엇이 다른가요?
소문자 -p는 사용자가 호스트 포트를 직접 지정합니다. 대문자 -P는 노출된 컨테이너 포트를 호스트의 임의 포트에 자동으로 연결합니다.
같은 호스트 포트를 여러 컨테이너에서 사용할 수 있나요?
동일한 호스트 IP와 프로토콜에서는 일반적으로 같은 포트를 여러 컨테이너에 동시에 연결할 수 없습니다. 각 컨테이너에 서로 다른 호스트 포트를 지정해야 합니다.
컨테이너끼리 통신할 때도 포트 매핑이 필요한가요?
같은 사용자 정의 Docker Network에 연결된 컨테이너끼리는 일반적으로 포트 매핑 없이 컨테이너 이름과 내부 포트로 통신할 수 있습니다.
MySQL 컨테이너의 호스트 포트가 3307이라면 다른 컨테이너도 3307로 연결해야 하나요?
아닙니다. 같은 Docker Network에 있는 다른 컨테이너는 일반적으로 MySQL 서비스 이름과 컨테이너 내부 포트인 3306을 사용합니다.
mysql:3306
호스트 포트 3307은 Docker 호스트 또는 외부 프로그램이 접근할 때 사용합니다.
포트 매핑을 실행 중인 컨테이너에서 바로 변경할 수 있나요?
일반적으로 포트 매핑을 변경하려면 컨테이너를 새로운 포트 설정으로 다시 생성해야 합니다. 데이터가 필요하다면 Volume을 사용해 컨테이너와 데이터를 분리해야 합니다.
마무리
Docker Port는 컨테이너 내부에서 실행되는 서비스를 호스트와 외부 네트워크에 연결하는 핵심 기능입니다.
-p 옵션은 원하는 호스트 포트와 컨테이너 포트를 직접 연결하고, -P 옵션은 이미지에 노출된 포트를 호스트의 임의 포트에 자동으로 연결합니다.
포트 매핑의 순서는 반드시 호스트포트:컨테이너포트로 이해해야 합니다.
또한 Dockerfile의 EXPOSE는 포트를 실제로 외부에 공개하는 명령이 아니며, 외부 접근을 위해서는 -p 또는 Compose의 ports 설정이 필요합니다.
서비스에 접속되지 않을 때는 docker ps, docker port, docker inspect, docker logs를 이용해 포트 매핑과 컨테이너 상태를 확인해야 합니다.
외부 공개가 필요 없는 데이터베이스나 내부 서비스는 포트를 무조건 게시하지 말고 Docker Network 내부에서만 통신하도록 구성하는 것이 보안상 안전합니다.