2020/01/14: 実際に動くのを確認しました
asnokaze.hatenablog.com
(2020/09/17 注釈: Raw SocketsからDirect Socketsに名称が変更されました)
ブラウザでTCP, DUPソケットを操作可能にする「Direct Sockets API」という仕様がW3CのWICGで議論されている。
また、blink-devでも「Intent to Prototype: Raw Sockets API」とプロトタイプの議論が行われている。
多くの方がセキュリティ上の懸念を抱くと思うが、ドキュメントでも慎重に検討すると書かれている。GithubでIssueを立てることも可能なので、思うことがある方は、まだまだ議論は始まったばかりでもあるので是非フィードバックされると良いと思う。(割と普通に聞いてもらえます)
なお、Raw Socketsという名称については変更も提案されているため、今後変更される可能性がある。
今後、多くの変更
下記のように、リモートアドレスとポートを指定してTCP接続を開始する
const options = {
remoteAddress: 'example.com',
remotePort: 7,
keepAlive: false,
noDelay: false
};
navigator.openTCPSocket(options).then(tcpSocket => { ... }).else(error => { ... });
その後、readableStream, writableStreamで送受信を行う
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による利用
- プライベートアドレス(内部ネットワーク)への接続
各脅威に対する対策方針の詳細はドキュメントを参照のこと
最後に
まだまだこれからだし、セキュリティ的には色々考慮事項が多いので注視していきたい