

# CloudFront ディストリビューションで WebSockets を使用する
<a name="distribution-working-with.websockets"></a>

Amazon CloudFront は、WebSocket の使用をサポートしています。これは、クライアントとサーバー間の長時間の双方向性接続が必要な場合に便利な TCP ベースのプロトコルです。永続的な接続は、多くの場合、リアルタイムアプリケーションでの要件です。WebSockets を使用するシナリオには、ソーシャルチャットプラットフォーム、オンラインコラボレーションワークスペース、マルチプレイヤーゲーム、および金融取引プラットフォームのようなリアルタイムのデータフィードを提供するサービスが含まれます。WebSocket 接続経由のデータは、全二重通信に対して双方向に流れることができます。

WebSocket 機能は自動的に有効になり、どのディストリビューションでも動作します。WebSockets を使用するには、ディストリビューションにアタッチされているキャッシュ動作で次のいずれかを設定します。
+ すべてのビューワーリクエストのヘッダーをオリジンに転送します [AllViewer マネージドオリジンリクエストポリシー](using-managed-origin-request-policies.md#managed-origin-request-policy-all-viewer)を使用できます。
+ 具体的には、オリジンリクエストポリシーで `Sec-WebSocket-Key` および `Sec-WebSocket-Version` リクエストヘッダーを転送します。

## WebSocket プロトコルの仕組み
<a name="distribution-working-with.websockets.how-it-works"></a>

WebSocket プロトコルは、独立した TCP ベースのプロトコルであり、これによって HTTP のオーバーヘッド (および潜在的なレイテンシーの増加) の一部を回避することができます。

WebSocket 接続を確立するために、クライアントはプロトコルの変更のため HTTP のアップグレードセマンティクスを使用する通常の HTTP リクエストを送信します。その後、サーバーはハンドシェイクを完了できます。WebSocket 接続は開いたままで、クライアントまたはサーバーが毎回新しい接続を確立する必要なしに互いにデータフレームを送信できます。

デフォルトでは、WebSocket プロトコルは通常の WebSocket 接続にポート 80 を使用し、TLS 経由の WebSocket 接続ではポート 443 を使用します。CloudFront [ビューワープロトコルポリシー](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy) および [プロトコル (カスタムオリジンのみ)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy) に選択したオプションは、WebSocket 接続と HTTP トラフィックに適用されます。

## WebSocket の要件
<a name="distribution-working-with.websockets.requirements"></a>

WebSocket リクエストは、以下の標準形式で [RFC 6455](https://datatracker.ietf.org/doc/html/rfc6455) に準拠する必要があります。

**Example サンプルクライアントリクエスト**  

```
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: https://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
```

**Example サンプルサーバー応答**  

```
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
```

WebSocket 接続がクライアントまたはサーバーによって、またはネットワークの中断によって切断された場合、クライアントアプリケーションはサーバーとの接続を再開する必要があります。

## 推奨される WebSocket ヘッダー
<a name="distribution-working-with.websockets.recomended-settings"></a>

WebSockets を使用する際の予期しない圧縮関連の問題を避けるため、[オリジンリクエストポリシー](origin-request-create-origin-request-policy.md)に以下のヘッダーを含めることをお勧めします。
+ `Sec-WebSocket-Key`
+ `Sec-WebSocket-Version`
+ `Sec-WebSocket-Protocol`
+ `Sec-WebSocket-Accept`
+ `Sec-WebSocket-Extensions`

**注記**  
現在、CloudFront は HTTP/1.1 プロトコル経由の WebSocket 接続のみをサポートしています。