3.1 Architektura, protokoly a SOP
Základem webové komunikace je model klient-server, kde webový prohlížeč (klient) komunikuje s webovým serverem. Během této komunikace se uplatňuje mnoho různých protokolů a technologií.
Základní protokoly a technologie
Pro zajištění webového provozu je klíčových několik protokolů:
- DNS (Domain Name System) - pro překlad doménových jmen na IP adresy.
- TLS/DTLS - pro šifrování komunikace na transportní vrstvě.
- HTTP/1.1, HTTP/2 (využívá TCP s multiplexingem), HTTP/3 (využívá protokol QUIC nad UDP).
- WebSocket - pro obousměrnou komunikaci s nízkou latencí nad jedním TCP spojením.
Moderní webová architektura navíc využívá širokou škálu hardwarových a softwarových prvků:
- Infrastruktura: Reverse proxy, Load balancer, Content Delivery Network (CDN), Caching servery, SSL terminace.
- Bezpečnost: Web Application Firewall (WAF), Single Sign-On (SSO).
- Backend: Relační databáze (Oracle, MSSQL, MySQL, PostgreSQL) a NoSQL databáze (Redis, MongoDB, Elasticsearch, Neo4j). Aplikace běží na serverech jako Apache nebo Nginx, napsané v PHP, Javě, Pythonu či C#, často nasazené pomocí Docker kontejnerů a spravované přes Kubernetes v cloudu.
- Frontend: HTML, CSS, JavaScript, případně AJAX. Na straně klienta prohlížeč aplikuje bezpečnostní politiky, jako je SOP a CSP, existuje tu tak značný prostor k zanesení zranitelností.
URL definuje adresu konkrétního zdroje na webu. Formát typického URL je následující:
http://name:pwd@example.com:80/index.php?par1=val1&par2=val%202#home- Scheme:
http - Authority: Skládá se z Userinfo (
name:pwd), Host (example.com) a Port (80). - Path (Cesta):
/index.php - Query (Dotaz):
?par1=val1...obsahuje páry klíč-hodnota oddělené znakem ampersand (&). - Fragment:
#home(zpracovává se lokálně na straně klienta).
Rezervované znaky v URL se musí kódovat (např. mezera jako %20 nebo +).
HTTP metody: GET vs. POST
- GET: Používá se pro požadavek na získání dat (neměla by měnit stav na serveru). Parametry jsou přímo součástí URL. Nevýhodou je, že URL je viditelné v server logu, historii prohlížeče, reverzní proxy apod. Nikdy by se neměla používat pro citlivá data!
- POST: Používá se pro odesílání dat, vytvoření/úpravu záznamu. Parametry jsou uloženy v těle HTTP požadavku (Request body). Jsou zde vyžadovány dodatečné hlavičky
Content-TypeaContent-Length.
Důležité: I když využíváte metodu POST, technicky stále můžete poslat data i jako parametry v URI.
Hostname Encryption a SNI
Při navazování zabezpečeného spojení (TLS) zasílá klient zprávu ClientHello. Aby server věděl, jaký certifikát má vrátit (v případě, že hostuje více domén na jedné IP adrese), přidává klient do ClientHello parametr SNI (Server Name Indication).
V protokolech TLS 1.0 - 1.2, a ve výchozím stavu i v TLS 1.3, je SNI posíláno jako prostý text (plaintext). Kdokoliv na síti tedy vidí, k jaké doméně se připojujete, i když je následná komunikace šifrována.
Rozšíření pro TLS 1.3, které šifruje SNI. Klient zjistí veřejný klíč serveru skrze DNS (pomocí HTTPS/SVCB záznamů) a vytvoří "vnější" decoy ClientHello směřující například na obecný CDN název, do kterého vloží skutečné "vnitřní" šifrované ClientHello obsahující reálný název hostitele. Vyžaduje plnou podporu na serveru, v prohlížeči i využívání DNS-over-HTTPS k prevenci úniku názvu domény na DNS vrstvě.
SOP (Same-Origin Policy)
Jedná se o klíčový bezpečnostní mechanismus webových prohlížečů, který brání škodlivému skriptu na jedné stránce v získání přístupu k citlivým datům na jiné stránce. Prohlížeč izoluje jednotlivé původy (origins).
Původ (Origin) je definován trojicí: Protokol, Host (doména), Port.
Pokud je náš výchozí origin http://store.company.com/dir/page.html:
- ✅
http://store.company.com/dir2/other.html- STEJNÝ (stejný protokol, host i výchozí HTTP port 80). - ❌
https://store.company.com/page.html- JINÝ (jiný protokol HTTPS). - ❌
http://store.company.com:81/dir/page.html- JINÝ (jiný port). - ❌
http://news.company.com/dir/page.html- JINÝ (jiná doména).
SOP neblokuje odeslání požadavku, blokuje však přečtení odpovědi (Browser is the one who decides, not the server). Pokud chce server povolit jiným originům číst svá data, musí využít mechanismu CORS (Cross-Origin Resource Sharing) a nastavit HTTP hlavičku Access-Control-Allow-Origin.