English · 한국어
라이선스 안내 (서드파티와 프로젝트 라이선스)¶
이 문서가 다루는 것: 오늘 기준으로 pqcota가 내부에서 쓰는 모든 라이선스를, 쓰이는 형태별로 정리한 것입니다. 배포하는 바이너리에 링크되는지에 따라 라이선스 의무가 완전히 달라지므로 쓰이는 형태가 중요합니다.
이 문서는 라이선스 축입니다. 각 의존성이 어떤 라이선스인지, 어떤 형태로 쓰이는지를 다룹니다.
§ 표기: 이 문서에 나오는
§N은 이 문서의 절 번호입니다.⚠️ 면책: 이 문서는 법률 자문이 아닙니다. 배포 전에는 OSS 라이선스를 전문으로 하는 법률가의 실사(GPL과 AGPL의 구분, or-later, 버전별 정확한 조건)가 필요합니다.
0. 한 줄 결론¶
pqcota 제품 바이너리에 링크되거나 묶여 들어가는 서드파티는 모두 허용형(permissive) 라이선스(Apache-2.0 / MIT / BSD-3)입니다. 카피레프트(GPL 계열)는 별도 프로세스로 실행되는 도구(Ansible, 데모 환경의 JDK)에만 있고, 어느 것도 pqcota 바이너리에 링크되거나 묶여 들어가지 않습니다(§5). 그것이 각 도구의 라이선스상 무엇을 뜻하는지는 따로 검토할 일이며, 이 문서가 정하지 않습니다.
1. pqcota 자체의 라이선스¶
이 리포(pqcota)는 Apache-2.0입니다. 배포 산출물(Go 바이너리, Java 사이드카)에 링크되거나 묶여 들어가는 서드파티는 모두 허용형입니다(§2 표).
CBOM 적재 명령(pqcota-cbom-ingest)은 CBOMkit 같은 GPL 계열 생성 도구를 실행하지 않고, 그 도구가 만든 CycloneDX 파일만 읽습니다(CBOM 수신을 위임하는 설계). 그것이 그 도구들의 라이선스상 무엇을 뜻하는지는 따로 검토할 일입니다(아래).
2. 빌드 산출물에 링크되는 런타임 의존성 (Go)¶
이 리포에서 빌드하는 정적 Go 바이너리(수집기, CLI)에 컴파일되어 링크되는 의존성입니다. 모두 허용형입니다.
| 모듈 | 버전 | 라이선스 | 비고 |
|---|---|---|---|
github.com/jackc/pgx/v5 |
v5.10.0 | MIT | Postgres 드라이버(영속화) |
github.com/jackc/pgpassfile |
v1.0.0 | MIT | pgx 간접 의존 |
github.com/jackc/pgservicefile |
v0.0.0-20240606120523-5a60cdf6a761 | MIT | pgx 간접 의존 |
github.com/jackc/puddle/v2 |
v2.2.2 | MIT | pgx 연결 풀 |
google.golang.org/grpc |
v1.83.2 | Apache-2.0 | 수신 계약 전송 |
google.golang.org/protobuf |
v1.36.11 | BSD-3-Clause | 계약 직렬화(protojson 포함) |
google.golang.org/genproto/googleapis/rpc |
v0.0.0-20260526163538-3dc84a4a5aaa | Apache-2.0 | grpc 간접 의존 |
golang.org/x/sys |
v0.49.0 | BSD-3-Clause | AF_PACKET(네트워크 수집기) |
golang.org/x/net |
v0.62.0 | BSD-3-Clause | grpc 간접 의존 |
golang.org/x/sync |
v0.24.0 | BSD-3-Clause | 간접 의존 |
golang.org/x/text |
v0.43.0 | BSD-3-Clause | 간접 의존 |
gopkg.in/yaml.v3(MIT)는 위 목록에 없습니다. 데모 토폴로지 생성기와 테스트에서만 쓰이므로 수집기나 CLI에는 링크되지 않습니다.
요약: 링크되는 카피레프트는 없습니다. Apache-2.0, MIT, BSD-3은 보통 Apache-2.0 배포와 호환되는 것으로 보며, 저작권 고지는 지켜야 합니다(아래).
(배포할 때는 각 라이선스가 요구하는 고지와 조건을 지켜야 합니다. MIT는 저작권·허가 고지를, BSD-3-Clause는 저작권 고지·조건·면책 고지를 요구하고 기여자 이름을 제품 홍보에 쓰는 것을 제한합니다. 이 리포는 그것을 THIRD-PARTY-NOTICES에 모아 둡니다. 그 파일 이름 자체가 요건은 아닙니다.)
3. 빌드 시점 도구 (산출물에 링크되지 않음)¶
코드 생성과 컴파일에만 쓰이고, 결과 바이너리에는 링크되지 않습니다.
| 도구 | 라이선스 | 용도 |
|---|---|---|
Go 툴체인(golang:1.26) |
BSD-3-Clause (Go) | 컴파일 |
buf (bufbuild/buf) |
Apache-2.0 | proto 코드 생성(buf generate) |
protoc-gen-go |
BSD-3-Clause | Go 메시지 생성 |
protoc-gen-go-grpc |
Apache-2.0 | gRPC 스텁 생성 |
4. 데모 환경 구성 요소 (demo/): 별도 프로세스와 컨테이너, 링크되지 않음¶
아래 구성 요소는 관측 데모(
demo/)에서 SSH, 하위 프로세스, 컨테이너로 실행되며 어떤 pqcota 바이너리에도 링크되지 않습니다.
demo/는 컨테이너와 별도 실행 파일로 동작합니다. 거기 있는 어느 것도 pqcota 바이너리에 정적으로도 동적으로도 링크되지 않습니다. 모두 SSH, 하위 프로세스, 컨테이너의 프로세스 경계 너머에서 실행됩니다 → GPL이나 카피레프트 도구는 거기서도 별도 프로그램으로 남습니다. 그 라이선스가 무엇을 요구하는지는 따로 검토합니다(§5).
| 구성 요소 | 버전 | 라이선스 | 쓰이는 형태 |
|---|---|---|---|
BouncyCastle bcprov-jdk18on |
1.85 | Bouncy Castle Licence (MIT X11 계열, 허용형) | pay-app의 JCA provider(별도 JVM). 허용형이며, 묶어 넣는다면 그 고지를 지켜야 합니다 |
| Eclipse Temurin (OpenJDK) | 21 | GPLv2 + Classpath Exception | pay-app의 런타임(별도 컨테이너와 프로세스). GPLv2와 Classpath Exception이 적용되며, 그 예외가 어디까지 미치는지는 따로 검토합니다 |
| OpenSSL | 3.x (Ubuntu) | Apache-2.0 | web-gw와 pay-db의 TLS(별도 프로세스) |
| OpenSSH (서버/클라이언트) | 9.x | BSD 계열 (+ 일부 퍼블릭 도메인) | sshd와 ssh(Ansible 전송, 그리고 SSH 엣지 관측의 대상) |
| Ansible | (배포판) | GPL-3.0-or-later | 컨트롤러에서 실행하는 독립 실행 파일. pqcota와 링크되지 않습니다(오케스트레이션 도구) |
Graphviz (dot) |
(배포판) | CPL-1.0 (Common Public License) | 토폴로지 SVG 렌더링(별도 프로세스). 출력(SVG)은 데이터입니다 |
| Ubuntu 24.04 베이스 이미지 | 없음 | 모음(여러 패키지, 대부분 GPL/LGPL/MIT/BSD) | 컨테이너 베이스 |
golang:1.26 베이스 이미지 |
없음 | 모음(Go = BSD-3 + Debian 베이스) | 빌더 단계 |
GPL 도구(Ansible, Temurin)를 다루는 방식: 이 도구들은 pqcota가 호출하는 별도 프로그램이지 링크 대상이 아닙니다. Ansible은 플레이북을 실행하는 오케스트레이터이고, Temurin은 대상 노드의 런타임일 뿐입니다. 이 도구들을 쓰는 것이 GPL상 의무를 만드는지는 프로그램이 주고받는 방식만으로 정해지지 않으므로 따로 검토합니다. 지금 제공하는 빌드 절차에서는 사용자가 이미지를 만들 때 이 도구들을 내려받으며, pqcota가 싣지 않습니다. 완성된 컨테이너 이미지를 배포한다면 그 안에 든 구성 요소의 재배포 조건을 따로 확인합니다.
5. GPL 코드를 떼어 두는 방법: 무엇이 지키는가¶
GPL 코드는 구조로 pqcota의 코드와 배포물에서 떼어 둡니다. 원칙은 셋입니다(기술적 조치이며 법적 결론이 아닙니다).
- 프로세스 분리: GPL 구성 요소는 독립된 바이너리로 호출하고, 라이브러리로 링크하지 않습니다.
- 표준 데이터 경계: 프로세스 사이의 교환은 CycloneDX CBOM(표준)으로만 합니다. 핵심 내부 API는 이 경계를 넘지 않습니다.
- 배포 분리: GPL 코드는 이 리포나 그 배포물에 묶어 넣거나, 정적으로 링크하거나, vendor하지 않습니다.
직접 GPL 수집기를 만들더라도 같은 경계가 적용됩니다. 구성 요소별 정확한 라이선스(GPL과 AGPL, or-later)와 SaaS 배포에서의 AGPL 영향은 실사가 필요합니다. 이 문서는 법률 자문이 아닙니다.
이 원칙을 지키는 것은 아래 표입니다.
| 원칙 | 무엇이 지키는가 |
|---|---|
| 별도 프로세스 | contracts/.../collector.proto의 수신 계약: GPL 수집기를 붙인다면 gRPC/CLI 뒤에 둡니다 |
| 표준 데이터만 | 이 계약은 CycloneDX + Envelope만 싣습니다. 핵심 내부 타입은 넘지 않습니다 |
| 배포 분리 | GPL 코드를 쓰게 되면 별도 리포로 두고 go.mod에 넣지 않습니다(그런 리포는 아직 없습니다). 지금은 CI에서 라이선스를 자동으로 점검하지 않으므로 검토로 지킵니다 |
demo/의 Ansible(GPL-3)과 Temurin(GPLv2+CE)도 같은 경계 밖에서 별도 프로세스로 실행됩니다.
이 리포는 Apache-2.0으로 공개됩니다. 요점은 관측 가능성을 열어 커뮤니티가 수집기를 더할 수 있게 하는 것이고, 참조 수집기가 OSS인 것도 같은 이유입니다(시중 도구가 다루지 않는 JVM 내부 조회도 포함합니다).
| 구분 | 라이선스 | 담는 것 |
|---|---|---|
| 이 리포 | Apache-2.0 | 계약, 정규화, 인벤토리, 전환물 생성 + 참조 수집기 |
| PQC provider 라이브러리 | 자산마다 다름 | BouncyCastle(허용형) · BC-FJA(FIPS, 별도 계약): 사용자가 조달합니다 |
라이선스를 적는 자리. 각 수집기는 CollectorCapabilities.license(와 Envelope.collector_license)에 라이선스를 적으므로, 호출하는 쪽이 그 백엔드가 「따로 설치하는 GPL 구성 요소」인지 「참조 구현 = Apache-2.0, 포함됨」인지 밝힐 수 있습니다.
부록: 쓰이는 형태별 한눈에 보기¶
| 쓰이는 형태 | 카피레프트가 있는가 | 어떻게 떼어 두는가 | 예 |
|---|---|---|---|
| 빌드 산출물에 링크됨(§2) | ❌ 없음 | 해당 없음 | pgx (MIT), grpc (Apache), protobuf (BSD) |
| 빌드 시점(§3) | ❌ 없음 | 해당 없음 | buf, protoc-gen-* |
| 데모의 별도 프로세스(§4) | ✅ 있음 (Ansible, Temurin) | 별도 프로세스(라이선스 조건은 따로 검토) | Ansible (GPL-3), Temurin (GPLv2+CE) |