본문으로 건너뛰기

라이선스 데이터 출처

라이선스 화면에는 네 개의 출처가 기여합니다. 아래는 파이프라인이 참조하는 순서이며, 각각의 권한이 다릅니다. 라이선스를 식별하는 것은 앞의 셋뿐이고, 분류를 정하는 것은 이 배포본의 자체 카탈로그뿐입니다.

출처제공하는 것네트워크기본값
SBOM(cdxgen)선언된 라이선스 id, 저작권자항상
패키지 레지스트리6개 생태계의 라이선스 id사용켜짐
ClearlyDefined대체 경로의 라이선스 id와 저작권자사용꺼짐
OSORI별칭 표기, 약 670종의 의무 메타데이터— (내장)켜짐

SBOM이 먼저입니다

cdxgen은 패키지 자체를 읽습니다. 여기서 라이선스나 저작권자가 나오면 다른 어떤 출처도 덮어쓰지 않습니다. 실제로 배포한 산출물을 직접 본 결과이기 때문입니다.

레지스트리가 빈자리를 채웁니다

SBOM에 라이선스가 없으면 해당 패키지를 소유한 레지스트리에 묻습니다. Maven Central, PyPI, crates.io, pkg.go.dev, RubyGems, NuGet입니다. 응답은 24시간 캐시하며 "찾지 못함"도 함께 캐시합니다. 미공개 패키지가 많은 저장소가 같은 조회를 반복하지 않게 하기 위해서입니다.

LICENSE_FETCH_ENABLED(기본 켜짐)로 제어합니다. 폐쇄망 설치에서는 꺼 두면 되고, 그 경우 SBOM이 담아 온 내용만 표시합니다.

ClearlyDefined는 마지막 수단입니다

ClearlyDefined는 수천만 패키지 버전의 스캔 결과를 큐레이션한 계층입니다. 레지스트리가 답하지 못한 뒤에만 참조하며, 레지스트리가 줄 수 없는 두 가지를 더합니다.

npm. npm을 담당하는 레지스트리 어댑터가 없어서, 그동안 npm 컴포넌트는 조회 한 번 없이 "라이선스 없음"으로 처리됐습니다. ClearlyDefined가 npm에 대한 첫 커버리지입니다.

저작권자. ClearlyDefined는 파일 단위 저작권 표기를 수집합니다. SBOM에 저작권자가 없어서 NOTICE가 *"holders not captured in SBOM"*을 출력하던 자리를 이 값이 채웁니다. 비어 있는 자리에만 쓰며, cdxgen이 찾아낸 저작권자는 절대 덮어쓰지 않습니다.

기본값은 꺼짐입니다. api.clearlydefined.io는 지금까지 통신한 적이 없는 호스트이고, 이 제품에서는 새로운 외부 접속 대상을 릴리스에 슬쩍 포함하지 않고 명시적으로 켜도록 합니다. 켜는 방법은 다음과 같습니다.

CLEARLYDEFINED_ENABLED=true

이 API는 공개이며 인증이 필요 없고, 큐레이션 데이터는 CC0입니다.

하지 않는 일

"둘 다 적용된다"는 뜻의 라이선스 표현식 — lodash가 선언하는 CC0-1.0 AND MIT 같은 것 — 은 하나의 id로 줄이지 않습니다. id 하나로는 "둘 다"를 표현할 수 없기 때문입니다. 그 컴포넌트는 이 출처에서 라이선스를 얻지 못합니다. 다만 저작권자는 그대로 수집합니다. NOTICE가 부족했던 것이 바로 그 정보이기 때문입니다.

OSORI 참조 데이터

OSORI는 국내 기업들이 공동 구축하고 한국저작권위원회가 운영하는 오픈소스 라이선스 공개 데이터베이스입니다. 이 제품은 스냅샷을 파일로 내장합니다. 실행 중에 외부를 호출하지 않으므로 폐쇄망 설치도 연결된 설치와 같은 답을 얻습니다.

두 가지에 씁니다.

별칭 표기. 사람들은 Apache 2, The MIT License (MIT), Android-Apache-2.0처럼 씁니다. 이 제품의 자체 규칙은 정해진 형태만 처리하고 나머지는 추측하지 않고 비워 둡니다. OSORI의 큐레이션된 별칭 목록이 수백 개를 더 해석합니다. 추론이 아니라 조회입니다. 두 라이선스가 같은 별칭을 주장하면 임의로 고르지 않고 버립니다. 잘못된 SPDX id는 컴포넌트의 의무사항을 조용히 바꿔 놓으므로, 답을 못 내는 것보다 나쁩니다.

자체 카탈로그 밖의 의무 메타데이터. 자체 분류는 52종을 허용·조건부·금지로 나눕니다. OSORI는 약 670종을 설명합니다. 배포 시 고지가 필요한지, 소스 공개 범위가 어디까지인지(NONE / LIBRARY / EXECUTABLE / NETWORK), 1~5단계의 주의 항목이 무엇인지입니다.

이 정보는 라이선스 드로어에 별도로 구분된 패널로 나타납니다. 분류나 요약에 병합하지 않습니다. 그 둘은 이 배포본의 분류이고 계약 테스트로 고정되며 빌드 게이트가 읽습니다. OSORI는 그 어느 쪽에도 권한이 없는 외부 견해입니다. 이 패널이 특히 유용한 것은 52종 밖 라이선스인데, 그 경우 위쪽 요약이 비어 있기 때문입니다.

자체 카탈로그만 보고 싶다면 OSORI_ENABLED=false로 끕니다. 릴리스 사이에 갱신하려면 OSORI_SNAPSHOT_PATH로 더 새로운 파일을 지정하면 됩니다.

스냅샷 갱신

유지보수자가 다음을 실행합니다.

python3 apps/backend/scripts/refresh_osori_snapshot.py

apps/backend/services/license_osori/osori_snapshot.json을 다시 씁니다. 내려받기에 실패하면 기존 파일을 건드리지 않습니다. 네트워크 장애가 내장 데이터를 비워서는 안 되기 때문입니다.

출처 표기

OSORI의 데이터는 ODC-By 1.0을 따르며 사용하는 곳마다 출처 표기를 요구합니다. 표기는 스냅샷 파일 안에 담고, 라이선스 드로어 패널에 표시하며, 이 문서에도 적습니다.

무엇이 무엇을 결정하는가

결정결정 주체
컴포넌트의 라이선스가 무엇인가SBOM → 레지스트리 → ClearlyDefined 순서
허용·조건부·금지 분류이 배포본의 카탈로그와 라이선스 정책만
빌드 차단 여부위와 같음(빌드 게이트 경유)
NOTICE의 저작권자SBOM, 빈자리는 ClearlyDefined
참조용 의무 메타데이터OSORI. 표시하되 판단에는 쓰지 않음

함께 보기