AJAX - fakty i mity

Nowa technologia zawsze wywiera wpływ na istniejące aplikacje i infrastrukturę. Czasami uzyskane korzyści okazują się mniejsze od problemów, które musimy pokonać, aby wdrożyć nowe rozwiązanie. AJAX to jedna z nowinek w wirtualnym świecie, o której krąży wiele nie do końca prawdziwych informacji. O czym tak naprawdę należy wiedzieć i pamiętać, aby się nie rozczarować? Jak AJAX może wpłynąć na naszą sieć?

AJAX to idea a nie skrót

Akronim AJAX oznacza Asynchronous JavaScript and XML (Asynchroniczny JavaScript i XML). Nawet pełna nazwa nie oddaje w całości, czym jest AJAX, gdyż upraszcza historię tej techniki i jej implementacje. AJAX zmienia sposób działania aplikacji webowych. Pozwala na zerwanie z cyklem wyślij-czekaj-powtórz, który jest typowy dla starych aplikacji działających po stronie serwera. AJAX to przede wszystkim lepsza interakcja klient-serwer. AJAX oferuje ciągłe uaktualnianie dokumentu, bez konieczności jego przeładownia, co znacznie wpływa na funkcjonalność aplikacji.

Dzięki nowej technice użytkownik otrzymuje lepszy interfejs, mnogość opcji i szybszą aplikację. Z drugiej strony, te dobrodziejstwa mogą wymagać dodatkowego monitoringu i zabezpieczeń. Należy także mieć na uwadze wydajność sieci i serwerów.

JavaScript to podstawa

Aplikacje AJAX napisane są z wykorzystaniem JavaScript i bazują na obiekcie komunikacyjnym XMLHttpRequest. Ze względu na brak ujednoliconego standardu implementacje w przeglądarkach mogą się znacząco różnić.

Dzięki Ajaksowi JavaScript zajmuje obecnie ważną pozycję w świecie aplikacji webowych. Jest odpowiedzialny za zbieranie i akwizycję danych, komunikację z serwerem. Programiści, którzy nie lubią tego języka, mogą próbować go uniknąć. Ułatwiają to istniejące narzędzia, które generują JavaScript na podstawie innego języka (np. Java). Można także schować kod pod postacią komponentów (np. .Net lub Ruby). Niemniej jednak, w końcowej aplikacji i tak będzie JavaScript. Nie można go wyeliminować. Dlatego należy zaakceptować fakt, że AJAX oznacza mnóstwo JavaScript i nauczyć się czerpać z tego korzyści.

AJAX jest ściśle związany z siecią. Korekta błędów w kodzie to nie tylko problemy programistów, lecz także administratorów infrastruktury. JavaScript, jak każdy inny język, wymaga zastosowania standardów, testów i kontroli kodu. Tylko wówczas końcowa aplikacja będzie poprawnie obsługiwana i spełni wymagania stawiane przez użytkownika.

Nie tylko XML

AJAX nie wymaga XML, chociaż w akronimie jest "X". Naturalnie format XML jest obsługiwany, lecz obiekt XMLHttpRequest jest w stanie transportować inne dane tekstowe. Programiści mogą korzystać z JavaScript Object Notation, czy nawet JavaScript. Możliwe jest także użycie czystego tekstu, HTML, czy sprawdzonego starego formatu CSV (dane oddzielone przecinkami).

Obiekt XMLHttpRequest nie pozwala na przesyłanie do serwera danych w formacie binarnym. Flash umożliwia komunikację w takim formacie. Dlatego należy się spodziewać, że ten mankament AJAX zostanie niedługo poprawiony.

Analiza wydajności i bezpieczeństwa sieci lub aplikacji wymaga znajomości formatu, który jest używany przez aplikację. Pamiętajmy więc, że nie zawsze jest to XML.

Wzrost obciążenia sieci

Aplikacje AJAX inaczej korzystają z zasobów sieciowych. Zamiast rzadkich żądań, wymagających niekiedy przesłania kilkuset kilobajtów, mamy znacznie więcej zapytań i krótkich odpowiedzi. Częstsze transmisje paczek danych mogą spowodować wzrost obciążenia serwerów i sieci. Programiści powinni zdawać sobie sprawę z tego, jak ich aplikacja wpłynie na ruch w sieci tj. ile żądań wygeneruje w określonym czasie i ile danych zostanie przesłanych. Pomoc administratorów sieci na etapie projektowania aplikacji jest wskazana, gdyż to oni później jako pierwsi odczują skutki źle napisanego programu.

Optymalizacja AJAX

Wszyscy zajmujący się siecią chcieliby, aby aplikacje webowe przesyłały mniej informacji i to rzadziej niż ma to miejsce dzisiaj. Idea ta nie zawsze jest uwzględniana przez developerów. Kompresja HTTP pozwala zmniejszyć rozmiar odpowiedzi AJAX i jest obsługiwana przez większość przeglądarek. Włączenie mechanizmów kompresji po stronie serwera Web to dobry ruch, lecz zysk może być mniejszy w porównaniu z tradycyjnymi aplikacjami. Szybkość najprawdopodobniej dużo nie wzrośnie, gdyż transmitowane są zazwyczaj niewielkie porcje danych.

Częstość przesyłania informacji można zredukować używając różnego rodzaju buforów cache. Wielu programistów AJAX celowo uniemożliwia buforowanie poprzez specjalne ustawienia w nagłówku lub używanie unikalnych URL. Najlepszym wyjściem jest cache po stronie klienta napisany w JavaScript, lecz większość bibliotek AJAX nie zawiera takiej funkcjonalności. Specjaliści od optymalizacji sieci powinni omówić tą kwestię z programistami, gdyż niesie ona większe korzyści niż sama kompresja.

Limit dwóch połączeń

Aplikacje AJAX są ograniczone przez dwa jednoczesne połączenia HTTP do tego samego URL. Limit ten wynika z protokołu HTTP a nie z błędu w przeglądarce. Bariera ta zapobiega pisaniu kodu, który często odwołuje się do wielu serwerów jednocześnie. W związku z tym, stworzenie np. chatu wykorzystującego AJAX może nie być proste. Programiści powinni unikać angażowania zbyt wielu serwerów i utrzymywania długotrwałych połączeń.

Kolejność ma znaczenie

W przypadku komunikacji TCP/IP może się zdarzyć, że transmitowane pakiety dotrą do odbiorcy w innej kolejności niż zostały nadane. W przypadku tradycyjnych aplikacji webowych efekt ten jest niewidoczny. Podstawowa jednostka, dokument HTML, jest odbierany jako pierwszy. Dopiero wówczas następuje pobieranie pozostałych elementów. W przypadku aplikacji AJAX sprawa wygląda inaczej. Asynchroniczność sprawia, że to programista musi się zatroszczyć o właściwą kolejność odpowiedzi (otrzymywanych danych). Inaczej aplikacja nie będzie działać jak należy. Już w trakcie projektowania konieczne jest przewidzenie odpowiedniej kolejki, której zadaniem będzie zapobiegnięcie złej kolejności.

Myląca informacja zwrotna dla użytkownika

Całymi latami użytkownicy "pomagali" aplikacjom webowym. Najczęściej robili to odświeżając stronę. W ten sposób eliminowali błędy powstałe w wyniku chwilowych problemów z siecią, które uniemożliwiły stronie wyświetlenie się. W przypadku AJAX błąd nie jest tak oczywisty dla użytkownika. Animowane kółko nie dostarcza za wiele informacji o statusie żądania. Programiści mają problem, gdyż biblioteki nie są w stanie efektywnie obsłużyć przekroczenia czasu, konieczności retransmisji itp. Narzędzia do diagnostyki JavaScript rzadko znajdują się po stronie klienta, wiec stwierdzenie błędu w komunikacji lub kodzie jest dodatkowo utrudnione.

Jedyne wyjście to szczegółowy monitoring aplikacji po stronie serwera.

Drugie życie starych zagrożeń?

Aplikacje AJAX nie są bardziej niebezpieczne niż tradycyjne aplikacje webowe, choć takie opinie można spotkać.

Ataki XSS (cross-site scripting) nie są nowym zagrożeniem. Podatna na taką napaść aplikacja zezwala na zmianę swoich danych przez inny skrypt JavaScript. Dane wejściowe w formie HTML w większości przypadków powinny być zabronione. Ponadto właściwa opieka nad plikami cookie pozwala zredukować zagrożenie ze strony XSS i ataków bazujących na przejęciu plików tymczasowych.

Stare zagrożenia są także groźne dla aplikacji AJAX

Stare zagrożenia są także groźne dla aplikacji AJAX

Próby przejęcia sesji to także nic nowego. Programiści AJAX muszą pamiętać o sprawdzaniu nagłówka HTTP i właściwym zarządzaniu sesją. W przeciwnym wypadku aplikacja może być furtką do ataku.

Hakerzy są zainteresowani używaniem JavaScript, który umożliwia wiele rodzajów ataków. Bardzo ważna jest świadomość programistów, że kod po stronie klienta może zostać zmanipulowany. Dlatego poprawność danych wejściowych należy zawsze sprawdzać.

***

Opracował: Marcin Suszkiewicz na podstawie materiałów Thomasa A. Powella (NetworkWorld, USA).


Zobacz również