Wyobraź sobie wideorozmowę, która działa bez problemu w biurze, ale po przełączeniu użytkownika na firmowy VPN nagle nie ma obrazu ani dźwięku. Albo transmisję, w której media są szyfrowane, lecz nieautoryzowany klient może podmienić dane sygnalizacyjne i poznać adresy IP uczestników. WebRTC rozwiązuje wiele problemów transportowych automatycznie, ale bez właściwej architektury łatwo zbudować system działający tylko w sprzyjających warunkach i ujawniający więcej informacji, niż zakłada projekt.
Bezpieczna transmisja audio i wideo wymaga połączenia kilku warstw: uwierzytelnionej sygnalizacji, poprawnego NAT traversal, szyfrowania DTLS-SRTP, kontroli wycieku adresów IP, ograniczenia uprawnień przeglądarki oraz monitorowania jakości i zdarzeń bezpieczeństwa. Poniższe decyzje tworzą praktyczną ścieżkę od prototypu do wdrożenia produkcyjnego.
1. Zaprojektuj odseparowany i uwierzytelniony kanał sygnalizacji
Rola serwera sygnalizacyjnego i protokołu WebSocket w wymianie metadanych
WebRTC nie narzuca konkretnego protokołu sygnalizacyjnego. Przeglądarka potrafi przygotować ofertę połączenia, odpowiedź oraz kandydatów ICE, ale nie wie, jak przekazać je drugiemu uczestnikowi. Za wymianę tych informacji odpowiada aplikacja. Najczęściej używa się połączenia WebSocket, choć równie dobrze można wykorzystać HTTP long polling, zwykłe żądania REST albo mechanizm komunikatów dostarczanych przez istniejącą platformę. [2]
Serwer sygnalizacyjny nie musi przenosić właściwego dźwięku i obrazu. Jego zadaniem jest koordynowanie sesji: odnalezienie uczestników, przekazanie oferty SDP, dostarczenie odpowiedzi SDP, wymiana kandydatów ICE oraz obsługa zdarzeń takich jak rozłączenie, renegocjacja czy zmiana urządzenia. W typowej architekturze media płyną bezpośrednio między klientami albo przez serwer TURN, natomiast sygnalizacja przechodzi przez backend aplikacji.
Przykładowy przepływ może wyglądać następująco:
- Użytkownik loguje się do aplikacji i otrzymuje krótkoterminowy token sesyjny.
- Klient otwiera połączenie WSS z serwerem sygnalizacyjnym.
- Backend sprawdza token, identyfikator pokoju i uprawnienia użytkownika.
- Klient tworzy obiekt
RTCPeerConnectionoraz lokalną ofertę SDP. - Oferta zostaje przekazana do serwera sygnalizacyjnego, a następnie do drugiego uczestnika.
- Odbiorca tworzy odpowiedź SDP i odsyła ją tą samą autoryzowaną ścieżką.
- Obie strony wymieniają kandydatów ICE, aż algorytm wybierze działającą trasę.
Sam fakt użycia WebSocket nie oznacza bezpieczeństwa. Niezaszyfrowane połączenie ws:// może zostać podsłuchane lub zmodyfikowane przez urządzenia pośredniczące. W produkcji należy stosować wyłącznie wss://, czyli WebSocket chroniony przez TLS. Certyfikat musi być prawidłowo zweryfikowany przez klienta, a ruch powinien być terminowany na kontrolowanym reverse proxy albo bezpośrednio na serwerze aplikacyjnym.
Handshake SDP, Offer/Answer i granice zaufania
SDP, czyli Session Description Protocol, jest tekstowym opisem parametrów sesji. Zawiera między innymi informacje o typach mediów, kodekach, kierunku transmisji, parametrach ICE oraz odciskach certyfikatów DTLS. Nie jest jednak samodzielnym mechanizmem uwierzytelniania ani szyfrowania. SDP należy traktować jako dane sterujące, które mogą wpływać na zachowanie klienta i dlatego muszą być kontrolowane.
W modelu Offer/Answer jedna strona tworzy ofertę, a druga odpowiada zaakceptowanym zestawem parametrów. W aplikacjach opartych na współczesnym API często spotkasz także mechanizm trickle ICE, w którym kandydaci są dostarczani stopniowo, już po przekazaniu początkowego SDP. Upraszcza to rozpoczęcie połączenia, ale zwiększa liczbę komunikatów, które trzeba poprawnie autoryzować i powiązać z konkretną sesją.
Backend powinien sprawdzać co najmniej:
- czy nadawca należy do pokoju i ma prawo dołączenia do danej sesji,
- czy wiadomość odnosi się do istniejącego identyfikatora połączenia,
- czy typ komunikatu jest dozwolony na aktualnym etapie negocjacji,
- czy rozmiar payloadu mieści się w limicie,
- czy struktura SDP nie zawiera nieoczekiwanych linii, wartości lub znaków sterujących,
- czy kandydat ICE nie próbuje skierować ruchu do niedozwolonego zakresu lub niepowiązanego uczestnika.
Nie należy bezrefleksyjnie przepisywać dowolnego SDP z klienta do innego klienta. Walidacja nie może niszczyć poprawnych parametrów negocjacji, ale powinna ograniczać format do tego, co rzeczywiście obsługuje aplikacja. W praktyce przydatne są parsery SDP zamiast ręcznego operowania na wielolinijkowych stringach. Trzeba też pamiętać o limitach długości, ochronie przed zalewaniem komunikatami i bezpiecznym logowaniu, ponieważ SDP może zawierać adresy IP, porty, identyfikatory sesji i odciski certyfikatów.
JWT, autoryzacja pokoju i ochrona przed przejęciem sesji
Krótkoterminowe tokeny JWT mogą potwierdzać tożsamość klienta podczas otwierania połączenia WSS. Token nie powinien być traktowany jak trwały identyfikator użytkownika ani przechowywany w adresie URL, gdzie łatwo trafi do logów reverse proxy, historii przeglądarki lub systemów analitycznych. Bezpieczniejsze są ciasteczka z flagami HttpOnly, Secure i odpowiednią polityką SameSite albo token przekazany w nagłówku podczas ustanawiania kontrolowanego połączenia.
Po uwierzytelnieniu użytkownika serwer powinien wykonać osobną autoryzację zasobu. Prawo do zalogowania się nie musi oznaczać prawa do wejścia do dowolnego pokoju, publikowania obrazu, nagrywania rozmowy czy przesyłania danych przez kanał RTCDataChannel. Uprawnienia można rozdzielić na role, na przykład: obserwator, uczestnik, moderator i operator techniczny.
Token sygnalizacyjny powinien mieć krótki czas życia, a serwer powinien rozpoznawać wylogowanie, zmianę uprawnień oraz unieważnienie sesji. Dodatkową ochronę daje powiązanie tokenu z identyfikatorem sesji, urządzenia lub jednorazowym nonce. Nie jest to pełna ochrona przed przejęciem aktywnego połączenia, ale ogranicza możliwość użycia skopiowanego tokenu w innym kontekście.
Brak autoryzacji może mieć bardzo praktyczne konsekwencje. Jeżeli serwer przekazuje komunikaty na podstawie samego identyfikatora pokoju, osoba znająca ten identyfikator może podsłuchiwać negocjację, wstrzyknąć fałszywych kandydatów ICE albo udawać uczestnika. Nawet gdy późniejszy kanał DTLS-SRTP szyfruje media, klient może zostać nakłoniony do zestawienia połączenia z niepożądanym punktem końcowym.
Morał architektoniczny: sygnalizacja jest punktem kontrolnym zaufania. Jeżeli ktoś może dowolnie modyfikować ofertę, odpowiedź lub kandydatów ICE, sama obecność szyfrowania P2P nie zapewnia właściwej tożsamości rozmówcy.
2. Skonfiguruj odporną na podsłuch infrastrukturę NAT traversal
STUN, TURN i algorytm ICE w praktycznym scenariuszu
Urządzenia użytkowników bardzo często znajdują się za NAT-em, zaporą sieciową, firmowym proxy albo VPN-em. Lokalny adres, taki jak 192.168.1.25, nie jest osiągalny z Internetu. WebRTC wykorzystuje ICE, czyli Interactive Connectivity Establishment, aby znaleźć działającą ścieżkę pomiędzy uczestnikami.
ICE zbiera różne typy kandydatów i testuje je według ustalonej kolejności. Kandydat host może wskazywać lokalny interfejs, server-reflexive jest publicznym odwzorowaniem uzyskanym przez STUN, a relay pochodzi z serwera TURN i pośredniczy w przesyłaniu mediów. Para kandydatów jest sprawdzana przez komunikaty kontrolne, a działająca trasa otrzymuje priorytet.
| Typ komponentu | Rola | Typowy problem | Znaczenie dla prywatności |
|---|---|---|---|
| STUN | Ujawnia publiczne odwzorowanie adresu klienta | Nie przekazuje mediów i nie działa w każdej topologii NAT | Operator widzi adres i czas zapytań |
| TURN | Przekazuje ruch przez serwer relay | Większe zużycie pasma i opóźnienie | Można centralizować kontrolę nad trasą |
| ICE | Porównuje i wybiera ścieżki | Nieprawidłowa konfiguracja powoduje długie oczekiwanie | Może ujawniać kandydatów lokalnych i publicznych |
STUN jest lekki, ale nie jest rozwiązaniem na restrykcyjne sieci. W przypadku symmetric NAT mapowanie portu zależy od konkretnego adresu docelowego. Adres uzyskany przez zapytanie STUN może więc nie działać, gdy drugi uczestnik próbuje połączyć się z inną lokalizacją. Firmowe zapory mogą również blokować UDP albo pozwalać tylko na ruch przypominający HTTPS.
Własny serwer TURN zamiast przypadkowego publicznego endpointu
TURN powinien być planowaną częścią infrastruktury, a nie awaryjnym adresem skopiowanym z przykładu. Popularnym rozwiązaniem jest coturn, wdrażany w jednej lub kilku strefach dostępności. W zależności od profilu użytkowników można utrzymywać węzły blisko głównych regionów geograficznych, ponieważ serwer relay przenosi cały strumień audio i wideo.
Najprostsza konfiguracja z trwałym użytkownikiem nie jest dobrym wyborem dla aplikacji publicznej. Znane dane logowania mogą zostać wykorzystane do nieautoryzowanego relaying’u, co generuje koszty i może zamienić serwer w narzędzie do nadużyć. Lepszy jest mechanizm krótkoterminowych poświadczeń, często nazywany TURN REST API lub ephemeral credentials.
Backend tworzy wtedy tymczasową nazwę użytkownika i hasło na podstawie sekretu współdzielonego z TURN. Klient otrzymuje dane ważne tylko przez ograniczony czas i dla konkretnego kontekstu. Przydatne są także:
Dobrym uzupełnieniem tego tematu jest także poradnik: Jak działa Apple Silicon M-Series – architektura i wydajność.
- limity czasu życia poświadczeń,
- ograniczenie liczby jednoczesnych alokacji,
- limity przepustowości na użytkownika lub pokój,
- monitorowanie nietypowego zużycia transferu,
- blokowanie otwartego relaying’u do przypadkowych celów,
- oddzielne sekrety dla środowisk testowych i produkcyjnych.
Serwer TURN musi mieć poprawnie skonfigurowany zakres portów relay oraz reguły zapory. Otwarcie tylko portu kontrolnego nie wystarczy. Trzeba uwzględnić porty, na których serwer będzie przekazywał ruch, i ograniczyć je do zakresu możliwego do monitorowania. W środowiskach kontenerowych dodatkowym źródłem problemów bywają mapowania NAT, błędnie reklamowany adres publiczny oraz brak obsługi UDP przez load balancer.
TURNS na porcie 443 i zachowanie w sieciach korporacyjnych
W sieciach z restrykcyjną polityką firewallu przydatny jest TURNS, czyli TURN transportowany przez TLS. Często używa się portu 443, ponieważ jest on zazwyczaj dopuszczony dla ruchu HTTPS. Nie oznacza to, że TURNS magicznie omija każdą inspekcję. Zapora może rozpoznawać charakter połączenia, stosować DPI, wymagać proxy albo blokować nietypowe zachowania TLS.
W praktyce konfiguracja powinna obejmować kilka wariantów: UDP dla niskich opóźnień, TCP jako plan awaryjny oraz TLS/TURNS na porcie 443. Klient może wtedy przejść od tańszej i wydajniejszej ścieżki do relay działającego w bardziej zamkniętej sieci. Trzeba jednak obserwować, jak często aplikacja korzysta z TURN-TCP lub TURNS, bo stały relay przez TLS może zwiększyć opóźnienia i zużycie procesora.
Publiczne, darmowe serwery STUN nie muszą być złośliwe, ale ich użycie oznacza oddanie operatorowi informacji o zapytaniach, adresach IP i czasie aktywności. Nie kontrolujesz retencji logów, lokalizacji danych ani polityki reagowania na nadużycia. W aplikacji, która ma chronić lokalizację użytkowników albo podlega wymaganiom organizacyjnym, własny zestaw STUN/TURN jest zdecydowanie łatwiejszy do audytowania.
Praktyczny wniosek: własny TURN nie jest wyłącznie polisą na wypadek problemów z połączeniem P2P. Może być także kontrolowanym punktem wymiany ruchu, elementem polityki prywatności i sposobem na ujednolicenie obserwowalności sieci.
3. Wymuś bezkompromisowe szyfrowanie mediów za pomocą DTLS i SRTP
Dwuetapowy model ochrony transmisji
WebRTC rozdziela uzgadnianie kluczy od szyfrowania pakietów medialnych. DTLS, czyli Datagram Transport Layer Security, służy do bezpiecznego uzgodnienia parametrów i kluczy sesyjnych. SRTP, czyli Secure Real-time Transport Protocol, wykorzystuje uzgodnione klucze do ochrony pakietów audio i wideo w czasie rzeczywistym.
Model ten jest dopasowany do charakterystyki mediów. Audio i wideo wymagają niskiego opóźnienia, a pojedynczy zagubiony pakiet nie powinien zatrzymywać całej sesji. SRTP zapewnia poufność oraz integralność pakietów bez kosztu typowego dla ponownego przesyłania każdego brakującego fragmentu. DTLS z kolei umożliwia uwierzytelnione uzgodnienie kluczy nad transportem UDP lub TCP. [4]
Weryfikuj certyfikat, odcisk i parametry negocjacji
Samo wystąpienie pól DTLS w SDP nie dowodzi jeszcze, że klient łączy się z właściwym rozmówcą. Kluczowe znaczenie ma odcisk certyfikatu, czyli fingerprint, powiązany z certyfikatem używanym podczas sesji DTLS. Odcisk powinien być przekazany przez uwierzytelniony kanał sygnalizacyjny i nie może zostać po cichu podmieniony przez pośrednika.

Serwer sygnalizacyjny może przekazywać SDP, ale nie powinien dowolnie zmieniać wartości a=fingerprint. Jeżeli aplikacja ma własny model zaufania, warto zapisać oczekiwany odcisk dla konkretnej sesji albo porównać go z wartością potwierdzoną przez drugi, niezależny kanał. W rozmowie między użytkownikami może to być kod wyświetlony na obu urządzeniach, potwierdzenie w aplikacji mobilnej albo zaakceptowany wcześniej klucz urządzenia.
W typowej aplikacji przeglądarka sama wykonuje walidację certyfikatu i nie udostępnia JavaScriptowi pełnej kontroli nad każdym etapem uzgadniania DTLS. Nadal można jednak kontrolować otoczenie negocjacji:
- odrzucać oferty i odpowiedzi pozbawione wymaganych parametrów DTLS,
- nie akceptować niezaszyfrowanych profili RTP,
- wiązać fingerprint z autoryzowaną sesją i uczestnikiem,
- reagować na zmianę fingerprintu w trakcie renegocjacji,
- rejestrować nieudane próby zestawienia kanału bez zapisywania kluczy prywatnych.
Przykładowo: jeśli użytkownik A otrzymał wcześniej fingerprint użytkownika B przez uwierzytelniony kanał, a w odpowiedzi SDP pojawi się inna wartość, negocjacja powinna zostać przerwana albo oznaczona jako wymagająca dodatkowego potwierdzenia. Taka kontrola ma sens tylko wtedy, gdy sama sygnalizacja jest chroniona przed modyfikacją.
Nie osłabiaj bezpieczeństwa przez tryb zgodności
W produkcji warto przyjąć zasadę, że brak możliwości zestawienia zaszyfrowanego kanału oznacza błąd, a nie powód do przełączenia na słabszy wariant. Aplikacja nie powinna akceptować niezaszyfrowanego RTP, przestarzałych profili ani nieznanych mechanizmów tylko dlatego, że zwiększa to liczbę „udanych” połączeń.
Po stronie przeglądarki podstawowym warunkiem jest bezpieczny kontekst, czyli HTTPS dla strony aplikacji. Dostęp do mikrofonu i kamery powinien być uzyskiwany dopiero po świadomej akcji użytkownika, a polityka Permissions-Policy może ograniczyć, które ramki i pochodzenia mają prawo korzystać z urządzeń wejściowych. [1]
Konfiguracja połączenia powinna być możliwie jednoznaczna. Przykładowy fragment kodu może wymuszać użycie relay, gdy polityka prywatności nie dopuszcza bezpośrednich ścieżek, oraz wyłączać nieużywane funkcje:
const pc = new RTCPeerConnection({
iceServers: [
{
urls: [
"turns:turn.example.com:443?transport=tcp"
],
username: turnCredentials.username,
credential: turnCredentials.credential
}
],
iceTransportPolicy: "relay",
bundlePolicy: "max-bundle",
rtcpMuxPolicy: "require"
});iceTransportPolicy: "relay" nie jest uniwersalnym ustawieniem wydajnościowym. Przekierowuje media przez TURN, więc zwykle zwiększa zużycie pasma i może dodać opóźnienie. Jest jednak przydatne w aplikacjach, w których ograniczenie ujawniania adresów uczestników ma większe znaczenie niż najkrótsza możliwa trasa. Ustawienie należy dobrać do modelu zagrożeń, a nie kopiować bez analizy.
Sprawdzaj stan zabezpieczeń, a nie tylko stan połączenia
Stan connected informuje, że połączenie działa, ale nie opisuje całej jego jakości ani parametrów bezpieczeństwa. Podczas testów i diagnostyki warto korzystać z RTCPeerConnection.getStats(). Statystyki mogą ujawnić wybraną parę ICE, typ użytego kandydata, protokół transportowy oraz informacje o stanie DTLS i SRTP.
Jeśli chcesz pogłębić ten wątek, sprawdź też: Budowa zespołu odpowiedzialnego za cyberbezpieczeństwo praktyczny plan dla rosnących fi….
Przykładowa kontrola może wykryć, czy aplikacja używa relay zgodnie z polityką:
const stats = await pc.getStats();
stats.forEach(report => {
if (report.type === "candidate-pair" && report.state === "succeeded") {
console.log({
localCandidateId: report.localCandidateId,
remoteCandidateId: report.remoteCandidateId,
protocol: report.protocol
});
}
if (report.type === "transport") {
console.log({
dtlsState: report.dtlsState,
iceState: report.iceState,
selectedCandidatePairId: report.selectedCandidatePairId
});
}
});W systemie produkcyjnym nie należy wysyłać do zwykłych logów pełnych adresów IP, fingerprintów ani identyfikatorów mogących połączyć statystyki z konkretną osobą. Lepsze są zanonimizowane identyfikatory sesji, klasy wyniku, na przykład relay-tcp lub direct-udp, oraz ograniczona retencja danych. Diagnostyka bezpieczeństwa powinna pomagać znaleźć problem, ale nie może sama tworzyć dodatkowego wycieku.
Rozdziel szyfrowanie transportu od szyfrowania end-to-end
DTLS-SRTP chroni media na ścieżce między punktami końcowymi WebRTC. Jeżeli ruch przechodzi przez TURN, serwer relay przekazuje zaszyfrowane pakiety, ale nadal może obserwować metadane transportowe, takie jak adresy, czas połączenia, rozmiary pakietów i zużycie pasma. Nie oznacza to, że TURN odszyfrowuje obraz lub dźwięk.
Inny model występuje w konferencji z serwerem SFU. Poszczególne połączenia WebRTC mogą być szyfrowane osobno, ale serwer SFU zwykle musi mieć dostęp do mediów, aby je odebrać, przetworzyć i wysłać do innych uczestników. Jeżeli wymagane jest rzeczywiste szyfrowanie end-to-end również przed operatorem SFU, potrzebny jest dodatkowy mechanizm, na przykład szyfrowanie klatek przy użyciu WebRTC Insertable Streams oraz niezależne zarządzanie kluczami.
Nie należy więc opisywać każdej konfiguracji WebRTC jako „end-to-end encrypted” bez doprecyzowania, kto jest końcowym punktem zaufania. W dokumentacji warto wskazać osobno:
- czy media są chronione przed podsłuchem na trasie,
- czy serwer TURN widzi wyłącznie zaszyfrowane pakiety,
- czy serwer SFU może odtworzyć media,
- kto przechowuje i odnawia klucze aplikacyjne,
- czy nagrywanie odbywa się po stronie klienta, czy infrastruktury serwerowej.
4. Chroń tożsamość sieciową klientów i zapobiegaj wyciekom lokalnych adresów IP
Ustal, jakie informacje o sieci są naprawdę potrzebne
Kandydaci ICE mogą ujawniać więcej niż sam fakt nawiązania połączenia. Adresy host wskazują interfejsy lokalne, kandydaci server-reflexive ujawniają publiczne odwzorowania NAT, a dane relay pokazują używaną infrastrukturę pośredniczącą. W określonych warunkach informacje te mogą pomóc w przybliżeniu lokalizacji, rozpoznaniu sieci firmowej albo korelacji aktywności użytkownika.
Nowoczesne przeglądarki często wykorzystują mechanizm mDNS do ukrywania lokalnych adresów IP przed stroną. Zamiast adresu interfejsu kandydat może zawierać nazwę tymczasową, którą potrafią rozwiązać wyłącznie uczestnicy właściwego procesu ICE. Nie wolno jednak zakładać, że mDNS zastąpi całą politykę prywatności. Zachowanie zależy od przeglądarki, systemu, wersji WebRTC, ustawień użytkownika i sposobu zestawiania połączenia.
Jeżeli aplikacja nie potrzebuje połączeń bezpośrednich, najbardziej przewidywalnym rozwiązaniem jest użycie polityki relay. W takim modelu drugi uczestnik nie otrzymuje kandydatów host ani server-reflexive, a media przechodzą przez kontrolowane serwery TURN. Trzeba przy tym dopilnować, aby aplikacja nie dodawała równolegle własnych kandydatów poza zarządzanym procesem ani nie udostępniała ich przez logi diagnostyczne. [3]
Ogranicz wycieki w sygnalizacji, logach i analityce
Wycieki nie muszą nastąpić bezpośrednio przez interfejs WebRTC. Częstym problemem jest logowanie całych obiektów SDP, raportów getStats() albo komunikatów ICE. Takie dane mogą zawierać adresy, porty, nazwy hostów, identyfikatory sesji i informacje ułatwiające powiązanie użytkownika z konkretną siecią.
Praktyczna polityka logowania powinna obejmować:
- maskowanie adresów IP przed wysłaniem zdarzenia do systemu analitycznego,
- usuwanie kandydatów ICE z logów aplikacyjnych, jeśli nie są potrzebne do diagnozy,
- krótką retencję surowych danych debugowania,
- kontrolę dostępu do logów sesji i narzędzi operatorskich,
- zakaz umieszczania tokenów TURN, SDP i danych sesji w adresach URL,
- oddzielenie danych technicznych od profilu użytkownika i historii aktywności.
Przykładowo, zamiast rejestrować cały kandydat zawierający adres i port, można zapisać jedynie: candidateType=relay, protocol=tcp, region=eu-central oraz losowy identyfikator sesji. Operator nadal dowie się, że połączenie użyło awaryjnej ścieżki TCP, ale nie otrzyma pełnej informacji o topologii urządzenia.
Kontroluj uprawnienia urządzeń i izolację osadzonej aplikacji
Ochrona tożsamości sieciowej powinna iść w parze z ograniczeniem dostępu do mikrofonu, kamery i kanałów danych. Aplikacja osadzona w iframe nie powinna automatycznie dziedziczyć wszystkich możliwości strony nadrzędnej. Atrybut allow oraz nagłówki Permissions-Policy mogą ograniczyć dostęp na przykład do microphone i camera tylko dla zaufanego pochodzenia.
Warto także rozdzielić role w samym połączeniu. Obserwator nie musi otrzymywać uprawnienia do publikowania ścieżki audio, a kanał danych powinien mieć osobne limity rozmiaru i częstotliwości wiadomości. Ograniczenie tych funkcji zmniejsza skutki przejęcia pojedynczego kontekstu przeglądarki.
Po zakończeniu rozmowy klient powinien zatrzymać ścieżki urządzeń przez MediaStreamTrack.stop(), zamknąć kanały danych i wywołać RTCPeerConnection.close(). W przypadku opuszczenia pokoju trzeba również unieważnić powiązane uprawnienia po stronie serwera, usunąć tymczasowe dane TURN i zakończyć aktywną sesję sygnalizacyjną. Pozostawiony mikrofon albo ważny token nie jest problemem wyłącznie technicznym — może prowadzić do realnego naruszenia prywatności.
Testuj wycieki na wielu typach sieci
Test bezpieczeństwa nie powinien kończyć się na połączeniu dwóch komputerów w jednej sieci Wi-Fi. Należy sprawdzić co najmniej bezpośrednią sieć domową, sieć komórkową, VPN, symmetric NAT, zaporę blokującą UDP oraz środowisko z wymuszonym relay. Dla każdego wariantu warto odpowiedzieć na trzy pytania:
- Czy połączenie zestawia się w akceptowalnym czasie?
- Jaki typ kandydatów został wybrany?
- Jakie adresy i identyfikatory trafiają do klienta, serwera oraz logów?
Automatyczny test może po zestawieniu połączenia pobrać statystyki, sprawdzić wybraną parę ICE i zgłosić błąd, gdy w trybie prywatności pojawi się kandydat host albo server-reflexive. Osobno trzeba testować rekonfigurację i ponowne połączenie, ponieważ właśnie podczas renegocjacji lub odświeżania ścieżki mogą ujawnić się informacje, których nie było w pierwszej ofercie.
Bezpieczna transmisja WebRTC wymaga więc jednoczesnej kontroli nad negocjacją, ochroną mediów, trasą sieciową i ilością ujawnianych danych. Najlepszy efekt daje nie pojedyncza opcja, lecz spójna polityka: uwierzytelniona sygnalizacja, zweryfikowany DTLS-SRTP, ograniczona ścieżka ICE, świadome użycie TURN oraz regularne testy prywatności.






