Files
dap-was-dapms/docs/sbom/README.md
koseokmin d31e5ce0ab SBOM의 적용 범위를 MCP와 Tool Service 공통으로 넓힌다
MCP Server와 Tool Service가 같은 스택과 같은 MCP SDK를 쓰므로 SBOM을
공통으로 적용한다. 산출물 이름을 AXHUB_MCP_Tool_Service_SBOM으로 바꾸고,
목록이 MCP Server 빌드 하나에서 나왔다는 한계를 함께 적는다. Tool Service가
스택 밖 의존을 추가하면 그 빌드에서 다시 산출해 합쳐야 한다.

JDK 라이선스를 미확정에서 GPL-2.0 with Classpath Exception으로 확정한다.
toolchain에 vendor를 고정하면서 배포판이 정해졌기 때문이다. Classpath
Exception이 있어 이 JDK로 실행하는 애플리케이션에 소스 공개 의무는 없다.

inputSchema 관련 보안 통제 설명은 SBOM의 범위가 아니므로 뺀다. 근거는
ADR-0011과 ADR-0012가 소유한다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 23:31:54 +09:00

4.5 KiB

SBOM — AXHUB MCP&Tool Service

  • 산출물: AXHUB_MCP_Tool_Service_SBOM_CycloneDX1.5.json (CycloneDX 1.5 정본), AXHUB_MCP_Tool_Service_SBOM_CycloneDX1.5.xlsx (검토용)
  • 대상: AXHUB MCP Server와 Tool Service의 공통 스택 (Java 21 / Spring Boot 3.5.11)
  • 산출 기준 빌드: ax-hub-mcp-server@0.1.0
  • 생성 기준일: 2026-08-18

대상 범위

MCP Server와 Tool Service는 같은 기술 스택과 같은 MCP SDK를 쓰므로 이 SBOM을 공통으로 적용한다. build.gradle이 직접 선언한 오픈소스는 io.modelcontextprotocol.sdk:mcp-json-jackson2:2.0.0 하나이며, 이 SBOM은 그 런타임 전이 의존 전체빌드 환경을 담는다. Spring Boot starter 계열(web / validation / data-redis / actuator)은 glow f/w가 제공하는 플랫폼 구성이라 범위 밖이다.

다만 목록은 MCP Server 빌드(ax-hub-mcp-server@0.1.0) 하나에서 산출했다. Tool Service가 이 스택 밖의 의존(예: DB 드라이버, 연계 라이브러리)을 추가하면 그만큼은 이 SBOM에 없으므로, 해당 빌드에서 다시 산출해 합쳐야 한다.

구분 개수 내용
런타임 의존성 (scope: required) 12 실행 산출물 classpath에 올라가는 라이브러리
빌드 환경 (scope: optional) 2 JDK 21, Gradle 8.14.3
합계 14

라이선스는 Apache-2.0 9건, MIT 3건, MIT-0 1건, GPL-2.0 with Classpath Exception 1건(JDK)이다. 라이브러리 12건은 모두 permissive이고, copyleft는 JDK 하나뿐이다. JDK는 Classpath Exception이 있어 이 JDK로 실행하는 애플리케이션에 소스 공개 의무가 생기지 않는다.

JDK 배포판은 표준가이드가 정한 Eclipse Temurin (openjdk21u-jdk_x64_windows_hotspot_21.0.5)이며, build.gradle의 toolchain에 vendor = JvmVendorSpec.ADOPTIUM으로 고정해 다른 배포판으로 빌드되지 않게 했다. 실행 컨테이너도 같은 계열인 eclipse-temurin:21-jre를 쓴다.

제외 항목

제외 항목과 사유는 엑셀 Exclusions 시트가 정본이다. 요약하면 다음과 같다.

  • test scope와 annotationProcessor — 선언 4건. 산출물에 포함되지 않는다.
    • spring-boot-starter-test, com.squareup.okhttp3:mockwebserver:4.12.0, org.junit.platform:junit-platform-launcher (test scope)
    • org.springframework.boot:spring-boot-configuration-processor (annotationProcessor)
  • joni, graal-js, graal-sdk — json-schema-validator의 optional. ECMA262 정규식 검증을 쓰지 않아 해석되지 않으므로 약 50MB가 빠진다.
  • jakarta.servlet-api:6.1.0 — mcp-core의 provided. 산출물에 포함되지 않고 서블릿 컨테이너가 제공한다.
  • mcp:2.0.0(aggregate), mcp-json-jackson3:2.0.0 — Jackson 3 경로를 쓰지 않아 선언하지 않는다. 자세한 배경은 mcp-java-sdk-adoption.md 참고.

산출 방법과 한계

버전과 해시는 build.gradle 선언에서 출발해 Gradle 로컬 캐시의 실제 pom을 따라가 그래프를 만들고, 캐시된 실제 jar 바이너리에서 SHA-512 / SHA-1을 직접 계산했다. Gradle 배포본의 SHA-256은 wrapper의 distributionSha256Sum 값을 그대로 옮겼다.

gradlew dependencies로 해석 결과를 대조하려 했으나 sandbox에서 gradle daemon이 뜨지 않아 (Unable to establish loopback connection) 실행하지 못했다. 따라서 다음 버전 정렬은 pom과 Spring Boot BOM 판독에 근거한 것이며, 빌드 환경에서 한 번 확인해야 한다.

./gradlew dependencies --configuration runtimeClasspath
컴포넌트 pom 요청 버전 수록 버전 근거
jackson-databind 2.20.1 (mcp-json-jackson2) 2.19.4 Spring Boot 3.5.11 → jackson-bom 2.19.4
jackson-databind 2.18.3 (json-schema-validator) 2.19.4 위와 동일
reactor-core 3.7.0 (mcp-core) 3.7.16 Spring Boot 3.5.11 → reactor-bom 2024.0.15
slf4j-api 2.0.16 (mcp-core) 2.0.17 Spring Boot 3.5.11 관리 버전

가장 확인이 필요한 항목은 jackson-databind다. SDK가 요청한 2.20.1이 io.spring.dependency-management에 의해 2.19.4로 내려가므로, initialize / tools/list / tools/call 직렬화 계약 테스트로 동작을 확인한다.

CycloneDX 1.5 공식 JSON Schema 원본 대조는 폐쇄망이라 수행하지 않았다. 대신 생성 시점에 dependencies의 모든 ref / dependsOn이 실재하는 bom-ref를 가리키는지, 컴포넌트가 빠짐없이 dependencies에 등장하는지 구조 점검을 통과시켰다.