This document is about: VOICE 1
SWITCH TO

Photon Voice1은 Photon Voice의 첫 버전입니다.        현재는 리팩터링/확장을 거친 Photon Voice 2이 준비되어 있으므로 새로운 프로젝트를 시작할 경우에는 Photon Voice 2를 사용하시는 것을 권장합니다.

암호화

Photon 은 클라이언트와 서버간 메시지에 대해서 암호화 할 수 있으며 입력된 인증정보 또는 민감한 사용자 정보를 전송 할 때는 암호화가 필수 입니다.

다른 한편 암호화는 큰 오버헤드의 원인이 되기 때문에 빈번하게 사용되지 않으며 API 에서 노출 하지 않았습니다.

예를 들어 디폴트 로직에서 룸의 모든 플레이어에게 공개적으로 전달 되어야 하기 때문에 너무 비밀 스럽게 할 수 없습니다. 따라서 모든 이벤트들은 기본적으로 암호화 되지 않습니다.

클라이언트 SDK에서는 인증을 위해서만 암호화를 사용되고 있습니다. 개발자는 메시지에 대해서 암호화를 사용할 수 있습니다.

기술 상세 내용

Photon LoadBalancing 또는 PUN 을 사용할 때, API 는 클라이언트와 서버간에 암호화 키를 자동적으로 교환합니다.
키 교환은 클라이언트가 연결될 때 Diffie-Hellman Key Exchange 를 통해 이루어 집니다.
필요에 따라 256 bit 키가 AES 암호화 에 사용 됩니다.

클라이언트가 인증되었으면 서버는 토큰을 발행 합니다. 토큰은 클라이언트 인증 값의 암호화 된 요약으로서 다른 서버에서 사용됩니다. 클라이언트가 토큰을 읽을 필요는 없습니다.

만약 Webhooks 또는 WebRPC 를 사용 한다면 Photon 서버는 HTTPS 연결로 호출 하게 됩니다.
만약 유니티의 WebGL export 를 사용하고 있다면 클라이언트는 보안 웹소켓을 통해 연결되게 됩니다.

PUN 에서 암호화(Photon Unity Networking)

PUN 에서는 PhotonView 에서 RpcSecure() 호출 하여 암호화된 방식의 RPC 호출 할 수 있습니다.

오퍼레이션의 암호화

모든 API 에서 PhotonPeer라고 하는 클래스가 있습니다. 낮은 레벨의 클래스로 OpCustom() 메소드를 제공 합니다.
이것은 클라이언트에서 수행하는 모든 오퍼레이션 호출의 기본이며 암호화 매개 변수를 가집니다.

PUN 에서 PhotonNetwork.networkingPeer는 PhotonPeer 입니다.
LoadBalancing 에서는 LoadBalancingClient.loadBalancingPeer 입니다.

필요에 따라 암호화 파라미터를 true로 설정 하여 OpCustom() 를 사용 합니다.

수동으로 암호화 수립

LoadBalancing API 또는 PUN 을 사용하고 있다면, 수동으로 할 필요가 없습니다.
처음부터 클라이언트를 시작하는 경우에는 연결 후에 암호화를 수립 해주어야 합니다.

최고의 경우는 다음과 같이 OnStatusChanged 에서 peer.EstablishEncryption() 를 호출합니다:

C#

    
    public void OnStatusChanged(StatusCode returnCode)
    {
        // handle returnCodes for connect, disconnect and errors (non-operations)
        switch (returnCode)
        {
            case StatusCode.Connect:
                this.peer.EstablishEncryption();
                // ...
    

라이브러리는 필요한 키를 전송 및 처리합니다.
이것이 끝나면 다음 중 하나의 코드로 클라이언트 라이브러리에서 OnStatusChanged를 호출합니다:

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;
    
Back to top