sorry, że dopisuję się do tematu po pół roku od założenia, ale to chyba nie przestępstwo.
po pierwsze, jeśli robicie jakąś stronę internetową to możecie z góry założyć, że ktoś zrobi harvestera / scrapera, który będzie w stanie przemielić masę danych szybko. nie trzeba do tego nawet upubliczniać dokumentacji czy nawet jej tworzyć. spryciarz może po prostu podejrzeć jakie żądania są robione do serwera i napisać na kolanie coś co to imituje. w naszym projekcie to już się zdarzyło, a nasz portal jest dostępny tylko dla klientów, którzy płacą (więc grono spryciarzy mających dostęp do danych jest wiele rzędów wielkości mniejsze niż zbiór wszystkich hakierów działających w internecie).
po drugie:
Ma wielkie znaczenie to, gdzie tą walidację wsadzimy: jeśli sprawdzam na poziomie aplikacji u klienta/użytkownika końcowego, to sprawdzam tylko w zakresie danych, które ta aplikacja otrzyma, po prostu - dodajemy w miarę prostą logikę do aplikacji. Za to zrobienie proxy na serwerze wymaga filtrowania całego ruchu, pamiętania która apka z jakimi poświadczeniami działa, kto co powinien móc widzieć, kontrola czy przesyłane dane są na pewno przewidziane dla danej końcówki itp. Moim zdaniem to jest 100x więcej zamieszania.
Po prostu - na froncie dodajemy dodatkowe sprawdzenie po stronie aplikacji u klienta, ale nie jest to nowy byt, tylko poszerzenie czegoś, co mamy. Po stronie serwera - tworzymy nowy byt (jakiś middleware, proxy, API czy jakkolwiek byśmy to nazwali).
moim zdaniem to wstawianie tej zduplikowanej logiki po stronie klienta wprowadza więcej zamieszania niż wstawianie tego na backend. backend wie z którym użytkownikiem ma do czynienia, bo klient (przeglądarka czy dowolny inny) wysyła identyfikator sesji, a mając sesję wiadomo, o dane którego użytkownika chodzi (czyli można wyciągnąć prosto jego idka). to backend powinien kontrolować kto do czego ma dostęp i ma takie dane, nie frontend. frontend jedynie decyduje czy ukryć fragment ui, który i tak by nie działał, ale jak pokaże coś co jest zablokowane na backendie dla danego użytkownika to i tak wiele się nie stanie.
wstawianie zduplikowanej logiki na frontend jest kiepskie ponieważ w takiej sytuacji jest większe sprzężenie między backendem, a frontendem. be i fe muszą wtedy synchronizować reguły sprawdzania poprawności biznesowej danych. be i fe stoją po przeciwnych stronach systemu, tzn. organizacyjnie bardzo daleko od siebie w porównaniu do dwóch apek strojących na backendzie. jeśli zduplikowaną logikę wstawiamy na backend (obojętnie czy do nowej apki czy poupychaną do już istniejących czy może do testów albo czegokolwiek innego) tam gdzie oryginalne apki serwujące dane, to przynajmniej mamy usprawniony proces rozwoju backendu jako całości, bo jeden zespół (sami backendowcy) ogarnia te (zduplikowane) warstwy filtrowania danych.
ogólnie całość dość dobrze podsumowuje ta wypowiedź:
Nie ma sensu dodatkowe filtrowanie danych po stronie frontu.
To dodatkowy kod, który trzeba utrzymywać, kolejne potencjalne błędy.
(...)
Są przypadki kiedy mamy paranoje security (np. dane medyczne), ale wtedy też dodatkowe filtrowanie na froncie... to i tak za późno. Są dodatkowe filtry/reguły, które można umieścić w ramach API Gateway itd. Czyli po tym jak backend wypluje dane, to muszą jeszcze przejść przez dodatkowy zestaw reguł (ale to naprawde niszowe sytuacje - raz pracowałem przy takim systemie - to było straszne, ale niestety miało sens).
wracając jeszcze do prób zdefiniowana o co chodzi w tym wątku to są chyba dwie kwestie:
- czy robić dodatkowe (zduplikowane) warstwy filtrowania (np. te wykrywające dane, do których użytkownik nie powinien mieć dostępu)?
- (jeśli odpowiedź na powyższe pytanie jest twierdząca to) czy te dodatkowe warstwy filtrowania umieścić na backendzie czy na frontendzie?
jeśli zdecydujemy, że w danej sytuacji nie warto robić dodatkowej warstwy filtrującej to sprawa jest prosta. natomiast jeśli chcemy mieć dodatkowe zabezpieczenie to trzeba rozważyć wady i zalety umieszczania go na frontendzie lub backendzie. porównanie wygląda mniej więcej tak:
- dodatkowe filtrowanie po stronie frontendu to filtrowanie robione zbyt późno, bo dane potencjalnie dostały się już w niepowołane ręce (łatwo jest rejestrować ruch między przeglądarką, a serwerem), więc nie nadaje się do danych skrajnie wrażliwych. dodatkowe filtrowanie po stronie backendu zabezpiecza przed dostaniem się danych w niepowołane ręce bez względu na to czy ten ktoś polega tylko na widoku generowanym przez frontend czy analizuje cały ruch od serwera (a to jest przecież proste). w jakich sytuacjach nasze dane są na tyle wrażliwe, by uzasadniało to robienie zduplikowanych warstw filtrowania, ale nie na tyle wrażliwe, by przejmować się czy faktycznie zablokujemy niepowołany dostęp od razu?
- tak w ogóle to sam sygnał od frontendu, że coś jest źle też można sfałszować i wywołać fałszywy alarm po stronie backendu / systemu. co wtedy? system automatycznie się wyłączy, bo jakiś dowcipniś zasygnalizował błąd bezpieczeństwa, którego de facto nie ma? a może backend ma mieć warstwę filtrującą dla sygnałów z frontendu o uszkodzonym filtrowaniu? trochę taka incepcja. a może frontend będzie mieć błąd w tej zduplikowanej warstwie filtrowania i zgłosi błąd, którego nie ma? co z race conditions? frontend np. wyciąga listę postów dla użytkownika, potem ktoś usuwa dostep do pewnej kategorii, potem frontend wyciąga listę kategorii dostępnych dla użytkownika i wychodzi na to, że użytkownik dostał posty, których nie powinien widzieć. jak to rozwiązać po stronie alarmującego frontendu?
- robienie dodatkowego filtrowania (na frontendzie) w maksymalnej odległości od oryginalnego filtrowania (apka backendowa wyciągające dane z bazy) to silne sprzężenie (tight coupling) procesu rozwoju backendu i frontendu. takie coś może miałoby jakiś tam sens, gdyby cały zespół był złożony z fullstacków ogarniających jednocześnie zmiany w be i fe dotyczące jednej zmiany biznesowej. w przypadku osobnych zespołów backendowców i frontendowców taka zduplikowana logika to zwiększone tarcie między zespołami i problemy z błędną interpretacją. ogólnie jest tak, że backendowcy nie są jakoś super na bieżąco z tym co robią frontendowcy i vice versa. to samo dotyczy code review - backendowcy nie robią kompleksowych przeglądów frontendowcom i vice versa. stąd jest duże prawdopodobieństwo, że ta zduplikowana logika, rozrzucona między backendem i frontendem, będzie faktycznie mieć odmienną semantykę (z większym prawdopodobieństwem, że ta po stronie frontendu będzie zła, bo ta jest przecież tylko dodatkowa) i często będzie działać (przynajmniej pozornie) poprawnie tylko dzięki zbiegowi okoliczności.