暗号化
Photonは、クライアントとサーバーの間のメッセージを暗号化することができます。これは認証入力や、その他の重要なユーザーデータの送信に必須です。
その一方で、暗号化はかなりのオーバーヘッドを発生させるため慎重に使用され、PhotonのAPIではあまり使用されていません。
例:Photonのデフォルトのロジックでは、これらはルームのすべてのプレイヤーにオープンに送信て届くため、コンテンツの機密性を高めることはできません。
このため、イベントはデフォルトでは暗号化できないようになっています。
弊社のクライアントSDKは、暗号化は認証にのみ使用されます。
ディベロッパーは、メッセージごとに暗号化を使用できます。
技術的な詳細
Photon LoadBalancingまたはPUNを使用すると、APIは自動的にクライアントとサーバー間で暗号化キーを交換します。
これは、クライアントが接続した際に Diffie-Hellmanキー交換 によっておこなわれます。
そして、256ビットのキーはオンデマンドで AES暗号化 に使用されます。
クライアントが認証されるとサーバーはトークンを発行します。トークンとはクライアントの認証値の暗号化された要約で、他のサーバーで使用されます。トークンは、クライアントによって読みこまれる必要がありません。
WSSトランスポートプロトコル
UnityのWebGLエクスポートを使用してPhoton Cloudに接続する場合、クライアントはセキュアなWebソケットを介して接続することになります。
WSではなくWSSを推奨します。
WSSトランスポートプロトコルを使用すると、ヘッダーを含むすべての通信が予測通りに暗号化されます。
その場合、Photonクライアントは暗号化キーを交換せずリクエストに応じてAESも適用しません。
Photonのトークン
Photonのトークンは通常、シーンの裏側で処理されます。
クライアントAPIで見えるものではありませんが、気を付けておくべきです。
クライアントが認証されると、サーバーがクライアントの認証値の暗号化された概要であるトークンを発行し、他のサーバーで使用されるようになります。
トークンはPhoton Serverでのみ使用され他のクライアントからは読めません。
サーバー同士(クライアントを介して)でデータを共有するため、トークンデータを「インジェクト」することは可能です。
サーバープラグインはトークンから共有されたデータを読むことができます。
トークンのリフレッシュ
設計上、Photonのトークンはマスターサーバー上でのみリフレッシュされます。
リフレッシュはマスターサーバーからゲームサーバーに切替えた場合に発生します。この切替は、ルームを作成した場合やルームに参加した場合に生じます。
トークンの有効期限は1時間ですが、ルーム内のクライアントがイベントを発生し続けた場合、トークンは特別なイベントを使用して自動的にリフレッシュされます。
しかし、クライアントが1時間以上イベントを発生させずに1つのルームにとどまった場合には、トークンはリフレッシュされず期限切れとなります。
クライアントは、問題なくゲームサーバー上にとどまることができます。
ルーム退出後にマスターサーバーに戻ろうとすると、クライアントは('Authentication token expired' Code: 32753) エラーを受信します。
解決するには、再接続をおこないます。
デフォルトでトークンの有効期限は1時間ですが、多くの場合自動的にリフレッシュされます。
リフレッシュが行われるのは2パターンです:
- ルームを作成したりルームに参加して、マスターサーバーからゲームサーバーに切替えた場合
- ルーム内のクライアントがイベントを発生し続けた場合
クライアントが1時間以上イベントを発生させずに1つのルームにとどまった場合には、トークンはリフレッシュされず期限切れとなります。
クライアントはゲームサーバーにとどまることができますが、ルームから退出する場合は、Master Serverへの接続は失敗しクライアントは再接続と再度の認証が必要となります。
C# SDK
このページではC#クライアントSDKのみ説明を行います。
同じ機能がほかのSDKでも使用可能です。
オペレーションの暗号化
すべてのC# APIにはPhotonPeer
というクラスがあります。
オペレーションを暗号化して送信するには、sendOptions.Encrypt = true
をもつPhotonPeer.SendOperation
をsendOptions
とともに呼び出します。
通常、このクラスを使用したり自分でこのメソッドを呼び出す必要はありません。低レベルで内部処理されます。
C#のAPIでは、Photonのネットワーククライアント用に高レベルのクラスを提供しています。
- PUN1では、
PhotonNetwork.networkingPeer
はPhotonPeer
です。 - Photon Realtimeでは
LoadBalancingClient.LoadBalancingPeer
がPhotonPeer
です。 - Photon Voiceでは、
LoadBalancingTransport
がLoadBalancingClient
を拡張します。 - PUN2では、
PhotonNetwork.NetworkingClient
がLoadBalancingClient
です。 - Photon Chatでは、
ChatClient.chatPeer
がPhotonPeer
です。
手動で暗号化を確立
クライアントSDKでは、手動で行う必要はありません。一からクライアントを開始する場合にのみ、接続後に暗号化を確立する必要があります。
最善のケースでは、以下のようにOnStatusChanged
でPhotonPeer.EstablishEncryption()
を呼び出します:
C#
public void OnStatusChanged(StatusCode returnCode)
{
// handle returnCodes for connect, disconnect and errors (non-operations)
switch (returnCode)
{
case StatusCode.Connect:
this.peer.EstablishEncryption();
// ...
The library takes care of sending and handling the required keys. When
this finishes, the client library will call OnStatusChanged
with either
of these codes:
C#
public void OnStatusChanged(StatusCode returnCode)
{
// handle returnCodes for connect, disconnect and errors (non-operations)
switch (returnCode)
{
// ...
case StatusCode.EncryptionEstablished:
// encryption is now available
// this is used per operation call
break;
case StatusCode.EncryptionFailedToEstablish:
// if this happens, get in contact with Exit Games
break;