Najważniejsze zagadnienia, które musisz znać
5 godz. 53 min · JavaScript · Full-stack i Programowanie
Adam GospodarczykPrzesyłanie oraz transformacja danych to jeden z najważniejszych elementów działania każdej aplikacji. Dobre zrozumienie tego w jaki sposób odbywa się ten proces, daje równocześnie lepsze zrozumienie całej struktury oraz podejmowania decyzji projektowych. W tym kursie znajdziesz lekcje, które pozwolą Ci uporządkować wiedzę na temat protokołu HTTP oraz formatów wymiany danych.
REST oraz GraphQL to nadal nieodłączone zagadnienia tematu wymiany informacji w kontekście aplikacji webowych. Pomimo tego, że ich koncepcje zwykle są bardzo dobrze opisane w różnych źródłach, tak ich wykorzystanie "na produkcji" potrafi sprawić problemy. W szczególności gdy weźmiemy pod uwagę, wyjątki oraz fakt, że nie każda aplikacja będzie wymagać implementacji REST czy GraphQL w 100%. W tym kursie znajdziesz wiele praktycznych wskazówek związanych z pracą z REST API oraz wprowadzenie do pracy z GraphQL.
Niektóre błędy w aplikacji są bardzo pożądane, w szczególności gdy jasno informują użytkownika o tym, co się wydarzyło oraz o tym, co może z tym zrobić. Pomimo tego, że w wielu przypadkach opracowanie komunikatów leży w rękach osoby odpowiedzialnej za copywriting (i/lub ux writing), tak sama implementacja tych komunikatów odbywa się po stronie kodu. Nie rzadko okazuje się, że poprawna i skuteczna walidacja danych oraz obsługa błędów nie jest oczywista w "produkcyjnych" sytuacjach. W tym kursie znajdziesz najczęściej spotykane problemy oraz sposoby ich rozwiązania.
Bazy danych są praktycznie nieodłączną częścią każdej aplikacji. W roli full-stacka prędzej czy później przyjdzie Ci z nimi pracować a nie rzadko nawet projektować oraz rozbudowywać ich struktury. W tym kursie znajdziesz informacje o bazach danych, które pozwolą Ci je zrozumieć oraz od razu poznać użyteczne techniki, które pomogą Ci w pracy z nimi, zarówno na produkcji jak i w środowisku lokalnym czy testowym.
Nie wszystkie informacje w aplikacji są publiczne. Niektóre wprost nie mogą takie być. Z tego powodu niezbędne są sposoby na to aby poznać a potem weryfikować tożsamość użytkownika, by na jej podstawie przydzielać mu dostęp wyłącznie do zasobów, do których odczytywania posiada uprawnienia. Istnieje wiele technik, które umożliwiają zarządzanie dostępem do danych i w tym kursie poznasz najważniejsze z nich. Dowiesz się nie tylko w jaki sposób zabezpieczać dane ale poznasz też najpopularniejsze sposoby na to aby te zabezpieczenia łamać i obchodzić. Mając świadomość takiej możliwości, będziesz w stanie lepiej podejmować decyzje o tym jak projektować dostęp do informacji.
Istnieją problemy charakterystyczne dla niemal każdej aplikacji. W związku z ich powszechnością, istnieje też szereg rozwiązań lub sposobów na to, aby możliwie zredukować ich następstwa. Na przestrzeni lekcji tego kursu zobaczysz wiele przykładów, które pomogą Ci w codziennej pracy a niekiedy nawet, pozwolą uniknąć błędów, których konsekwencje nie zawsze występują natychmiast.
Kurs powstał z myślą o osobach, które chcą rozwijać się w roli full-stack web developera / developerki, przeprowadzając przez najważniejsze zagadnienia z obszaru wymiany, transformacji oraz przechowywania informacji w aplikacji oraz pomiędzy aplikacjami. Jeżeli potrzebujesz zobaczyć szeroką perspektywę tego, w jaki sposób dane przepływają pomiędzy różnymi częściami aplikacji, lub ugruntować swoją wiedzę na ten temat, to ten kurs jest miejscem, którego szukasz.
W tej lekcji chciałbym powiedzieć Ci więcej na temat przechowywania wrażliwych
informacji, w szczególności haseł i różnego rodzaju danych, które mogą być
przechowywane w sposób, który nie powinien być dostępny nawet Tobie.
Jak się pewnie domyślasz, w momencie, gdy
rozwijasz aplikacja ta aplikacja posiada bazę danych.
To naturalnie Ty jako jej twórca możesz
się do niej zalogować i odczytać wszystkie dane, które się w niej znajdują.
Jednak dane takie jak chociażby hasła użytkowników powinny być przechowywane w
sposób, który nie będzie czytelny nawet dla twórców aplikacji.
No i oczywiście dla osób, które
ewentualnie uzyskają nieautoryzowany dostęp do tych danych.
Z tego powodu musisz wiedzieć, że w momencie, gdy użytkownik rejestruje się do
Twojej aplikacji, a Ty zapisujesz jego dane w bazie, to informacje takie jak jego
hasło powinno zostać zaszyfrowane w sposób jednostronny.
Inaczej mówiąc, powinno zostać zachowane.
Oznacza to mniej więcej tyle, że
bezpośrednio w Twojej bazie danych dane wpisane w formularzu, czyli np.
mój adres email oraz hasło.
Oczywiście 1, 2, 3, 4 powinny w bazie
danych być przechowywane w następującej formie.
Adres email oczywiście jest możliwy do
odczytania i z tym nie ma najmniejszego problemu.
Ale już w przypadku hasła użytkownika mamy do czynienia z takim oto ciągiem znaków.
Co więcej, pomimo tego, że posiadałby
wszelkie dostępne klucze, które wykorzystałem do tego, aby przygotować
taki hash, i tak nie jestem w stanie odwrócić tego procesu.
Oznacza to mniej więcej tyle, że nawet jeżeli dane użytkowników wypłyną, to
oczywiście będzie to oznaczało dla nas spore kłopoty.
Ale jednocześnie ich dane będą bezpieczne.
Tym bardziej, jeżeli weźmiemy pod uwagę,
że wiele użytkowników wykorzystuje to samo hasło np.
do poczty email.
I tym samym wejście w posiadanie tego
jednego hasła da mi bezpośredni dostęp do tego adresu email, a co za tym idzie do
możliwości resetowania hasła w niemal wszystkich serwisach.
Myślę, że na tym etapie doskonale już
rozumiesz, na ile istotne jest to, aby odpowiednio obsłużyć proces kasowania
hasła i przechowywania go w odpowiedni sposób.
Naturalnie istnieje tutaj więcej przypadków, kiedy możemy mieć potrzebę
przechowania informacji w bazie danych, natomiast w momencie, gdy faktycznie
będzie taka potrzeba, myślę, że będziesz w stanie samodzielnie to ocenić.
Z drugiej jednak strony może dojść do
sytuacji, w której będziesz potrzebować przesłać informacje np.
pomiędzy różnymi serwerami, które do Ciebie należą.
Mogą to być np.
dwie różne usługi, które należą do Twojego pracodawcy, bądź np.
jakiegoś partnera, z którym współpracujecie.
W takiej sytuacji teoretycznie można
byłoby przesłać dane po prostu w formie plain tekstu, ale jednocześnie jeżeli
byłyby to dane w pewien sposób wrażliwe, to warto byłoby się dodatkowo
zabezpieczyć, aby w momencie, gdy z jakiegoś powodu zostaną te informacje
przechwycone w momencie przesyłania, to i tak w takiej sytuacji będą bezużyteczne.
W tym celu wykorzystujemy Encrypt, czyli
proces, który jest podobny do hakowania, z tą różnicą, że szyfrowana informacja może
zostać szyfrowana, o ile posiadamy w tym przypadku odpowiedni klucz.
I teraz załóżmy, że serwer pierwszy wysyła informacje do serwera drugiego.
Na etapie samego przesyłania informacja ta jest niemożliwa do odczytania i dopiero w
momencie, gdy trafia na nasz docelowy serwer, gdzie znajduje się klucz, który
jest taki sam jak ten, który został wykorzystany do zaszyfrowania tej
informacji, to będziemy w stanie wykorzystać go do
tego, aby odczytać zawartość przesłanych danych.
Myślę, że różnica pomiędzy jednym a drugim
szyfrowaniem jest w tym momencie dla Ciebie jasna.
Poza tym chciałbym jeszcze zwrócić tutaj
uwagę na jeden aspekt dotyczący szyfrowania danych.
Mianowicie już o tym wspominałem i też
będę wspominał o tym wielokrotnie, ale w momencie gdy będziesz usuwać informacje na
temat użytkowników ze swojej bazy, to w wielu przypadkach zamiast fizycznie
pozbywać się danych i też jakiegokolwiek śladu po nich, po upewnieniu się, że
możesz tego dokonać, lepiej wykorzystać proces anonimizacji danych użytkowników,
czyli po prostu doprowadzenia do sytuacji, że informacja została w sposób
nieodwracalny zaszyfrowana, czy też w ogóle zniszczona ze względu na to, że w
tym przypadku teoretycznie pod tym hasłem kryje się jakaś informacja, do której być
może komputery w przyszłości będą w stanie się dokopać.
Natomiast jednocześnie, jeżeli
wykorzystali byśmy tutaj funkcję losująca do tego, aby podmienić adres email
użytkownika, no to siłą rzeczy nie byłoby tutaj czego odwracać.
Z drugiej jednak strony może okazać się,
że takie niszczenie danych nie będzie wskazane lub też po prostu niepotrzebne.
Z tego powodu możesz wykorzystać hakowanie
do tego, aby właśnie w ten sposób zaszyfrować jakieś informacje użytkownika,
a potem wykorzystując odpowiednie narzędzia np.
porównywać dane wprowadzone z
użytkownikiem z informacjami, które w ten sposób zostały zachowane i teoretycznie
nie są już dla Ciebie dostępne, ale nadal możesz sprawdzić, czy np.
w historycznie w bazie danych kiedykolwiek.
Tak czy inaczej te wszystkie elementy są
czymś, czemu zdecydowanie warto poświęcać uwagę.
Absolutne minimum w tym obszarze, które
musisz opanować jest zachowanie haseł użytkowników.
Natomiast szyfrowanie informacji w celu np.
takiego przesyłania ich pomiędzy serwerami jest już kwestią opcjonalną.
Natomiast oczywiście w niektórych przypadkach może okazać się krytyczne.
I teraz jeżeli przejdziemy do edytora
kodu, to mamy tutaj przykład wykorzystania pakietu crypto oraz tutaj dwie funkcje, z
czego jedna służy szyfrowaniu informacji, a druga jej szyfrowaniu.
Oczywiście zachęcam Cię do tego, aby
zapoznać się z tym kodem nieco bliżej i też zajrzeć sobie do dokumentacji i
przykładów szyfrowania danych i odszyfrowania w ten sposób.
Natomiast szczerze mówiąc w moim przypadku
korzystam zwykle z tych dostępnych pakietów po to, aby w prosty sposób
wykorzystać sobie funkcje szyfrujące i odszyfrować.
Jedyne co muszę zadbać o to, aby klucz,
które wykorzystuję do szyfrowania był przechowywany w sposób bezpieczny.
Naturalnie w tym przypadku jest to
całkowicie losowy wygenerowany ciąg znaków.
Tak czy inaczej, jeżeli teraz przejdziemy
sobie do konsoli, a następnie wykonamy ten skrypt, to widzisz, że w momencie
szyfrowania tego tekstu zamienia się on w ciąg znaków, który jest zasadniczo
praktycznie nie jest możliwy do odszyfrowania bez posiadania klucza.
Aczkolwiek ten klucz w tym przypadku
dostępny jest wewnątrz metody odpowiedzialnej za odszyfrowanie i dzięki
temu jesteśmy w stanie w następnej linii odczytać zaszyfrowane wcześniej dane.
Myślę, że na ten moment śmiało możesz
potraktować to jako ciekawostkę, albo przynajmniej zapisać sobie ten skrypt na
wypadek, gdy zajdzie potrzeba, aby wykorzystać go w praktyce.
Wcześniej jednak polecam zapoznać się z
nim nieco bliżej, aby upewnić się, że rzeczywiście odpowiada on Twoim potrzebom.
Z kolei jeżeli chodzi o ten najważniejszy temat, czyli hakowanie haseł, to pomimo
tego, że o tym będziemy sobie jeszcze mówić w tym celu w ekosystemie mądrze
jest, aczkolwiek i nie tylko wykorzystujemy bibliotekę Big Red
o tym, jak konkretnie będziemy mogli wykorzystywać ją do tego, aby szyfrować
bezpiecznie hasła i w tej formie przechowywać je w bazie danych, a
następnie też wykorzystać do logowania użytkownika.
Właśnie poprzez metodę Compare, która porównuje hasło przekazane przez
użytkownika do jego zachowanej formie pochodzącej z bazy danych.
O tym jednak w kontekście naszej aplikacji będziemy sobie jeszcze mówić.
W związku z tym nie będę tutaj swoje dodawał.
Tymczasem jeżeli chodzi o bezpieczne
przechowywanie informacji w bazie danych, to by było na tyle.
Natomiast zanim zakończymy, chciałbym
zwrócić jeszcze uwagę na jeden ostatni element, mianowicie już o tym wspominałem
w jednej z poprzednich lekcji, ale zawsze dbaj o to, aby użytkownicy mieli dostęp
wyłącznie do tych danych, do których rzeczywiście posiadają uprawnienia.
Możesz wykorzystywać najlepsze techniki kasowania informacji i oczywiście wręcz
jest to konieczne, ale tak naprawdę jednocześnie musisz zwracać uwagę na to,
jakie informacje trafiają do Twojego klienta oraz nawet też nie tylko to, co
zostaje mu wyświetlone, ale też co trafia do Twojej przeglądarki w formie np.
ciasteczek, informacji przechowywanych w
lokalu czy też po prostu w zakładce Network.
Wszystko to, co potencjalnie trafia do
Twojego klienta może zostać wykorzystane i trzeba mieć to na uwadze.
W związku z tym raz jeszcze proszę, aby temat bezpieczeństwa traktować bardzo
poważnie i jeżeli czujesz, że w tym obszarze potrzebujesz nieco więcej wiedzy,
zachęcam Cię do zapoznania się z pozostałymi materiałami na.
Edu.
PL, bądź też nawet poszerzać wiedzę na ten temat w innych źródłach.
Tymczasem w tym temacie z mojej strony to by było na tyle.
W związku z tym zapraszam Cię do kolejnej lekcji.