한 코드에 여러 라이선스를 주는 이유
저작권자는 같은 코드를 여러 조건으로 동시에 허락할 수 있습니다. 받는 사람은 그중 하나를 골라 그 조건을 지키면 됩니다. 이렇게 하는 목적은 크게 두 가지입니다.
- 호환성 넓히기 — 서로 다른 생태계와 모두 잘 맞게 하려고.
- 사업 모델 — 오픈소스로 공개하면서 별도의 상용 라이선스를 판매하려고.
유형 1: 허용형 두 개를 함께 — MIT OR Apache-2.0
Rust 언어와 대부분의 Rust 크레이트가 쓰는 방식입니다. 사용자는 MIT 또는 Apache-2.0 중 편한 쪽을 고릅니다.
- Apache-2.0 을 고르면 명시적 특허 허락을 받습니다.
- MIT 를 고르면 GPL-2.0-only 프로젝트에도 넣을 수 있습니다(Apache-2.0 은 GPL-2.0 과 비호환이라는 FSF 입장 때문).
두 장점을 모두 챙기는 셈이라 라이브러리 작성자에게 인기가 많습니다. 저장소에는 LICENSE-MIT 와 LICENSE-APACHE 두 파일을 두는 것이 관례입니다.
유형 2: 카피레프트 + 상용 — 'GPL 이거나, 돈을 내거나'
코드를 GPL·AGPL 로 공개하고, 소스 공개 의무를 지고 싶지 않은 기업에게는 별도 계약으로 상용 라이선스를 판매합니다. MySQL(GPL + Oracle 상용 라이선스), Qt(LGPL-3.0/GPL + 상용) 가 대표 사례입니다.
이 모델은 저작권자가 모든 코드의 권리를 갖고 있어야 작동합니다. 외부 기여자가 GPL 로만 기여한 코드는 저작권자가 상용 라이선스로 팔 권리가 없기 때문입니다.
CLA 와 DCO
- CLA(기여자 라이선스 계약): 기여자가 프로젝트 운영 주체에게 기여분을 폭넓게(재라이선스 포함) 사용할 권리를 주거나 저작권을 양도하는 계약입니다. 상용 듀얼 라이선스를 하려면 사실상 필요합니다. Apache 재단의 ICLA 처럼 재라이선스 권한만 주고 저작권은 기여자에게 남기는 형태도 있습니다.
- DCO(Developer Certificate of Origin): 기여자가 '이 코드를 이 프로젝트의 라이선스로 제출할 권리가 있다'고 커밋마다 확인하는 방식입니다(
git commit -s로Signed-off-by:줄 추가). 리눅스 커널이 씁니다. DCO 는 재라이선스 권한을 주지 않으므로 상용 듀얼 라이선스에는 부족합니다.
SPDX 표현식으로 적는 법
여러 라이선스의 관계는 SPDX 라이선스 표현식으로 적습니다.
| 표현 | 뜻 | 예 |
|---|---|---|
A OR B | 둘 중 하나를 골라 따른다(선택형 듀얼) | MIT OR Apache-2.0 |
A AND B | 둘 다 따라야 한다(서로 다른 부분이 섞인 경우) | MIT AND BSD-3-Clause |
A WITH 예외 | 라이선스에 예외 조항을 붙인다 | GPL-2.0-only WITH Linux-syscall-note |
| 괄호 | 결합 순서 지정 | (MIT OR Apache-2.0) AND Unicode-3.0 |
OR 와 AND 를 헷갈리면 뜻이 정반대가 됩니다. 사용자가 고를 수 있다면 OR, 모두 지켜야 한다면 AND 입니다.
주의할 점
- 이미 받은 권리는 유지된다: 나중에 상용 라이선스만 남기더라도, 이전에 오픈소스로 배포된 버전의 허락은 보통 그대로 유효합니다.
- '오픈 코어'와 다르다: 핵심은 오픈소스, 추가 기능은 비공개 상용으로 파는 모델은 듀얼 라이선스가 아닙니다. 같은 코드에 두 라이선스를 주는 것이 듀얼 라이선스입니다.
- 소스 공개형 라이선스와 혼동하지 말 것: BUSL·SSPL 처럼 소스는 보이지만 OSI 기준 오픈소스가 아닌 라이선스로 전환하는 사례가 늘었습니다. 이는 듀얼 라이선스와 다른 전략입니다.
- 고지 파일을 정확히: 선택형이라면 각 라이선스 전문을 모두 제공하고 README 에 '둘 중 선택'임을 분명히 적습니다.
적용 예
Rust 스타일 듀얼 라이선스를 적용하려면 생성기에서 MIT 와 Apache-2.0 파일을 각각 받아 LICENSE-MIT, LICENSE-APACHE 로 저장하고, 메타데이터에 license = "MIT OR Apache-2.0" 을 적습니다. 각 파일 헤더에는 SPDX-License-Identifier: MIT OR Apache-2.0 을 씁니다.
이 글은 일반 정보이며 법률 자문이 아닙니다. 중요한 결정은 전문가와 상의하세요.
참고 출처
- SPDX Specification, License Expressions — https://spdx.github.io/spdx-spec/v2.3/SPDX-license-expressions/
- Rust API Guidelines, Licensing — https://rust-lang.github.io/api-guidelines/necessities.html
- Developer Certificate of Origin — https://developercertificate.org/
- Apache ICLA — https://www.apache.org/licenses/contributor-agreements.html