> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/deployment/ko/self-hosted/inference-server/configuration/security.md).

# 셀프 호스팅 서버 보안 설정

자체 하드웨어에서 Inference를 실행할 때는 **보안 상태에 대한 책임은 귀하에게 있습니다**. 로컬에 배포된 서버는 기본적으로 인증, 암호화 또는 네트워크 제한을 강제하지 않습니다. 이 서버는 노출 시 안전하도록 만들어진 것이 아니라 쉽게 시작할 수 있도록 만들어졌습니다. 기본 상태에서는 모델 실행 및 워크플로 실행 요청을 포함하여 서버에 도달하는 모든 요청에 응답합니다.

이 페이지에서는 자체 호스팅 배포가 로컬 개발 트래픽 이외의 것을 처리하기 전에 검토해야 하는 다섯 가지 제어 항목을 다룹니다. 이들은 상호 보완적이므로, 환경이 허용하는 한 많이 적용하세요.

{% hint style="warning" %}
**이는 귀하의 책임입니다.** Roboflow는 관리형 [서버리스 호스팅 API](/deployment/ko/roboflow-cloud/serverless-api.md) 및 [전용 배포](/deployment/ko/roboflow-cloud/dedicated-deployments.md) 서비스를 보호합니다. 직접 운영하는 서버의 경우 호스트, 주변 네트워크 및 서버가 허용하는 자격 증명을 보호하는 일은 귀하의 책임입니다. 아래 제어 항목 없이 신뢰할 수 없는 네트워크에서 서버에 접근할 수 있다면, 전 세계에 공개된 것으로 간주하세요.
{% endhint %}

## 1. 네트워크 액세스 제한

가장 효과적인 단일 제어는 애초에 서버를 노출하지 않는 것입니다. Inference는 기본적으로 포트 `9001` 에서 수신 대기하며 "신뢰할 수 있는" 네트워크라는 개념이 없습니다. 해당 포트에 도달할 수 있는 모든 것이 이를 사용할 수 있습니다.

* **localhost에 바인딩** 은 동일한 호스트의 프로세스만 필요로 할 때 사용합니다. 예를 들어 컨테이너 포트를 `127.0.0.1:9001:9001` 대신 게시합니다 `9001:9001`.
* **비공개 네트워크 또는 VPC에 유지** 하고, 공용 IP 대신 VPN, SSH 터널 또는 서비스 메시를 통해 액세스하세요.
* **호스트 및 클라우드 방화벽 또는 보안 그룹 사용** 으로 포트 `9001` 를 필요한 특정 클라이언트에서만 허용하세요.
* **앞단에 리버스 프록시 배치** (nginx, Traefik, Caddy 또는 클라우드 로드 밸런서)를 더 광범위하게 노출해야 하는 경우 사용하세요. 이렇게 하면 TLS, 속도 제한 및 액세스 로깅을 추가할 단일 지점을 확보할 수 있습니다.

인증과 TLS가 적용되지 않은 상태에서 추론 포트를 공용 인터넷에 직접 게시하지 마세요.

## 2. 인증 강제

기본적으로 자체 호스팅 서버는 **않습니다** 요청에 API 키를 요구하지 않습니다. 플랫폼에서 데이터를 가져올 때 Roboflow API 수준에서 이루어지는 인증 외에 서버 자체에는 추가 보안이 없습니다. 인증을 활성화하려면 `WORKSPACES_WHITELISTED_FOR_LOCAL_DEPLOYMENT` 를 서버 사용이 허용된 Roboflow 워크스페이스 슬러그의 쉼표로 구분된 목록으로 설정하세요:

```bash
docker run --rm -p 9001:9001 \
  -e WORKSPACES_WHITELISTED_FOR_LOCAL_DEPLOYMENT=your-workspace-url-slug,another-workspace-url-slug \
  roboflow/roboflow-inference-server-cpu:latest
```

이를 설정하면 서버가 인가 미들웨어를 설치합니다. 모든 추론 및 워크플로 요청에는 `api_key` 가 포함되어야 하며(쿼리 매개변수 또는 JSON 본문으로), Roboflow를 통해 허용 목록에 있는 워크스페이스 중 하나로 확인되어야 합니다. 키가 없거나, 유효하지 않거나, 허용 목록에 없는 요청은 다음과 함께 거부됩니다: `401 Unauthorized`.

{% hint style="info" %}
**API 키 검사가 적용되지 않는 항목** 서버가 계속 사용 가능하고 관찰 가능하도록 소수의 인증되지 않은 엔드포인트는 열려 있습니다: `/`, `/docs`, `/redoc`, `/info`, `/healthz`, `/readiness`, `/metrics`, `/openapi.json`, 그리고 정적 자산(`/static/...`, `/_next/...`). 다음을 `/info` 및 `/metrics` 서버에 도달할 수 있는 누구나 읽을 수 있는 정보로 취급하고, 네트워크 제한(제어 항목 1)을 사용하여 그 대상을 제한하세요.
{% endhint %}

**자체 인증을 사용하세요.** 내장 검사는 인가를 Roboflow 워크스페이스에 연결합니다. 자체 ID 모델이 있다면 서버 앞에 리버스 프록시 또는 인증 미들웨어를 배치하여 OAuth/OIDC, mTLS, 서명된 헤더, API 게이트웨이 또는 조직에서 이미 사용하는 방식을 강제하고, 인증된 트래픽만 포트 `9001`로 통과시키세요. 두 접근 방식은 함께 사용할 수 있습니다.

## 3. 네트워크에서 필요할 때 TLS 활성화

내장 API 키 검사는 요청에 자격 증명을 전송합니다. 이러한 요청이 완전히 통제할 수 없는 네트워크를 통과한다면 연결은 반드시 암호화되어야 하며, 그렇지 않으면 키와 페이로드가 평문으로 노출됩니다.

두 가지 옵션이 있습니다:

* **리버스 프록시 또는 로드 밸런서에서 TLS 종료** 를 서버 앞단에서 수행합니다. 이미 이를 운영 중인 경우 일반적인 선택입니다.
* **서버에서 직접 HTTPS 제공** 을 인증서와 키를 마운트하고 다음을 설정하여 수행합니다: `ENABLE_HTTPS=true`. 전체 가이드는  [HTTPS를 통한 Inference 제공](/deployment/ko/self-hosted/inference-server/configuration/https.md) 를 참조하세요. 여기에는 다음을 통한 상호 TLS(클라이언트 인증서)도 포함됩니다: `SSL_CA_CERTS`.

순수하게 로컬인 루프백 전용 트래픽(제어 항목 1, 다음에 바인딩됨: `127.0.0.1`)의 경우 TLS는 선택 사항입니다. 요청이 신뢰할 수 없는 네트워크를 통해 호스트를 벗어나는 경우에는 항상 TLS가 필요합니다.

## 4. 워크플로에서 사용자 지정 Python 실행 비활성화

워크플로에는 **사용자 지정 Python 블록**이 포함될 수 있습니다. 이는 서버 프로세스 내에서 실행되는 임의의 Python 코드입니다. 강력한 기능이지만, 서버에 워크플로를 제출할 수 있는 사람은 누구나 호스트에서 임의 코드를 실행할 수 있음을 의미합니다. 신뢰할 수 없는 클라이언트가 접근할 수 있는 서버에서는 원격 코드 실행에 해당합니다.

이는 다음으로 제어됩니다: `ALLOW_CUSTOM_PYTHON_EXECUTION_IN_WORKFLOWS`.

| 설정              | 효과                                               |
| --------------- | ------------------------------------------------ |
| `True` (현재 기본값) | 워크플로에서 사용자 지정 Python 블록을 정의하고 실행할 수 있습니다.        |
| `False`         | 사용자 지정 Python 블록은 거부되며, 다른 모든 워크플로 기능은 계속 작동합니다. |

워크플로가 사용자 지정 Python에 의존하지 않는다면 다음으로 설정하세요: `False`:

```bash
docker run --rm -p 9001:9001 \
  -e ALLOW_CUSTOM_PYTHON_EXECUTION_IN_WORKFLOWS=false \
  roboflow/roboflow-inference-server-cpu:latest
```

{% hint style="warning" %}
**기본값은 2026-06-19에 변경됩니다.** 현재 이 플래그의 기본값은 `True` 이며, 이전 버전과의 호환성을 위한 것입니다. 2026-06-19에 기본값은 다음으로 변경됩니다: `False`. 워크플로가 사용자 지정 Python 블록에 의존하는 경우 `ALLOW_CUSTOM_PYTHON_EXECUTION_IN_WORKFLOWS=true` 를 명시적으로 설정하여 해당 날짜 이후에도 계속 작동하도록 하세요. 그렇지 않은 경우 비활성화한 상태로 두고, 위의 네트워크 및 인증 제어가 이미 마련된 배포에서만 활성화하는 것이 좋습니다.
{% endhint %}

## 5. URL에서의 이미지 가져오기 제한(SSRF)

Inference는 요청에 제공된 URL에서 직접 이미지를 로드할 수 있습니다(`{"image": {"type": "url", "value": "https://..."}}`). 서버가 호출자가 제어하는 URL을 가져올 때마다, 호출자는 서버가 자신을 대신해 요청을 하도록 유도할 수 있습니다. 이를 **서버 측 요청 위조(SSRF)**&#xB77C;고 하는 공격 유형입니다. 내부 네트워크에 직접 접근할 수 없는 사람도 서버에 예를 들어 다음을 가져오도록 요청할 수 있습니다:

* `http://169.254.169.254/latest/meta-data/`, 인스턴스 자격 증명을 반환할 수 있는 클라우드 메타데이터 서비스(AWS, GCP, Azure)입니다.
* `http://127.0.0.1:9001/...` 및 기타 localhost 서비스(관리 패널, 데이터베이스 또는 Inference 서버 자체의 인증되지 않은 엔드포인트)입니다.
* `http://10.0.0.5/`, `http://192.168.1.1/`, 그리고 경계 내부에 있는 기타 사설(RFC1918), 링크 로컬, CGNAT 또는 IPv6 ULA 호스트입니다.

공개적으로 보이는 호스트 이름이 공개 대상이라는 증거는 아닙니다. 사설 IP로 확인될 수 있고, 사설 IP로 리디렉션될 수 있으며, **DNS 리바인딩** 을 사용할 수도 있습니다(검증 검사에는 공용 IP로 확인된 후 실제 연결에는 사설 IP로 확인됨). Inference는 이러한 모든 경우에 대한 제어 기능을 제공합니다.

### 필요하지 않다면 URL 입력 끄기

가장 강력한 제어는 URL 이미지를 전혀 허용하지 않는 것입니다. 클라이언트가 항상 base64 또는 파일 업로드로 이미지를 보낸다면 URL 가져오기를 완전히 비활성화하세요:

```bash
docker run --rm -p 9001:9001 \
  -e ALLOW_URL_INPUT=false \
  roboflow/roboflow-inference-server-cpu:latest
```

### 필요한 경우 URL 입력 강화

URL 이미지가 필요한 경우, 이 플래그는 서버가 가져올 수 있는 대상을 제한합니다. 함께 사용하면 내부 대상을 거부하고, **연결을 검증된 IP에 고정하며** (DNS 리바인딩 방지), 모든 리디렉션 홉을 다시 검사합니다.

| 변수                                       | 기본값     | 효과                                                                                                                                |
| ---------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `ALLOW_URL_INPUT`                        | `True`  | URL 이미지 입력의 마스터 스위치입니다. `False` 모든 URL 이미지를 거부합니다.                                                                                |
| `ALLOW_URL_TO_NON_GLOBAL_ADDRESSES`      | `True`  | 다음일 때 `False`, 호스트가 비전역 주소(루프백, 사설, 링크 로컬/메타데이터, CGNAT, IPv6 ULA 등)로 확인되는 URL은 거부되고, 두 번째 DNS 응답이 대상을 바꾸지 못하도록 연결은 검증된 IP에 고정됩니다. |
| `VALIDATE_IMAGE_URL_REDIRECTS`           | `False` | 다음일 때 `True`, 리디렉션은 무작정 따라가는 대신 한 번에 한 홉씩 따라가며 각 홉 URL을 다시 검증합니다.                                                                 |
| `MAX_IMAGE_URL_REDIRECTS`                | `30`    | 위 플래그와 관계없이 적용되는 리디렉션 홉의 엄격한 최대 한도입니다.                                                                                            |
| `ALLOW_NON_HTTPS_URL_INPUT`              | `False` | 다음일 때 `False`, 오직 `https://`  URL만 허용됩니다.                                                                                         |
| `ALLOW_URL_INPUT_WITHOUT_FQDN`           | `False` | 다음일 때 `False`, 호스트가 순수 IP이거나 공용 접미사가 없는 URL은 거부되므로 호출자는 실제 도메인 이름을 사용해야 합니다.                                                      |
| `WHITELISTED_DESTINATIONS_FOR_URL_INPUT` | 설정되지 않음 | 대상 허용 목록을 쉼표로 구분합니다(`subdomain.domain.suffix`). 설정하면 이들만 허용됩니다.                                                                   |
| `BLACKLISTED_DESTINATIONS_FOR_URL_INPUT` | 설정되지 않음 | 항상 거부되는 대상의 쉼표로 구분된 차단 목록입니다.                                                                                                     |

공용 HTTPS 이미지 URL은 계속 허용하는 강화된 구성:

```bash
docker run --rm -p 9001:9001 \
  -e ALLOW_URL_TO_NON_GLOBAL_ADDRESSES=false \
  -e VALIDATE_IMAGE_URL_REDIRECTS=true \
  roboflow/roboflow-inference-server-cpu:latest
```

가장 엄격하게 제어하려면 허용 목록을 추가하여 서버가 이미지를 제공하는 정확한 호스트에만 접근할 수 있게 하세요:

```bash
docker run --rm -p 9001:9001 \
  -e ALLOW_URL_TO_NON_GLOBAL_ADDRESSES=false \
  -e VALIDATE_IMAGE_URL_REDIRECTS=true \
  -e WHITELISTED_DESTINATIONS_FOR_URL_INPUT=images.example.com,cdn.example.com \
  roboflow/roboflow-inference-server-cpu:latest
```

{% hint style="warning" %}
**2026년 4분기에 두 기본값이 변경됩니다.** `ALLOW_URL_TO_NON_GLOBAL_ADDRESSES` (다음으로 `False`) 및 `VALIDATE_IMAGE_URL_REDIRECTS` (다음으로 `True`)는 현재 이전 버전과의 호환성을 위해 기존의 허용적인 동작을 기본값으로 사용합니다. 두 기본값은 2026년 4분기에 보안 값으로 변경될 예정입니다. 조기에 적용하려면 지금 보안 값으로 명시적으로 설정하고, 워크플로가 실제로 내부 URL 가져오기에 의존하는 경우에는 기존 값으로 설정하여 변경 사항에 당황하지 않도록 하세요.
{% endhint %}

{% hint style="info" %}
**프록시는 이 보호를 우회합니다.** 서버에 HTTP(S) 프록시가 구성된 경우 대상은 Inference가 아닌 프록시가 확인하므로 비전역 차단 및 연결 고정을 강제할 수 없습니다. 서버는 이를 감지하면 경고를 표시합니다. 이러한 제어에 의존하는 경우 프록시 자체가 접근할 수 있는 대상을 제한하세요.
{% endhint %}

{% hint style="info" %}
**Python SDK에서도 동일한 제어 기능** 다음 `inference-sdk` 클라이언트는 URL에서 이미지를 로드할 때 동일한 URL 정책과 SSRF 보호를 적용하고 동일한 환경 변수를 읽습니다. 따라서 URL 이미지를 전송 전에 하이드레이션하는 클라이언트도 보호됩니다.
{% endhint %}

## 권장 기준 구성

다음 범위 너머에서 접근 가능한 모든 자체 호스팅 서버의 경우 `localhost`:

* 알려진 클라이언트로 네트워크 액세스 제한(방화벽, 비공개 네트워크 또는 프록시).
* `WORKSPACES_WHITELISTED_FOR_LOCAL_DEPLOYMENT` 를 설정하거나 앞단에 자체 인증을 배치하세요.
* 서버 또는 업스트림 프록시에서 TLS 종료.
* `ALLOW_CUSTOM_PYTHON_EXECUTION_IN_WORKFLOWS=false` 가 실제로 필요한 경우가 아니라면 사용하세요.
* URL 이미지 입력 비활성화(`ALLOW_URL_INPUT=false`), 또는 다음으로 강화: `ALLOW_URL_TO_NON_GLOBAL_ADDRESSES=false` 및 `VALIDATE_IMAGE_URL_REDIRECTS=true`, 가능하다면 허용 목록도 추가하세요.

참고 항목 [허용되는 입력 형식](/deployment/ko/self-hosted/inference-server/configuration/input-formats.md) 에서 pickled-numpy 입력 제어를 확인하고, [프로덕션 준비 상태 체크리스트](/deployment/ko/production-checklist.md) 에서 오류 처리 및 속도 제한을 확인하세요.
