콘텐츠로 이동

진단 및 검증

이 페이지는 클라이언트 측 방어 배포를 엔드투엔드로 검증하기 위한 계층화된 UAT 검증 매트릭스를 제공합니다. 각 테스트 케이스는 DNS 확인부터 CSD 텔레메트리까지 인프라 의존성 체인을 따르므로, 모든 구성 요소가 올바르게 작동하는지 체계적으로 증명할 수 있습니다.

이러한 명령은 CSD 콘솔 연습API 동등물입니다. 터미널에서 검증해야 하거나, 모니터링을 자동화하거나, UI 없이 CSD 기능을 시연해야 할 때 사용하십시오.

API 자동화 — 환경 설정에 설명된 대로 환경 변수를 설정하십시오:

Terminal window
set -a && source .env && set +a

아래의 모든 명령은 xTOKENx 플레이스홀더 형식을 사용합니다. 환경 변수($F5XC_API_TOKEN, $F5XC_NAMESPACE 등)로 대체하거나 페이지 상단의 인터랙티브 양식을 사용하십시오.

많은 CSD 엔드포인트는 에포크 타임스탬프(Unix 에포크 이후 초)를 필요로 합니다. 이 원라이너들은 일반적인 범위에 대한 시작/종료 시간을 계산합니다.

크로스 플랫폼 (macOS + Linux):

Terminal window
# 현재 시간을 에포크 초로
NOW=$(date +%s)
# 1시간 전
START_1H=$(( NOW - 3600 ))
# 24시간 전
START_24H=$(( NOW - 86400 ))
# 7일 전
START_7D=$(( NOW - 604800 ))
# 30일 전
START_30D=$(( NOW - 2592000 ))
프리셋셸 표현식
1시간3,600$(( $(date +%s) - 3600 ))
24시간86,400$(( $(date +%s) - 86400 ))
7일604,800$(( $(date +%s) - 604800 ))
30일2,592,000$(( $(date +%s) - 2592000 ))

아래의 각 테스트는 다음 구조를 따릅니다:

필드설명
테스트 ID계층 번호 + 순차 ID (예: DNS-1, TLS-2)
증명하는 것검증되는 특정 인프라 사실
명령바로 실행 가능한 curl 또는 dig 명령
합격 / 불합격정상 상태 대 비정상 상태의 예상 출력
수정관련 설정 또는 문제 해결 섹션 링크

DNS는 기초입니다 — 도메인이 로드 밸런서 VIP로 확인되지 않으면 다른 것은 작동하지 않습니다.

증명하는 것: 도메인이 로드 밸런서 VIP IP 주소로 확인됩니다.

Terminal window
dig +short xF5XC_DOMAINNAMEx A
결과의미
합격 — VIP IP 반환됨 (예: 72.19.3.185)도메인이 LB 가상 IP로 확인됨
불합격 — 빈 응답DNS A 레코드가 구성되지 않음

수정: API 자동화 — 4단계: DNS 구성

증명하는 것: 자동 TLS 인증서 프로비저닝을 위한 ACME 챌린지 레코드가 존재합니다.

Terminal window
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
dig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT
결과의미
합격*.autocerts.ves.volterra.io.로의 CNAME (외부 DNS)ACME 챌린지 CNAME이 준비됨
합격 — 도메인 값이 있는 TXT 레코드 (F5 Distributed Cloud (F5 XC) 관리 DNS)플랫폼 관리 ACME 챌린지 (TXT 레코드를 통해)
불합격 — 둘 다 비어 있음ACME 레코드가 구성되지 않음; 인증서가 PreDomainChallengePending 상태로 유지됨

수정: 외부 DNS의 경우, CNAME 생성: _acme-challenge.xF5XC_DOMAINNAMEx*.autocerts.ves.volterra.io. F5 XC 관리 DNS의 경우, DNS 영역에서 allow_http_lb_managed_records를 활성화하십시오 — DNS-4 참조. API 자동화 — 4단계를 참조하십시오.

증명하는 것: F5 XC가 루트 도메인에 대한 권한 있는 DNS 공급자인지 여부.

Terminal window
dig +short NS xF5XC_ROOT_DOMAINx
결과의미
ns1.f5clouddns.comns2.f5clouddns.com 포함F5 XC 관리 DNS — 레코드가 자동 생성될 수 있음
다른 네임서버외부 DNS — 레코드를 수동으로 생성해야 함

수정: API 자동화 — DNS 권한 감지

증명하는 것: F5 XC DNS 영역이 로드 밸런서에 대한 자동 레코드 생성을 허용합니다 (F5 XC 관리 DNS만 해당).

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/dns/namespaces/system/dns_zones/xF5XC_ROOT_DOMAINx" \
| jq '.spec.primary.allow_http_lb_managed_records'
결과의미
합격true플랫폼이 LB에 대한 A 및 ACME 레코드를 자동 생성함
불합격false 또는 null관리 레코드가 비활성화됨; 영역 업데이트를 통해 활성화

수정: API 자동화 — 옵션 A: F5 XC 관리 DNS


DNS가 확인된 후, 로드 밸런서에 유효한 TLS 인증서가 있어야 합니다.

증명하는 것: HTTPS LB에 자동 TLS 인증서가 발급되었습니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq '.spec.cert_state'
결과의미
합격"CertificateValid" 또는 "AutoCertRenewing"인증서가 유효하고 활성 상태
경고"DomainChallengePending" 또는 "DomainChallengeStarted"ACME 챌린지 진행 중 — 5–10분 대기
정보"AutoCertDomainRateLimited"Let’s Encrypt 속도 제한에 도달 — 데모 환경에서 예상되며, HTTP LB에는 영향 없음
불합격"PreDomainChallengePending"ACME 챌린지 레코드 누락 — DNS-2 참조

수정: ACME 챌린지 레코드가 준비되어 있는지 확인하십시오 (외부 DNS의 경우 CNAME, F5 XC DNS의 경우 관리 레코드 활성화). 인증서 프로비저닝은 레코드 구성 후 5–10분이 소요됩니다. 15분이 지나도 멈춰 있으면 인증서 중단 — 초기화 재생성을 참조하십시오. 속도 제한의 경우, HTTP LB는 영향받지 않습니다.

증명하는 것: 인증서가 예상 도메인을 포함하고 만료 정보를 표시합니다. HTTPS LB에만 적용됩니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq '{
cert_state: .spec.cert_state,
auto_cert_info: .spec.auto_cert_info
}'
결과의미
합격auto_cert_infodns_records 및 인증서 메타데이터 포함인증서 프로비저닝 세부 정보 이용 가능
불합격auto_cert_infonull 또는 비어 있음인증서가 아직 프로비저닝되지 않음

증명하는 것: TLS 인증서가 유효하고 클라이언트 측에서 핸드셰이크가 완료됩니다. HTTPS LB에 유효한 인증서가 있는 경우에만 적용됩니다.

Terminal window
curl -sv "https://xF5XC_DOMAINNAMEx/" 2>&1 \
| grep -E 'SSL connection|subject:|expire date:|issuer:'
결과의미
합격SSL connection using TLSv1.3, 유효한 주체 및 만료 표시엔드투엔드 TLS가 작동 중
불합격 — 연결 거부 또는 인증서 오류DNS 확인 및 인증서 상태 확인; 속도 제한의 경우 HTTP 사용

증명하는 것: HTTPS 로드 밸런서가 인증서 검증을 위한 올바른 ACME 대상을 보고합니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq '{
vip_ip: .spec.dns_info[0].ip_address,
acme_target: .spec.auto_cert_info.dns_records
}'
결과의미
합격vip_ipacme_target 채워짐이 값에 대해 DNS 레코드를 검증할 수 있음
불합격nullLB에 https_auto_cert가 구성되지 않았을 수 있음

로드 밸런서는 준비 상태여야 하고 올바르게 구성되어야 합니다.

증명하는 것: HTTP 로드 밸런서(기본)가 완전히 작동하며 트래픽을 수용하고 있습니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq '.spec.state'
결과의미
합격"VIRTUAL_HOST_READY"LB가 작동 중
불합격"VIRTUAL_HOST_PENDING_A_RECORD"DNS A 레코드가 구성되지 않음 — DNS-1 참조

수정: VIRTUAL_HOST_PENDING_A_RECORD에 멈춘 LB

증명하는 것: HTTP 로드 밸런서가 올바른 도메인으로 구성되어 있습니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq '.spec.domains'
결과의미
합격 — 배열에 FQDN 포함 (예: ["app.example.com"])LB가 예상 도메인에 대해 구성됨
불합격 — 누락되거나 잘못된 도메인올바른 도메인으로 LB 사양을 업데이트

증명하는 것: 올바른 JS 주입 정책으로 로드 밸런서에 클라이언트 측 방어가 활성화되어 있습니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq '{
csd_enabled: (if .spec.client_side_defense then true else false end),
js_policy: .spec.client_side_defense.policy
}'
결과의미
합격csd_enabled: true이고 정책에 js_insert_all_pages 포함모든 페이지에 JS 주입이 활성화된 CSD
불합격csd_enabled: falseLB에 CSD가 구성되지 않음

수정: API 참조 — 로드 밸런서에서 CSD 활성화

증명하는 것: 로드 밸런서가 예상 가중치 및 우선순위로 올바른 오리진 풀을 참조합니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq '.spec.default_route_pools[] | {
pool: .pool.name,
namespace: .pool.namespace,
weight: .weight,
priority: .priority
}'
결과의미
합격 — 가중치/우선순위와 함께 오리진 풀 이름 표시LB가 올바른 백엔드로 라우팅 중
불합격 — 비어 있거나 잘못된 풀LB default_route_pools 구성을 업데이트

증명하는 것: 로드 밸런서가 배포되어 모든 사이트에서 정상 조건을 보고합니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq '{
state: .spec.state,
dns_info: .spec.dns_info,
host_name: .spec.host_name
}'
결과의미
합격stateVIRTUAL_HOST_READY이고 dns_info 채워짐VIP가 할당된 LB가 완전히 배포됨
불합격 — 보류 상태 또는 빈 dns_info배포를 차단하는 DNS 또는 인증서 문제

증명하는 것: 디버깅을 위한 두 LB 구성의 포괄적인 스냅샷.

HTTP LB (기본):

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq '{
name: .metadata.name,
state: .spec.state,
domains: .spec.domains,
csd_enabled: (if .spec.client_side_defense then true else false end),
route_pools: [.spec.default_route_pools[] | .pool.name],
advertise: (if .spec.advertise_on_public_default_vip then "public_default_vip" else "custom" end)
}'

HTTPS LB (보조 — 인증서 상태 포함):

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \
| jq '{
name: .metadata.name,
state: .spec.state,
cert_state: .spec.cert_state,
domains: .spec.domains,
csd_enabled: (if .spec.client_side_defense then true else false end),
route_pools: [.spec.default_route_pools[] | .pool.name]
}'

오리진 풀은 로드 밸런서가 트래픽을 라우팅하는 백엔드 서버를 정의합니다.

증명하는 것: 오리진 풀이 올바른 백엔드 서버, 포트 및 LB 알고리즘으로 존재합니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \
| jq '{
name: .metadata.name,
origin_servers: [.spec.origin_servers[] | {
ip: .public_ip.ip,
labels: .labels
}],
port: .spec.port,
lb_algorithm: .spec.loadbalancer_algorithm,
endpoint_selection: .spec.endpoint_selection
}'
결과의미
합격 — 올바른 IP, 포트 및 알고리즘 표시오리진 풀이 올바르게 구성됨
불합격404 또는 잘못된 값오리진 풀이 누락되거나 잘못 구성됨

수정: API 자동화 — 2단계: 오리진 풀 생성

증명하는 것: LB와 오리진 서버 간의 연결에 TLS가 구성되어 있는지 여부.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \
| jq '{
tls_config: (if .spec.no_tls then "no_tls (plaintext)" elif .spec.use_tls then "use_tls (encrypted)" else "unknown" end)
}'
결과의미
no_tls (plaintext)LB가 HTTP를 통해 오리진에 연결 (Juice Shop 데모에서 예상됨)
use_tls (encrypted)LB가 HTTPS를 통해 오리진에 연결

증명하는 것: 오리진 풀에 올바른 헬스 체크가 연결되어 있습니다 (해당하는 경우).

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \
| jq '.spec.healthcheck'
결과의미
합격 — 헬스 체크 참조가 있는 배열 (이름, 네임스페이스, 종류)헬스 체크가 연결됨
확인 — 빈 배열 []헬스 체크 없음 (허용됨 — CSD에는 필요하지 않음)
불합격 — 헬스 체크가 예상되지만 배열이 비어 있음생성 시 헬스 체크를 찾을 수 없음 — 헬스 체크가 연결되지 않음 참조

증명하는 것: 오리진 서버가 클라이언트 측에서 연결 가능합니다 (LB-오리진 경로를 테스트하지 않음).

Terminal window
curl -s -o /dev/null -w '%{http_code}' \
"http://xF5XC_ORIGIN_IPx:xF5XC_ORIGIN_PORTx/"
결과의미
합격200 (또는 다른 유효한 HTTP 코드)오리진 서버가 응답 중
불합격000 또는 연결 거부이 네트워크에서 오리진 서버에 연결할 수 없음

헬스 체크는 백엔드 가용성을 모니터링합니다. CSD에는 선택 사항이지만 프로덕션 배포에 유용합니다.

증명하는 것: 헬스 체크가 올바른 유형, 경로, 타이밍 및 임계값으로 존재합니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks/xF5XC_HC_NAMEx" \
| jq '{
name: .metadata.name,
type: (if .spec.http_health_check then "HTTP" elif .spec.tcp_health_check then "TCP" else "unknown" end),
path: .spec.http_health_check.path,
expected_status: .spec.http_health_check.expected_status_codes,
timeout: .spec.timeout,
interval: .spec.interval,
unhealthy_threshold: .spec.unhealthy_threshold,
healthy_threshold: .spec.healthy_threshold
}'
결과의미
합격 — 경로 /와 예상 200이 있는 HTTP 유형 표시헬스 체크가 올바르게 구성됨
불합격404 응답헬스 체크가 존재하지 않음 (건너뛰었을 수 있음 — 1단계 1단계 참조)

증명하는 것: 네임스페이스의 모든 헬스 체크를 열거하여 이름 지정 및 개수를 확인합니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks" \
| jq -r '
["NAME", "NAMESPACE", "DESCRIPTION"],
(.items[] | [
.name,
.namespace,
(.description | if length == 0 then "—" else . end)
])
| @tsv' | column -t

CSD는 테넌트 수준에서 활성화되어야 하고 JavaScript 주입 태그가 구성되어 있어야 합니다.

증명하는 것: CSD가 테넌트에 대해 구성되고 활성화되어 있습니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq '{isConfigured, isEnabled}'
결과의미
합격 — 둘 다 true이 테넌트에 CSD가 활성화됨
불합격isConfigured: false테넌트 수준에서 CSD가 활성화되지 않음 — F5 XC 관리자에게 문의
불합격isEnabled: falseCSD가 구성되었지만 활성 상태가 아님

증명하는 것: CSD JavaScript 주입 태그가 생성되어 주입 준비가 완료되었습니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq '{has_script_tag: (.scriptTag | length > 0)}'
결과의미
합격has_script_tag: trueJS 주입 태그가 구성됨
불합격has_script_tag: false스크립트 태그 없음 — CSD가 활성화되어 있고 보호된 도메인이 등록되어 있는지 확인

증명하는 것: 확인 또는 수동 주입을 위한 전체 스크립트 태그를 표시합니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq '.scriptTag'

증명하는 것: 루트 도메인이 테넌트에서 CSD 보호 도메인으로 등록되어 있습니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \
| jq '.items[] | {name, namespace, description}'
결과의미
합격 — 비어 있지 않은 name이 있는 항목 표시도메인이 보호됨
불합격 — 항목에 빈 namenamespace 필드등록된 보호 도메인 없음 — 1단계 6단계 참조

증명하는 것: CSD JavaScript가 실제로 로드 밸런서가 제공하는 페이지 응답에 주입되고 있습니다.

Terminal window
curl -s "http://xF5XC_DOMAINNAMEx/" \
| grep -oE '(zeronaught|shape)\.com[^"]*' | head -1
결과의미
합격zeronaught.com 또는 shape.com URL 조각 반환 (예: zeronaught.com/__imp_apg__/js/...)CSD JavaScript가 페이지에 주입되고 있음
불합격 — 빈 출력JS가 주입되지 않음 — LB-3CSD-1 확인

라이브 트래픽이 로드 밸런서에 도달하여 올바르게 처리되고 있는지 확인합니다.

증명하는 것: 트래픽이 로드 밸런서에 도달하고 있습니다. 결과가 0이면 트래픽이 도달하지 않는 것입니다.

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'"
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs/aggregation" \
| jq '{total_requests: .total_hits}'
결과의미
합격total_requests가 0이 아닌 문자열 (예: "380")트래픽이 LB를 통해 흐르고 있음
불합격"0" 또는 데이터 없음LB에 트래픽이 도달하지 않음 — DNS-1LB-1 확인

증명하는 것: 응답 상태 코드의 분포가 오류 패턴을 드러냅니다.

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
"sort": "DESCENDING",
"limit": 100
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \
| jq -r '
[.logs[] | fromjson | .rsp_code_class]
| group_by(.) | map({class: .[0], count: length})
| sort_by(-.count)
| ["STATUS_CLASS", "COUNT"], (.[] | [.class, .count])
| @tsv' | column -t

정상 사이트의 예상 출력:

STATUS_CLASS COUNT
2xx 82
downstream_remote_disconnect 18
결과의미
합격 — 대부분 2xx사이트가 성공적인 응답을 제공 중
경고 — 높은 4xx클라이언트 오류 (잘못된 URL, 누락된 리소스)
불합격 — 높은 5xx서버 오류 — 오리진 서버 상태 확인

downstream_remote_disconnect 클래스는 응답이 완료되기 전에 클라이언트가 연결을 닫았음을 나타냅니다 (롱 폴링 또는 WebSocket 업그레이드 요청에 일반적).

증명하는 것: 개별 요청이 올바른 필드와 함께 기록되고 있습니다.

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-1H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
"sort": "DESCENDING",
"limit": 10
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \
| jq -r '
["TIMESTAMP", "METHOD", "PATH", "STATUS", "SRC_IP"],
(.logs[] | fromjson | [.["@timestamp"], .method, .req_path, .rsp_code, .src_ip])
| @tsv' | column -t

증명하는 것: 액세스 로그가 CSD JavaScript가 응답에 주입되고 있음을 확인합니다.

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-1H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
"sort": "DESCENDING",
"limit": 20
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \
| jq '[.logs[] | fromjson | select(.csd_js_injection == "true")] | length as $injected |
{injected_count: $injected, total_sampled: 20}'
결과의미
합격injected_count > 0CSD JS가 페이지 응답에 주입되고 있음
불합격injected_count: 0JS가 주입되지 않음 — CSD-1LB-3 확인

증명하는 것: 완전한 요청이 클라이언트에서 DNS, LB, 오리진을 통해 흘러 유효한 응답을 반환합니다.

Terminal window
curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 \
| grep -E 'Connected to|< HTTP|< content-type'
결과의미
합격 — 연결, HTTP 200 및 content-type 표시전체 스택이 작동 중
불합격 — 연결 거부 또는 DNS 오류계층 1: DNS에서 디버깅 시작

계층 8: CSD 텔레메트리 & 도메인 정책

섹션 제목: “계층 8: CSD 텔레메트리 & 도메인 정책”

이러한 명령은 CSD 콘솔 대시보드, 스크립트 목록, 양식 필드 및 네트워크 뷰에 표시된 것과 동일한 데이터를 쿼리합니다.

증명하는 것: CSD가 보호된 도메인에서 실행 중인 스크립트를 감지하고 카탈로그화하고 있습니다.

Terminal window
NOW=$(date +%s)
START=$(( NOW - 604800 ))
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{
\"startTime\": \"${START}\",
\"endTime\": \"${NOW}\"
}" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \
| jq -r '
["SCRIPT", "RISK", "STATUS", "FIELDS", "USERS"],
(.scripts[] | [
(.script_name | if length > 50 then .[:47] + "..." else . end),
.risk_level,
.status,
(.form_fields_read // 0),
(.affected_users_count // 0)
])
| @tsv' | column -t
결과의미
합격 — 위험 수준과 함께 스크립트 나열CSD가 스크립트를 활발히 모니터링 중
불합격 — 빈 배열문제 해결: 빈 스크립트 배열 참조

증명하는 것: CSD가 스크립트 소스 도메인을 감지하고 상태별로 분류했습니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{
summary: {
action_needed: .domain_summary.actionNeededCount.count,
mitigated: .domain_summary.mitigatedDomains.count,
allowed: .domain_summary.allowedDomains.count,
total: .domain_summary.totalDomains.count
},
domains: [.domains_list[] | {
domain: .domain,
category: .category,
status: .status,
first_seen: (.firstSeenDate | tonumber | todate),
latest_seen: (.latestSeenDate | tonumber | todate)
}]
}'
결과의미
합격total > 0이고 도메인 나열됨CSD가 스크립트 도메인을 추적 중
경고action_needed > 0일부 도메인에 검토 필요
불합격 — 빈 응답텔레메트리 데이터 없음 — CSD-5 확인

증명하는 것: 허용된 도메인 대 완화된 도메인의 분포를 표시하고 정책이 일관성 있는지 여부.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{
action_needed: .domain_summary.actionNeededCount.count,
mitigated: .domain_summary.mitigatedDomains.count,
allowed: .domain_summary.allowedDomains.count,
total: .domain_summary.totalDomains.count,
domains_needing_action: [.domains_list[] | select(.status == "AN") | .domain]
}'
결과의미
합격action_needed: 0모든 도메인이 검토되고 분류됨
경고action_needed > 0domains_needing_action에 나열된 도메인이 검토 필요

증명하는 것: CSD가 스크립트가 읽고 있는 양식 필드를 감도 분류와 함께 감지했습니다.

Terminal window
NOW=$(date +%s)
START=$(( NOW - 604800 ))
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/formFields?startTime=${START}&endTime=${NOW}" \
| jq -r '
["FIELD", "SENSITIVITY", "SCRIPTS"],
(.form_fields[] | [
.name,
.analysis,
(.scripts_count // 0)
])
| @tsv' | column -t
결과의미
합격 — 감도와 함께 양식 필드 나열CSD가 양식 필드 접근을 추적 중
정보 — 빈 배열양식 필드가 감지되지 않음 (사이트에 양식이 없는 경우 예상됨)

증명하는 것: 위험, 동작 및 네트워크 상호작용을 포함한 특정 스크립트에 대한 자세한 정보.

먼저 TEL-1에서 스크립트 ID를 가져온 다음 세부 정보를 쿼리하십시오:

Terminal window
SCRIPT_ID="your-script-id"
# 개요 (위험 수준, 유형, 소스 도메인)
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/dashboard" \
| jq '{script_name, risk_level, type, source_domain, status}'
# 시간에 따른 동작
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/behaviors" \
| jq '.behaviors'
# 네트워크 상호작용 (스크립트가 통신하는 도메인)
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/networkInteractions" \
| jq '.network_interactions'

증명하는 것: 특정 스크립트의 영향을 받은 사용자 목록으로 노출 범위를 표시합니다.

Terminal window
SCRIPT_ID="your-script-id"
NOW=$(date +%s)
START=$(( NOW - 604800 ))
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{
\"startTime\": \"${START}\",
\"endTime\": \"${NOW}\"
}" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/affectedUsers" \
| jq -r '
["IP_ADDRESS", "DEVICE_ID", "GEO", "CHANNEL", "USER_AGENT"],
(.affected_users[] | [
.ip_address,
(.device_id | if length > 12 then .[:12] + "..." else . end),
.geolocation,
.channel,
(.user_agent | if length > 30 then .[:27] + "..." else . end)
])
| @tsv' | column -t

증명하는 것: 감지된 모든 스크립트에 걸친 집계 위험 분포.

Terminal window
NOW=$(date +%s)
START=$(( NOW - 604800 ))
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{
\"startTime\": \"${START}\",
\"endTime\": \"${NOW}\"
}" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \
| jq '[.scripts[] | .risk_level] | group_by(.) | map({risk_level: .[0], count: length}) | sort_by(-.count)'
결과의미
합격 — 모두 No Risk위험한 스크립트가 감지되지 않음
경고Low Risk 또는 High Risk 존재TEL-5에서 플래그된 스크립트 검토

증명하는 것: CSD 텔레메트리 데이터가 최신이며 활발한 모니터링을 확인합니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{
total_domains: .domain_summary.totalDomains.count,
latest_update: (.domain_summary.totalDomains.lastUpdated // "unknown"),
most_recent_domain: (.domains_list | sort_by(.latestSeenDate) | last | {
domain: .domain,
latest_seen: (.latestSeenDate | tonumber | todate)
})
}'
결과의미
합격latest_seen이 지난 24시간 이내텔레메트리가 데이터를 활발히 수집 중
경고latest_seen이 24시간보다 오래됨트래픽이 중단되었거나 CSD 처리가 지연되고 있을 수 있음

모든 계층에 걸친 모든 중요한 상태 지표를 확인하고 요약 표를 생성하는 단일 명령 실행:

Terminal window
echo "=== CSD Verification Dashboard ==="
echo ""
# 계층 1: DNS
DNS_A=$(dig +short xF5XC_DOMAINNAMEx A | head -1)
DNS_ACME=$(dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME | head -1)
# 계층 2-3: LB + TLS
LB=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http")
LB_HTTPS=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https")
LB_STATE=$(echo "$LB" | jq -r '.spec.state // "UNKNOWN"')
CERT_STATE=$(echo "$LB_HTTPS" | jq -r '.spec.cert_state // "UNKNOWN"')
CSD_ON_LB=$(echo "$LB" | jq -r 'if .spec.client_side_defense then "ENABLED" else "DISABLED" end')
DOMAINS=$(echo "$LB" | jq -r '.spec.domains | join(", ")')
ROUTE_POOL=$(echo "$LB" | jq -r '[.spec.default_route_pools[] | .pool.name] | join(", ")')
# 계층 6: CSD 상태
CSD=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status")
CSD_CONFIGURED=$(echo "$CSD" | jq -r '.isConfigured // false')
CSD_ENABLED=$(echo "$CSD" | jq -r '.isEnabled // false')
# 계층 6: JS 구성
JS_TAG=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq -r 'if (.scriptTag | length) > 0 then "PRESENT" else "MISSING" end')
# 계층 7: 트래픽 (지난 24시간)
TRAFFIC=$(curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{
\"start_time\": \"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)\",
\"end_time\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"
}" \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs/aggregation" \
| jq -r '.total_hits // "0"')
printf "%-28s %s\n" "CHECK" "STATUS"
printf "%-28s %s\n" "----------------------------" "----------------------------"
printf "%-28s %s\n" "[DNS] A Record" "${DNS_A:-NOT_FOUND}"
printf "%-28s %s\n" "[DNS] ACME CNAME" "${DNS_ACME:-NOT_FOUND}"
printf "%-28s %s\n" "[TLS] Certificate" "$CERT_STATE"
printf "%-28s %s\n" "[LB] State" "$LB_STATE"
printf "%-28s %s\n" "[LB] Domains" "$DOMAINS"
printf "%-28s %s\n" "[LB] Route Pool" "$ROUTE_POOL"
printf "%-28s %s\n" "[LB] CSD on LB" "$CSD_ON_LB"
printf "%-28s %s\n" "[CSD] Configured (tenant)" "$CSD_CONFIGURED"
printf "%-28s %s\n" "[CSD] Enabled" "$CSD_ENABLED"
printf "%-28s %s\n" "[CSD] JS Script Tag" "$JS_TAG"
printf "%-28s %s\n" "[Traffic] Requests (24h)" "$TRAFFIC"

필드유형설명
@timestamp문자열요청 타임스탬프 (ISO 8601). @ 접두사 참고 — jq에서 .["@timestamp"]로 접근
method문자열HTTP 메서드 (GET, POST 등)
req_path문자열요청 URI 경로
rsp_code문자열HTTP 응답 상태 코드 (문자열, 예: "200", "404")
rsp_code_class문자열상태 코드 클래스 (2xx, 3xx, 4xx, 5xx 또는 downstream_remote_disconnect)
src_ip문자열클라이언트 소스 IP 주소
dst_ip문자열대상 (VIP) IP 주소
domain문자열요청 Host 헤더 값
user_agent문자열클라이언트 User-Agent 문자열
rsp_size문자열응답 본문 크기 (바이트, 문자열로 반환)
req_size문자열요청 본문 크기 (바이트, 문자열로 반환)
duration_with_data_tx_delay문자열총 요청 지속 시간 (초, 문자열로 반환, 예: "0.024219")
csd_js_injection문자열CSD JavaScript가 주입된 경우 "true" (활성 시에만 존재)
필드엔드포인트설명
isConfiguredstatus테넌트 수준에서 CSD 활성화 여부
isEnabledstatus이 네임스페이스에 CSD 활성 여부
scripts[]scripts감지된 스크립트 객체의 배열
.script_namescriptsJavaScript 파일의 전체 URL
.risk_levelscripts위험 수준 (No Risk, Low Risk, High Risk)
.statusscriptsAN (조치 필요) 또는 NA (조치 불필요)
.form_fields_readscripts스크립트가 읽는 양식 필드 수
.affected_users_countscripts영향받은 고유 사용자/세션 수
domain_summarydetected_domains상태별 수: .actionNeededCount.count, .mitigatedDomains.count, .allowedDomains.count, .totalDomains.count (각각 .count.lastUpdated 포함)
domains_list[]detected_domains.domain, .status, .category, .firstSeenDate, .latestSeenDate (에포크 초, 문자열)가 있는 감지된 도메인 객체의 배열
form_fields[]formFields감지된 양식 필드 객체의 배열
.analysisformFields감도 분류 (Sensitive, Not Sensitive)

TV-10을 반환하는 경우:

  1. DNS 확인 확인 — 도메인이 LB VIP로 확인되는지 검증:

    Terminal window
    dig +short xF5XC_DOMAINNAMEx A

    비어 있으면 DNS가 구성되지 않은 것입니다. API 자동화 — 4단계를 참조하십시오.

  2. LB 상태 확인 — 로드 밸런서가 VIRTUAL_HOST_READY여야 합니다:

    Terminal window
    curl -s \
    -H "Authorization: APIToken xF5XC_API_TOKENx" \
    "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
    | jq '.spec.state'
  3. 테스트 요청 전송 — 엔드투엔드 연결을 확인하기 위해 트래픽 생성:

    Terminal window
    curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 | head -20

    성공적인 HTTP 응답을 확인하십시오. HTTPS LB 인증서가 유효한 경우에만 https://를 사용하십시오.

DNS 영역에서 관리 레코드가 비활성화됨

섹션 제목: “DNS 영역에서 관리 레코드가 비활성화됨”

DNS-4false를 반환하면, F5 XC가 권한 있는 DNS 공급자임에도 불구하고 자동 레코드 생성이 비활성화됩니다. 이는 A 레코드와 ACME CNAME이 모두 누락되게 하는 일반적인 잘못된 구성으로, 로드 밸런서가 VIRTUAL_HOST_READY에 도달하고 인증서가 발급되는 것을 차단합니다.

관리 레코드를 활성화하려면 DNS 영역 구성을 업데이트하여 allow_http_lb_managed_records: true로 설정하십시오. API 호출은 API 자동화 — 옵션 A: F5 XC 관리 DNS를 참조하십시오.

VIRTUAL_HOST_PENDING_A_RECORD에 멈춘 LB

섹션 제목: “VIRTUAL_HOST_PENDING_A_RECORD에 멈춘 LB”

로드 밸런서가 VIP를 가리키는 DNS A 레코드를 기다리고 있습니다. 자세한 해결 단계는 VIRTUAL_HOST_PENDING_A_RECORD에 멈춘 LB를 참조하십시오.

PreDomainChallengePending에 멈춘 인증서

섹션 제목: “PreDomainChallengePending에 멈춘 인증서”

자동 TLS 인증서에는 ACME 챌린지 레코드가 필요합니다. 방법은 DNS 공급자에 따라 다릅니다:

F5 XC 관리 DNS: DNS 영역에서 allow_http_lb_managed_records를 활성화하십시오 (DNS-4). 플랫폼이 x-ves-io-managed RR 세트 그룹에 TXT 기반 ACME 챌린지 레코드를 자동 생성합니다. 관리 레코드를 활성화한 후에도 인증서가 멈춰 있으면, 새로운 인증서 요청을 트리거하기 위해 로드 밸런서를 삭제하고 다시 생성하십시오.

외부 DNS: DNS 공급자에서 CNAME 레코드를 생성하십시오:

_acme-challenge.xF5XC_DOMAINNAMEx CNAME *.autocerts.ves.volterra.io

레코드가 존재하는지 확인하십시오:

Terminal window
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
dig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT

둘 다 비어 있으면 ACME 레코드가 구성되지 않은 것입니다. 인증서 프로비저닝은 레코드가 준비된 후 5–10분이 소요됩니다. 특정 ACME 검증 오류에 대한 LB 오류 상태를 확인하십시오:

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \
| jq '[.status[]? | select(.virtual_host_status != null) | .virtual_host_status.error_description]'

CSD는 F5 XC 관리자가 테넌트 수준에서 활성화해야 합니다. 이것은 네임스페이스 API를 통해 구성할 수 없는 테넌트 전체 설정입니다. 클라이언트 측 방어를 활성화하려면 관리자에게 문의하십시오.

TEL-1이 빈 배열을 반환하는 경우:

  1. 보호된 도메인 확인 — CSD는 등록된 도메인의 스크립트만 모니터링합니다:

    Terminal window
    curl -s \
    -H "Authorization: APIToken xF5XC_API_TOKENx" \
    "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \
    | jq '.items[] | {name, namespace}'
  2. JS 주입 확인 — CSD 스크립트 태그가 페이지에 주입되고 있는지 확인:

    Terminal window
    curl -s "http://xF5XC_DOMAINNAMEx/" | grep -oE '(zeronaught|shape)\.com[^"]*' | head -1

    일치하지 않으면 CSD JavaScript가 주입되지 않는 것입니다. LB에 client_side_defense가 활성화되어 있는지 확인하십시오.

  3. 처리 시간 허용 — CSD를 처음 활성화하거나 새 보호 도메인을 등록한 후, 스크립트 감지에 5–15분이 걸릴 수 있습니다. 사이트에 트래픽을 생성하고 다시 확인하기 전에 기다리십시오.

기간에포크 오프셋ISO 8601 (Linux)ISO 8601 (macOS)
1시간$(( $(date +%s) - 3600 ))date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-1H +%Y-%m-%dT%H:%M:%SZ
24시간$(( $(date +%s) - 86400 ))date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-24H +%Y-%m-%dT%H:%M:%SZ
7일$(( $(date +%s) - 604800 ))date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-7d +%Y-%m-%dT%H:%M:%SZ
30일$(( $(date +%s) - 2592000 ))date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-30d +%Y-%m-%dT%H:%M:%SZ
계층테스트포함 범위
1. DNS 확인DNS-1 ~ DNS-4A 레코드, ACME CNAME, 네임서버 권한, 관리 레코드
2. TLS 인증서TLS-1 ~ TLS-4인증서 상태, 인증서 세부 정보, 라이브 핸드셰이크, ACME 대상
3. HTTP 로드 밸런서LB-1 ~ LB-6상태, 도메인, CSD 플래그, 라우트 풀, 배포, 요약
4. 오리진 풀OP-1 ~ OP-4구성, TLS 모드, HC 연결, 오리진 연결
5. 헬스 체크HC-1 ~ HC-2HC 구성, 모든 HC 나열
6. CSD 구성CSD-1 ~ CSD-5테넌트 상태, JS 태그, 보호 도메인, 라이브 주입
7. 트래픽 검증TV-1 ~ TV-5요청 수, 상태 코드, 샘플, 로그의 JS, E2E 테스트
8. CSD 텔레메트리TEL-1 ~ TEL-8스크립트, 도메인, 정책, 양식 필드, 심층 분석, 사용자, 위험, 최신성
진단엔드포인트메서드시간 형식
요청 수/api/data/namespaces/\{ns\}/access_logs/aggregationPOSTISO 8601
상태 코드/api/data/namespaces/\{ns\}/access_logsPOSTISO 8601
최근 요청/api/data/namespaces/\{ns\}/access_logsPOSTISO 8601
LB 상태/api/config/namespaces/\{ns\}/http_loadbalancers/\{name\}GET없음
오리진 풀/api/config/namespaces/\{ns\}/origin_pools/\{name\}GET없음
헬스 체크/api/config/namespaces/\{ns\}/healthchecks/\{name\}GET없음
DNS 영역/api/config/dns/namespaces/system/dns_zones/\{zone\}GET없음
CSD 상태/api/shape/csd/namespaces/\{ns\}/statusGET없음
JS 구성/api/shape/csd/namespaces/\{ns\}/js_configurationGET없음
보호 도메인/api/shape/csd/namespaces/\{ns\}/protected_domainsGET없음
스크립트 목록/api/shape/csd/namespaces/\{ns\}/scriptsPOST에포크 초
감지된 도메인/api/shape/csd/namespaces/\{ns\}/detected_domainsGET없음
양식 필드/api/shape/csd/namespaces/\{ns\}/formFieldsGET에포크 초 (쿼리 파라미터)
스크립트 세부 정보/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/dashboardGET없음
스크립트 동작/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/behaviorsGET없음
스크립트 네트워크/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/networkInteractionsGET없음
영향받은 사용자/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/affectedUsersPOST에포크 초