オープンソースのライセンスを理解する

プログラミングの世界はオープンソースのものがたくさんあり、巨人の肩に乗って日々開発をしています。
オープンソースといっても実際はライセンスが決められており、ルールが厳格に決まっています。
先日、その件に関するXの投稿を見たこともあり、客先とのトラブルを避けるためにもライセンスについて調べたもをまとめます。

## 主なライセンスと特徴

| ライセンス   | 正式名称                                      | カテゴリ    | 商用利用 | 複製 | 改変                        | 再配布              | ソースコード公開の必要           |
|-------------|-----------------------------------------------|------------|----------|------|-----------------------------|---------------------|--------------------------------|
| GPL         | GNU General Public License                    | コピーレフト | 可能     | 可能 | 可能 (ソースコード公開必須)  | 可能 (GPLで配布)     | 必要                           |
| AGPL        | GNU Affero General Public License             | コピーレフト | 可能     | 可能 | 可能 (ソースコード公開必須)  | 可能 (AGPLで配布)    | 必要 (ネットワーク経由でも公開) |
| LGPL        | GNU Lesser General Public License             | コピーレフト | 可能     | 可能 | 可能 (ライブラリ部分は公開必須) | 可能 (LGPLで配布)    | ライブラリ部分のみ必要           |
| MIT         | Massachusetts Institute of Technology License | パーミッシブ | 可能     | 可能 | 可能                        | 可能                 | 不要                           |
| Apache 2.0  | Apache License 2.0                            | パーミッシブ | 可能     | 可能 | 可能                        | 可能                 | 不要                           |
| BSD         | Berkeley Software Distribution License        | パーミッシブ | 可能     | 可能 | 可能                        | 可能                 | 不要                           |
| MPL         | Mozilla Public License                        | 中間        | 可能     | 可能 | 可能 (改変部分は公開必須)    | 可能 (MPLで配布)     | 改変部分のみ必要                 |

全てではありませんが、よく出てくるライセンスとその特徴をまとめました。
基本的には商用利用可能で複製、改変、再配布も可能です。しかし、ソースコードの公開の必要性が異なってきます。
この時、重要になるのがコピーレフトの概念です。

## コピーレフト

ライセンスについて調べていると出てくる言葉で結構重要な概念です。
要約すると **「自由に使用・改変・配布して良いけど、同じラインセスで公開してね」** ということです。

コピーレフトの性質のあるライセンスの付与されたライブラリを改変して再配布する場合は、そのライセンスが基本的に連鎖する仕組みです。

## 開発時に使用するライブラリはどうか

実際にビジネスでの使用する場合を考えると、サービス開発時に使用するライブラリのライセンスが問題になります。
一部の機能のために使用したライブラリのライセンスの影響でソースコード全体を開示する必要が発生した場合、大きな問題になります。
また、この問題を考える際に、WEBサービスかアプリケーションかで異なります。
WEBサービスは基本的にWEBサーバー上で動き、ユーザーにコードは配布されません。それに対して、アプリケーションはユーザー個々にコードが配布される形になるため、開示義務が同じライセンスでも異なってきます。
前出の表での「再配布」の項目に該当します。
私が調べた範囲のものを表にしてみました。

| ライセンス   | 使用形態                | ソースコード公開義務                         |
|-------------|-------------------------|--------------------------------------------|
| GPL         | WEBサービス            | 不要                                       |
|             | 各端末アプリケーション    | 必要（全体のソースコード公開が必要）        |
| AGPL        | WEBサービス            | 必要（全体のソースコード公開が必要）        |
|             | 各端末アプリケーション    | 必要（全体のソースコード公開が必要）        |
| LGPL        | WEBサービス            | 不要（ライブラリ部分の改変がなければ不要） |
|             | 各端末アプリケーション    | 不要（ライブラリ部分の改変がなければ不要） |
| MIT         | WEBサービス            | 不要                                       |
|             | 各端末アプリケーション    | 不要                                       |
| Apache 2.0  | WEBサービス            | 不要                                       |
|             | 各端末アプリケーション    | 不要                                       |
| BSD         | WEBサービス            | 不要                                       |
|             | 各端末アプリケーション    | 不要                                       |
| MPL         | WEBサービス            | 必要（改変した部分のソースコードのみ公開）   |
|             | 各端末アプリケーション    | 必要（改変した部分のソースコードのみ公開）   |

WEBサービスであってもAGPLライセンスだと、ソースコード全体を公開する必要があるので問題になりそうです。

## ライセンスの調べ方

ライセンスの種類と特徴をある程度調べてので、実際に自分の開発環境でどうなのかを調べてみようと思います。
私はPython使いなので、Pythonでの話になりますがライブラリのライセンス確認方法です。

特定の1つのライブラリのライセンスを調べたい場合は下記コマンドになります。

```bash
pip show <ライブラリ名>
```

出力例はこんな感じです。

```bash
$ pip show requests
Name: requests
Version: 2.31.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages
Requires: certifi, charset-normalizer, idna, urllib3
Required-by: CacheControl, poetry, requests-toolbelt, Sphinx
```

requestsのライセンスはApache 2.0は自由度の高いライセンスなので、商用でも自由に使えそうです。

実際の開発の場面ではたくさんのライセンスを使用することになるので、その環境にあるライブラリを一括で調べたいですよね。

まず一括で調べるために必要なライブラリをインストールします。

```bash
pip install pip-licenses
```

私のとある環境でのライブラリとライセンスです。

```bash
$ pip-licenses
 Name                       Version      License
 GitPython                  3.1.43       BSD License
 Jinja2                     3.1.4        BSD License
 MarkupSafe                 2.1.5        BSD License
 Pygments                   2.18.0       BSD License
 altair                     5.4.1        BSD License
 attrs                      24.2.0       MIT License
 blinker                    1.8.2        MIT License
 cachetools                 5.5.0        MIT License
 certifi                    2024.8.30    Mozilla Public License 2.0 (MPL 2.0)
 changecase                 0.1.0        UNKNOWN
 charset-normalizer         3.3.2        MIT License
 click                      8.1.7        BSD License
 gitdb                      4.0.11       BSD License
 idna                       3.10         BSD License
 jsonschema                 4.23.0       MIT License
 jsonschema-specifications  2023.12.1    MIT License
 markdown-it-py             3.0.0        MIT License
 mdurl                      0.1.2        MIT License
 narwhals                   1.9.0        MIT License
 numpy                      2.1.1        BSD License
 packaging                  24.1         Apache Software License; BSD License
 pandas                     2.2.3        BSD License
 pillow                     10.4.0       Historical Permission Notice and Disclaimer (HPND)
 protobuf                   5.28.2       3-Clause BSD License
 pyarrow                    17.0.0       Apache Software License
 pydeck                     0.9.1        Apache License 2.0
 python-dateutil            2.9.0.post0  Apache Software License; BSD License
 pytz                       2024.2       MIT License
 referencing                0.35.1       MIT License
 requests                   2.32.3       Apache Software License
 rich                       13.9.1       MIT License
 rpds-py                    0.20.0       MIT License
 six                        1.16.0       MIT License
 smmap                      5.0.1        BSD License
 streamlit                  1.39.0       Apache Software License
 tenacity                   9.0.0        Apache Software License
 toml                       0.10.2       MIT License
 tornado                    6.4.1        Apache Software License
 typing_extensions          4.12.2       Python Software Foundation License
 tzdata                     2024.2       Apache Software License
 urllib3                    2.2.3        MIT License
```

ライセンス不明のものや、今まで調べたもの以外のライセンスも散見されるので今後追加で調べないとです。

社内管理がしやすいように、CSVやJSONでの出力も可能です。

```bash
pip-licenses --format=csv
pip-licenses --format=json
```

## まとめ

仕事でコーディングしている時も正直これまであまりライセンスを意識していませんでした。
「オープンソースだから、自由に使ってOK」となんとなく思っていましたが、そう簡単な話はないですよね。
「実際訴えられることがあるのか」などの指摘はあると思いますが、企業の法令遵守の観点から意識するべきだとは思います。

受託開発などでも、不用意にライセンス違反をしてしまうと将来的に問題になる可能性があります。
気をつけていきましょう。

以前、PyConでAnazondaさんのブールで話を聞いた際に「ライセンス制限で特定のライセンスのライブラリを使用できないようにできる」とかって話を聞いたことを思い出して、そういった自動的にライセンスの確認ができる仕組みの導入が一番楽だと思いました。
調べないと。

個人的に調べた内容なので、間違いなどがありましたらご指摘頂けると嬉しいです。