理系学生日記

おまえはいつまで学生気分なのか

クライアントサイドJavaScriptとOSSライセンスの関係、及び、その自動チェック

多くのライブラリにはライセンスが付属しています。 利用する側は、当然このライセンスに定められた条件を満たさねば、当該ライブラリを使うことができません。

多くのライセンスでは「頒布」(distribution) 行為に対して条件を課しています。そして、この「頒布」に関し、問題になり得るのがJavaScriptです。 JavaScriptで作成されるWebアプリケーションには、様々なOSSのモジュールがimportされbuildされ、クライアントにダウンロードされるわけです。 果たして、これは「頒布」にあたるのか、というところを懸念していました。

なお、僕はこの界隈の専門家ではないので、それを前提に以下お読みください。

クライアントサイドJavaScriptの利用形態は頒布にあたる

以下は書籍からの引用ですが、まさに「頒布」であると記載されています。

ところが、Webサイトからはユーザーの側(ユーザーのマシン)で実行されるプログラムがサーバーからユーザー側に渡されることもあります。代表的なものとしてJavaScriptのプログラム(スクリプト)があります。これはサーバー側からユーザー側に頒布されます。もしそのJavaScriptのプログラムがOSSであった場合は、OSSの頒布が行われるということになります。

以下の記事にも、同様の記述があります。

With JavaScript being an interpreted language and interpreted on the client side by a web browser, the JavaScript code is downloaded to the client device. This download may trigger the distribution clauses of many open-source licenses.

Open-Source JavaScript: Compliance Tips For Companies | Womble Bond Dickinson - JDSupra

2013年の記事ですが、こちらにもその懸念に対する言及があります。

ライセンスについて

そうなると、クライアントサイドJavaScriptにおいて利用できるのはどのようなライセンスなのかというのが気になってきます。 それぞれの詳細についてはライセンス本文を読んで理解していくしかないわけですが、私がそれぞれ確認したところ、以下のようにサマリできそうです。 ただし、私は法律の専門家でもない点はご了承ください。

ライセンス 商用利用 頒布条件
MIT License 著作権表示およびライセンスの許諾表示をソフトウェアの全ての複製あるいは重要な部分に含める
ISC License 著作権表示およびライセンスの許諾表示をソフトウェアの全ての複製に含めること
Apache License 2.0 いろいろあるので、4. Redistribution. を参照ください。単にライブラリとしてimportするだけなら、ライセンスのコピーと著作権/特許/商標/帰属についての告知を成果物に入れることが必要になります。NOTICEファイルがあるならそれも同梱することになるでしょう
The 3-Clause BSD License 著作権表示が必要です。また、書面での許諾なく権利者やコントリビュータの名前を宣伝利用できません
The 2-Clause BSD License 著作権表示が必要です
Zero-Clause BSD (0BSD)
EPL 1.0 ○。ただし、訴訟等からコントリビュータ("Indemnified Contributor")を守る義務が生じます ソースコードとして頒布する場合は、EPL 1.0での公開を要求します(3. REQUIREMENTSより)。また、ライセンスの同梱を求めます

EPLは弱いながらもCopyleft性を持っていることに注意が必要です。 EPL 1.0では、1. DefinitionsにContributionの定義があるので、これをよく理解しなければならないでしょう。

1. DEFINITIONS
"Contribution" means:
a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
b) in the case of each subsequent Contributor:
  i) changes to the Program, and
  ii) additions to the Program;
    where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.

@aws-amplify/pubsubEPL-1.0のEclipse Paho JavaScript clientを利用しつつ、Apache-2.0でライセンスされている事実は参考になりそうです。

ライセンスのチェック

クライアントサイドJavaScriptで、逐一人力でライセンスチェックを行うのは大変です。こういった作業は自動化するのが筋でしょう。

最近だと、license-checker-rseidelsohnを利用するのが良さそうです。このライブラリめメンテナンスされなくなったdavglass/license-checkerのforkの位置付けになっています。

例えば、devDependenciesを除く依存ライブラリのライセンスを確認するには以下のようにします。これはCSV形式にしていますが、他にもJSONやMarkdownで出力することも可能です。

$ npx license-checker-rseidelsohn --csv --production | head -5
"module name","license","repository"
"@ampproject/remapping@2.2.0","Apache-2.0","https://github.com/ampproject/remapping"
"@aws-amplify/analytics@5.2.9","Apache-2.0","https://github.com/aws-amplify/amplify-js"
"@aws-amplify/api-graphql@2.3.6","Apache-2.0","https://github.com/aws-amplify/amplify-js"
"@aws-amplify/api-rest@2.0.42","Apache-2.0","https://github.com/aws-amplify/amplify-js"

開発中のクライアントライブラリのライセンスによって、依存ライブラリのライセンスが限定できるでしょう。 例えば、ISCやMIT、Apache-2.0ライセンスだけを許容し、他のライセンスを許容しないという場合は`--onlyAllow'オプションを使います。

$ npx license-checker-rseidelsohn --production --onlyAllow 'ISC;MIT;Apache-2.0'
Package "@hapi/hoek@9.3.0" is licensed under "BSD-3-Clause" which is not permitted by the --onlyAllow flag. Exiting.

チェックを「直接の依存関係」のみとする場合は、--directオプションを利用すれば良いでしょう。

$ npx license-checker-rseidelsohn --production --direct --onlyAllow 'ISC;MIT;Apache-2.0'

あとはこういったチェックをGitHub Actionsなりで自動化しておけば楽ですね。