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という名称については変更も提案されているため、今後変更される可能性がある。
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による利用
- プライベートアドレス(内部ネットワーク)への接続
各脅威に対する対策方針の詳細はドキュメントを参照のこと
最後に
まだまだこれからだし、セキュリティ的には色々考慮事項が多いので注視していきたい