ブラウザからTCP, UDPソケットを操作するDirect Sockets API

2020/01/14: 実際に動くのを確認しました
asnokaze.hatenablog.com

(2020/09/17 注釈: Raw SocketsからDirect Socketsに名称が変更されました)


ブラウザでTCP, DUPソケットを操作可能にする「Direct Sockets API」という仕様がW3CのWICGで議論されている。

f:id:ASnoKaze:20200830232335p:plain

また、blink-devでも「Intent to Prototype: Raw Sockets API」とプロトタイプの議論が行われている。

多くの方がセキュリティ上の懸念を抱くと思うが、ドキュメントでも慎重に検討すると書かれている。GithubでIssueを立てることも可能なので、思うことがある方は、まだまだ議論は始まったばかりでもあるので是非フィードバックされると良いと思う。(割と普通に聞いてもらえます)

なお、Raw Socketsという名称については変更も提案されているため、今後変更される可能性がある。

ユースケース

既存のプロトコルを話せるWebアプリケーションの作成が大きなユースケースである。例えば、SSHや, RDP, IRCなどが挙げられている。

API

今後、多くの変更

TCP

下記のように、リモートアドレスとポートを指定してTCP接続を開始する

const options = {
    remoteAddress: 'example.com',
    remotePort: 7,
    keepAlive: false,
    noDelay: false
};
navigator.openTCPSocket(options).then(tcpSocket => { ... }).else(error => { ... });

その後、readableStream, writableStreamで送受信を行う

UDP

UDPの場合は下記の通り

const options = {
    remoteAddress: 'example.com',
    remotePort: 7
};

try {
  const udpSocket = await navigator.openUDPSocket(options);
  doStuffWith(udpSocket);
  ...
} catch (err) {
  // handle error
} finally {
  udpSocket.close();
}

blobをsendする形でデー送信を行う。

let blob = ...;
await udpSocket.send(blob);

セキュリティ関連

まだまだ、多くのことを議論しなければならないし、対策方法についても議論の余地があると思うが、現在議論されている驚異は以下のとおりです。

  • MITM
  • ユーザの合意のない通信の開始
  • DDoS
  • CORSポリシーの回避
  • iframeによる利用
  • プライベートアドレス(内部ネットワーク)への接続

各脅威に対する対策方針の詳細はドキュメントを参照のこと

最後に

まだまだこれからだし、セキュリティ的には色々考慮事項が多いので注視していきたい