swiftwasm / carton

📦 Watcher, bundler, and test runner for your SwiftWasm apps
Apache License 2.0
442 stars 45 forks source link

Add --bind to specify serving address with relaxed default (0.0.0.0) #475

Closed omochi closed 4 months ago

omochi commented 4 months ago

現状

dev server は --host で指定したアドレスで待ち受けします。

課題

指定しない場合

仮に --host がデフォルトの 127.0.0.1 の場合、 同一ホスト上から http://127.0.0.1:8080 へのアクセスでなければ接続できません。

ホストのLAN IPが 192.168.1.2 だったとして、 http://192.168.1.2:8080 では接続できません。 また、同一LAN の他のマシンやスマートフォンからも接続できません。 ウェブアプリ開発ではスマホを対象にしたりするのでこれは不便です。

指定する場合

--host で 192.168.1.2 を指定すれば、それで接続できますが、 この場合は同一ホストであっても 127.0.0.1 から接続できません。

状況に応じて使い分ける必要があり、面倒です。

また、Docker内部で起動する場合、 コンテナのネットワークアドレスが必要ですが、 これを把握するのは多少面倒です。

提案

こういった状況のために、ソケットインターフェースには待ち受けアドレスとして 0.0.0.0 が指定できます。 これはそのホストのあらゆるアドレスからの接続を受け入れる特別な設定です。 これで起動すれば、接続元に応じたホストのアドレスを指定するだけで良いので簡単です。

知る限りでは、 npx serve コマンドや nc コマンド、 vitejs の devサーバ なども、 デフォルトではこのモードで待ち受けおり、一般的です。

そこで、新たに --bind オプションを導入し、待ち受けアドレスを指定できるようにしつつ、 そのデフォルト値として 0.0.0.0 を指定します。

--host オプションのデフォルト値は 127.0.0.1 を使うのをやめて、 --bind オプションの値を使うようにします。

ただし、 0.0.0.0 は接続先アドレスとして不正です。 例えばSafariではこれはエラーとなり接続できません。

そこで、 --bind オプションが 0.0.0.0 の場合は、 --host オプションの値は 127.0.0.1 にします。 この書き換えは、Chromeのアドレスバーに 0.0.0.0 を指定した時と同じ挙動です。

--host の用途

--host を指定する機能はこれまで通り必要です。 立ち上がったサーバに接続するためのURLを構築するために使われているからです。

セキュリティ

待ち受けアドレスを限定するのはセキュリティを高める効果があります。 意図しない外部からの接続を遮断できるからです。 例えば postgresql などは初期状態でそのように設定されています。 この変更はそれを低下させます。

しかし、 dev server はデーモンとして常駐させるような使い方よりも、 明示的に CLI から起動し、フロントエンドジョブとしてユーザが運用するものなので、 影響は小さいです。

omochi commented 4 months ago

@kateinoigakukun --listen オプションを実装しました。

kateinoigakukun commented 4 months ago
ArgumentParser/ParsableArguments.swift:271: Fatal error: Validation failed for `CartonFrontendTestCommand`:

- Multiple (2) `Option` or `Flag` arguments are named "-l".
omochi commented 4 months ago

@kateinoigakukun ショートオプションの -ltest コマンドの list と被っていたので削除しました。 dev コマンドと test コマンドで使い方が違うのは混乱を招くので、どちらも削除しました。

しかし、 --host オプションよりも --listen オプションの方が基本的なものになるので、 --host-h で指定できるのに --listen にはショートオプションがないのは不自然です。

-l は使えないので、代わりに bind-b を設定するのはどうでしょうか? bind はソケットをアドレスに割り当てるAPIの名前で、 NIO もそれを踏襲しています。

kateinoigakukun commented 4 months ago

--bind / -b sounds reasonable to me :+1:

omochi commented 4 months ago

ロングオプションも合わせて bind に変更するということですね。後で対応します。

kateinoigakukun commented 4 months ago

Thanks!