# 웹 네트워킹

> How to use networking in Web.

다음 두 가지 방법으로 웹에서 네트워킹을 사용할 수 있습니다.

* [UnityWebRequest](/engine/6000.0/manual/scripting/object-oriented-development/web-request.md) 클래스 사용
* [Unity Netcode 네트워킹 패키지 사용](#UsingNetcode)

## 웹에서 UnityWebRequest 클래스 사용##use-the-unitywebrequest-class-in-web

Unity는 웹에서 [UnityWebRequest](/engine/6000.0/script-reference/unity-engine-networking/unity-web-request.md) 클래스를 지원합니다. UnityWebRequest 클래스를 구현하기 위해 Unity는 브라우저를 사용하여 웹 요청을 처리하는 JavaScript Fetch API를 사용합니다. 따라서 크로스 도메인 리소스에 대한 액세스에 보안 제한이 적용됩니다.

Unity 콘텐츠를 호스팅하는 서버가 아닌 다른 서버로 웹 요청을 전송하는 경우 전송 대상 서버에서 Unity 콘텐츠를 승인해야 합니다.

웹에서 크로스 도메인 웹 리소스에 액세스하려면 액세스 대상 서버가 [CORS(Cross-Origin Resource Sharing)](https://fetch.spec.whatwg.org/#http-cors-protocol)를 사용하여 크로스 도메인 웹 리소스를 승인해야 합니다.

UnityWebRequest를 사용하여 콘텐츠에 액세스하려고 하는 경우 원격 서버에 CORS가 설정되어 있지 않거나 올바르게 설정되어 있지 않으면 다음과 같은 오류가 브라우저 콘솔에 표시됩니다.

```
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver.com/. This can be fixed by moving the resource to the same domain or enabling CORS.
```

서버는 전송하는 http 리스폰스에 Access-Control 헤더를 추가해야 합니다. 그래야만 어느 웹 페이지가 웹 브라우저에서 해당 정보를 읽을 권한이 있는지 나타낼 수 있습니다.

Unity Web이 모든 원점에서 웹 서버의 리소스에 액세스할 수 있도록 액세스 제어 헤더를 추가하는 방법에 대한 설명은 다음 예시를 참조하십시오. 이 예시에는 일반적인 요청 헤더가 포함되어 있으며 GET, POST, OPTIONS 메서드를 사용할 수 있습니다.

```
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Headers": "Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Origin": "*",
```

### **UnityWebRequest 다운로드**##**unitywebrequest-downloads**

다음과 같이 UnityWebRequest 다운로드를 차단하는 코드는 사용하지 마십시오.

```
while(!www.isDone) {}
```

웹 브라우저는 네트워크 전송을 기다리기 위해 동기식으로 코드 실행을 차단할 수 없습니다. 따라서 동기식 UnityWebRequest를 수행해야 하는 경우 [Coroutine](/engine/6000.0/manual/scripting/object-oriented-development/coroutines.md)과 yield 문을 사용하여 다운로드가 완료될 때까지 기다립니다. 자세한 내용은 [UnityWebRequest를 사용하는 코루틴 예시](/engine/6000.0/manual/scripting/object-oriented-development/web-request/hlapi.md)를 참조하십시오.

## Unity Netcode 네트워킹 패키지 사용##use-the-unity-netcode-networking-packagescrollpoint-id=usingnetcode-/

웹 브라우저는 보안 제한으로 인해 TCP 또는 UDP 소켓에 대한 직접 액세스를 허용하지 않습니다. 대신 웹 플랫폼을 지원하는 Unity Netcode 네트워킹 패키지를 사용할 수 있습니다. 자세한 내용은 [Netcode for GameObjects 정보](https://docs-multiplayer.unity3d.com/netcode/current/about/)(Unity 멀티플레이어 네트워킹 기술 자료)를 참조하십시오.

웹 브라우저 네트워킹 표준에 대한 자세한 내용은 다음을 살펴보십시오.

* [WebSocket 프로토콜](https://datatracker.ietf.org/doc/html/rfc6455)(데이터 트래커)
* [WebRTC: 브라우저에서 실시간 통신](https://www.w3.org/TR/webrtc/)(W3)
* [WebTransport](https://www.w3.org/TR/webtransport/)(W3)

## 웹 네트워킹의 한계##limitations-of-web-networking

웹 플랫폼이 지원하지 않는 네트워킹 기능이 몇 개 있습니다.

### .NET 네트워킹 클래스 지원 안 함##no-support-for-.net-networking-classes

JavaScript 코드가 네트워크 연결을 구현하기 위해 IP(인터넷 프로토콜) 소켓에 직접 액세스할 수 없으므로 웹 플랫폼 내에서 .NET 네트워킹 클래스를 사용할 수 없습니다. 특히 웹은 `System.Net` 네임스페이스 내에서 .NET 클래스를 지원하지 않습니다.

### 네이티브 소켓 액세스에 대한 지원 안 함##no-support-for-native-socket-access

웹 플랫폼은 브라우저 내부의 보안 제한으로 인해 네이티브 소켓 액세스를 지원하지 않습니다. 따라서 웹은 [UnityEngine.Ping](/engine/6000.0/script-reference/unity-engine/ping.md)(ICMP) 같은 기능도 지원하지 않습니다.
