Co to jest JWT? Tokeny internetowe JSON wyjaśnione na przykładzie działania

  1. Strona główna
  2. Blog
  3. Rozwój oprogramowania

Rozwój oprogramowania

Co to jest JWT? Tokeny internetowe JSON wyjaśnione na przykładzie działania

JWT pozwala serwerowi zaufać żądaniu bez sprawdzania czegokolwiek. Zbuduj go od podstaw, spróbuj majstrować przy nim i patrz, jak zawodzi, a następnie dowiedz się, kiedy tokeny pokonują sesje i jak z nich bezpiecznie korzystać.

9 min czytania
Co to jest JWT? Tokeny internetowe JSON wyjaśnione na działającym przykładzie

Najważniejsze

  • JWT to kompaktowy, podpisany token składający się z trzech części: nagłówka, ładunku i podpisu.
  • Podpis potwierdza, że ​​token nie został zmieniony, więc serwer może mu zaufać bez sprawdzania.
  • Ładunek jest czytelny dla każdego, dlatego nigdy nie należy ukrywać w nim tajemnic.
  • Tokeny są trudne do unieważnienia, więc przechowuj je krótko i zweryfikuj je w zaufanej bibliotece.

Skąd po zalogowaniu serwer wie, że każde późniejsze żądanie rzeczywiście pochodzi od Ciebie? Jedną z popularnych odpowiedzi jest Token sieciowy JSON, czyli JWT, zwykle wymawiany jako „jot”. Jest to mały, podpisany fragment danych, który klient wysyła przy każdym żądaniu, a serwer może go sprawdzić bez konieczności dotykania bazy danych.

Najszybszym sposobem zrozumienia JWT jest zbudowanie go, a następnie próba jego złamania. Zrobiliśmy to, używając tylko standardowej biblioteki Pythona w Pythonie 3.13, a poniższe dane wyjściowe pochodzą z tego uruchomienia. Ten kod służy do nauki. W prawdziwej aplikacji korzystaj z dobrze utrzymanej biblioteki, ponieważ szczegóły weryfikacji łatwo jest pomylić.

Co to jest JWT?

JWT to otwarty standard zdefiniowany w RFC 7519, służący do przekazywania roszczeń między dwiema stronami w postaci zwartego ciągu znaków. Roszczenie to po prostu stwierdzenie, np. „ID tego użytkownika to 42”. Ponieważ token jest podpisany, odbiorca może potwierdzić, kto go wydał i że nikt go nie zmieniał.

Pomyśl o opasce festiwalowej. Obsługa na bramce raz sprawdzi Twój bilet i wręczy Ci opaskę, którą trudno podrobić. Potem każde stoisko po prostu patrzy na zespół, bez konieczności dzwonienia do kasy. JWT działa w podobny sposób w przypadku interfejsu API.

Jak działa logowanie JWT

  1. Użytkownik wysyła nazwę użytkownika i hasło do punktu końcowego logowania.
  2. Serwer je sprawdza i tworzy podpisany token.
  3. Klient przechowuje token.
  4. Każde późniejsze żądanie zawiera je, zazwyczaj w nagłówku: Authorization: Bearer <token>.
  5. Serwer weryfikuje podpis i wygaśnięcie, a następnie odczytuje oświadczenia.

Główną zaletą jest krok 5. Serwer nie musi wyszukiwać sesji, co jest wygodne, gdy wiele usług lub serwerów musi sprawdzać ten sam token. Jeśli dopiero zaczynasz korzystać z interfejsów API, zacznij od czym jest interfejs API.

Trzy części JWT

JWT wygląda jak losowy tekst, ale składa się z trzech sekcji zakodowanych w formacie Base64URL oddzielonych kropkami. Oto jeden, który wygenerowaliśmy:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiI0MiIsInJvbGUiOiJ1c2VyIiwiaWF0IjoxNzkzNTAwMDAwLCJleHAiOjE3OTM1MDA5MDB9
.7YfUDH_T-iDh8bMmUT8mmKYwOstzT8Ty--DTTAmQGWM

Dodaliśmy podziały wierszy, aby ułatwić czytanie. Dekodowanie pierwszych dwóch części daje zwykły JSON:

Header:  {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"42","role":"user","iat":1793500000,"exp":1793500900}
Część Zawiera Cel
Nagłówek Typ tokenu i algorytm podpisywania Mówi, jak zweryfikować token
Ładunek Twierdzenia dotyczące użytkownika lub sesji Aktualne informacje
Podpis Skrót dwóch pierwszych części za pomocą klucza Potwierdza integralność i pochodzenie

Standardowe roszczenia

Roszczenie Imię Znaczenie
pod Temat Kogo dotyczy token, zazwyczaj jest to identyfikator użytkownika
jest Emitent Kto stworzył token
dźwięk Publiczność Dla kogo przeznaczony jest token
eksp Wygaśnięcie Kiedy token przestaje być ważny
i tak Wydane o godz Kiedy powstał
nbf Nie wcześniej Kiedy zacznie obowiązywać
jti Identyfikator JWT Unikalny identyfikator tego tokena

Możesz także dodać oświadczenia niestandardowe, takie jak role. Czasy to uniksowe znaczniki czasu wyrażone w sekundach. Utrzymuj niewielki ładunek, ponieważ token jest przesyłany z każdym żądaniem.

Zbuduj taki sam

Utworzenie tokena polega na zakodowaniu dwóch części JSON, a następnie podpisaniu ich kluczem tajnym przy użyciu HMAC-SHA256:

import base64, hashlib, hmac, json

SECRET = b"demo-secret-do-not-use-in-production"

def b64url(data):
    return base64.urlsafe_b64encode(data).rstrip(b"=").decode()

def sign(message):
    return b64url(hmac.new(SECRET, message.encode(), hashlib.sha256).digest())

def create_token(payload):
    header = {"alg": "HS256", "typ": "JWT"}
    parts = [
        b64url(json.dumps(header, separators=(",", ":")).encode()),
        b64url(json.dumps(payload, separators=(",", ":")).encode()),
    ]
    message = ".".join(parts)
    return message + "." + sign(message)

Weryfikacja polega na ponownym przeliczeniu podpisu i porównaniu go z tym, który znajduje się w tokenie. Tylko ktoś znający sekret może stworzyć pasujący:

def verify_token(token, now):
    header, payload, signature = token.split(".")
    expected = sign(header + "." + payload)
    if not hmac.compare_digest(signature, expected):
        raise ValueError("bad signature")
    claims = json.loads(b64url_decode(payload))
    if claims["exp"] < now:
        raise ValueError("token expired")
    return claims

Prawidłowy token zwrócił swoje oświadczenia zgodnie z oczekiwaniami. compare_digest jest używany, ponieważ działa w stałym czasie, co pozwala uniknąć wycieku informacji w wyniku różnic taktowania.

Spróbuj to pokombinować

Załóżmy, że atakujący dekoduje ładunek, zmienia "role":"user" na "role":"admin", koduje go ponownie i zachowuje stary podpis. Próbowaliśmy tego wraz z dwoma innymi atakami:

Próba Wynik
Zmieniono rolę na administratora zły podpis
Użyto tokena 1 sekundę po wygaśnięciu token wygasł
Ustaw "alg":"none" i usuń podpis zły podpis

Ta ostatnia próba jest wymierzona w prawdziwą historyczną słabość. Niektóre biblioteki kiedyś ufały własnemu nagłówkowi tokena, więc osoba atakująca mogła po prostu zadeklarować, że podpis nie jest potrzebny. Nasz kod zawsze wykorzystuje jeden ustalony algorytm, dlatego został odrzucony. W prawdziwej bibliotece zawsze określaj akceptowane algorytmy.

Podpisano, nie zaszyfrowano

Jest to najbardziej źle rozumiany punkt dotyczący JWT. Nasz sfałszowany token został odrzucony, a mimo to jego treść była w dalszym ciągu doskonale czytelna:

{"sub":"42","role":"admin","iat":1793500000,"exp":1793500900}

Base64URL to kodowanie, a nie szyfrowanie i każdy może to odwrócić bez żadnego klucza. Podpis uniemożliwia ludziom zmianę danych, ale nie pozwala na ich czytanie. Dlatego nigdy nie umieszczaj haseł, numerów kart ani prywatnych danych osobowych w ładunku JWT. Jeśli zawartość musi być ukryta, użyj zaszyfrowanych tokenów (JWE) lub po prostu przechowuj dane na serwerze.

HS256 kontra RS256

Aspekt HS256 RS256 lub ES256
Wpisz Symetryczny Asymetryczny
Klucze Jeden wspólny sekret Klucz prywatny podpisuje, klucz publiczny weryfikuje
Kto może tworzyć tokeny Każdy, kto skrywa tajemnicę Tylko posiadacz klucza prywatnego
Najlepsze dla Jedna usługa lub mała zaufana grupa Wiele usług, strony trzecie, dostawcy tożsamości

Dzięki podpisowi asymetrycznemu inne usługi mogą weryfikować tokeny bez możliwości wybicia własnych, co ogranicza szkody w przypadku naruszenia bezpieczeństwa jednego z nich.

JWT vs sesje

JWT są często przedstawiane jako nowoczesny zamiennik sesji. W rzeczywistości każdy ma kompromisy:

Aspekt Sesja serwera JWT
Gdzie mieszka państwo Na serwerze W tokenie
Wyszukaj przy każdym żądaniu Zwykle Nie potrzebne
Wylogowanie lub anulowanie To proste, usuń sesję Twardy przed wygaśnięciem
Rozmiar na żądanie Mały dowód osobisty Większy token (nasz miał 161 znaków)
W wielu usługach Potrzebuje wspólnego miejsca na dane Każdy może to sprawdzić bezpośrednio
Zmiana uprawnień Obowiązuje natychmiast Stary token pozostaje ważny aż do wygaśnięcia

W przypadku tradycyjnej witryny internetowej renderowanej przez serwer plik cookie sesji jest często prostszy i bezpieczniejszy. JWT mają większy sens w przypadku interfejsów API używanych przez kilka usług lub dla klientów mobilnych.

Wskazówka: Nie wybieraj JWT tylko dlatego, że brzmi to bezstanowo. Wiele prawdziwych systemów dodaje listę odrzuconych lub sprawdzanie bazy danych w celu obsługi wylogowania, co przywraca wyszukiwanie, którego JWT miał unikać.

Gdzie przechowywać tokeny w przeglądarce

Lokalizacja Ryzyko XSS Ryzyko CSRF Notatki
lokalny magazyn Wysoki, ponieważ skrypty mogą go odczytać Niski Proste, ale dostępne dla dowolnego wstrzykniętego skryptu
Plik cookie tylko Http Niższy, ponieważ skrypty nie mogą go odczytać Potrzebuje ochrony Użyj Secure i SameSite
Zmienna w pamięci Niższy Niski Utracono podczas odświeżania, więc wymaga przepływu odświeżenia

Wiele przewodników bezpieczeństwa faworyzuje HttpOnly, Secure, SameSite pliki cookie dla aplikacji internetowych. Niezależnie od tego, którą opcję wybierzesz, zawsze używaj protokołu HTTPS. Aby wysłać token z JavaScript, zobacz nasz samouczek API JavaScript Fetch.

Odśwież tokeny

Krótki okres ważności ogranicza szkody spowodowane skradzionym tokenem, ale nikt nie chce logować się co 15 minut. Zwykłe rozwiązanie wykorzystuje dwa tokeny:

  • Token dostępu: krótkotrwały, np. minuty, wysyłany z każdym żądaniem API.
  • Odśwież token: trwalszy, przechowywany ostrożniej i używany wyłącznie w celu uzyskania nowych tokenów dostępu.

Serwer śledzi tokeny odświeżania, dzięki czemu może je unieważnić, co daje praktyczne wylogowanie. Obracanie ich przy każdym użyciu pomaga również wykryć kradzież, ponieważ skradziony stary token zostaje odtworzony.

Typowe błędy bezpieczeństwa

  • Dekodowanie bez weryfikacji. Odczytanie ładunku nie czyni go wiarygodnym. Zawsze sprawdzaj podpis.
  • Akceptowanie dowolnego algorytmu. Ustaw jawną listę dozwolonych algorytmów.
  • Używanie słabego sekretu. Krótkie sekrety można złamać offline. Użyj długiej wartości losowej i trzymaj ją poza kontrolą źródła.
  • Pomijanie wygaśnięcia. Tokeny z numerem exp mogą działać wiecznie w przypadku kradzieży.
  • Nie sprawdzam iss i aud. W przeciwnym razie token wydany dla jednej usługi może zostać zaakceptowany przez inną.
  • Ufanie nieaktualnym oświadczeniom. Rola w tokenie może być nieaktualna, dopóki nie wygaśnie.
  • Tokeny rejestrowania. Każdy, kto czyta Twoje logi, może je ponownie wykorzystać.
  • Nie testuję ścieżek błędów. Dodaj testy dla tokenów, które wygasły i zmodyfikowały, a także ważnych. Pomocny może być nasz przewodnik testowanie API za pomocą Postmana.

Podsumowanie

JWT to podpisane dane, którym serwer może zaufać bez wyszukiwania, a nie tajny kontener i nie automatyczna aktualizacja w trakcie sesji. Korzystaj z krótkiego wygaśnięcia, sprawdzaj wszystko za pomocą utrzymywanej biblioteki i trzymaj prywatne dane poza ładunkiem. Aby się o tym przekonać, uruchom mały skrypt taki jak nasz, zmień jeden znak tokena i zobacz, jak weryfikacja kończy się niepowodzeniem.

Najczęstsze pytania

Do czego służy JWT?

Tokeny JWT są najczęściej używane do uwierzytelniania i autoryzacji w interfejsach API. Po zalogowaniu klient przy każdym żądaniu wysyła token, a serwer go weryfikuje w celu identyfikacji użytkownika.

Czy JWT jest szyfrowany?

Zwykle nie. Standardowy JWT jest podpisany i zakodowany, więc każdy może odczytać jego ładunek. Podpis jedynie zapobiega zmianom. Zaszyfrowane tokeny korzystają z powiązanego formatu zwanego JWE.

Jak długo powinien trwać JWT?

Tokeny dostępu są zwykle krótkotrwałe, często minuty, a nie dni. Połącz je z tokenem odświeżającym, aby użytkownicy nie musieli się ciągle logować.

Czy można odwołać JWT?

Nie samo w sobie, ponieważ pozostaje ważne aż do wygaśnięcia. Odwołanie wymaga śledzenia po stronie serwera, takiego jak lista odrzuconych, co usuwa część korzyści bezstanowych.

Czy JWT jest lepszy niż sesje?

Żadne z nich nie jest zawsze lepsze. Sesje są łatwiejsze do unieważnienia i pasują do wielu witryn internetowych, podczas gdy JWT pasują do interfejsów API i usług, które muszą niezależnie weryfikować tożsamość.

Ucz się dalej

Pracuj z Stack Quora

Potrzebujesz pomocy przy testowaniu, WordPressie lub SEO?

Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich witryny. Powiedz nam, nad czym pracujesz, a my zaproponujemy jasny następny krok.

Czytaj dalej

Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój

Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.

Sztuczna inteligencja

Wyjaśnienie halucynacji AI: dlaczego modele językowe tworzą rzeczy i jak je zmniejszyć

Wyjaśniono halucynacje AI: czym są, dlaczego powstają w modelach językowych, typowe typy, jak je zredukować za pomocą uziemień i podpowiedzi oraz pr…

Przeczytaj artykuł →
DevOps

Wyjaśnienie zmiennych środowiskowych: pliki .env, sekrety i konfiguracja wykonana prawidłowo

Zmienne środowiskowe wyjaśnione na przykładach Pythona, które przeprowadziliśmy: ich odczytywanie i ustawianie, dlaczego każda wartość jest ciągiem …

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie ograniczenia szybkości interfejsu API: algorytmy, nagłówki i obsługa błędów 429

Ograniczanie szybkości API wyjaśnione za pomocą przeprowadzonej przez nas symulacji: zasobnik tokenów, stałe okno, przesuwane okno, 429 odpowiedzi, …

Przeczytaj artykuł →
Automatyzacja testów

Wyśmiewanie w Pythonie: unittest.mock, patch i błędy, które sprawiają, że testy kłamią

Wyśmiewanie w Pythonie za pomocą unittest.mock, przetestowane: Mock i zwracana wartość, efekt uboczny, łatanie tam, gdzie używana jest nazwa, specyf…

Przeczytaj artykuł →
Testowanie oprogramowania

Wyjaśnienie zasięgu kodu: pokrycie linii i oddziału oraz co naprawdę oznacza 100%

Wyjaśnienie pokrycia kodu za pomocą prawdziwego pliku cover.py: pokrycie linii, gałęzi i warunków, przeczytanie raportu, dlaczego 100% pokrycia może…

Przeczytaj artykuł →
Bazy danych i SQL

DELETE vs TRUNCATE vs DROP w SQL: różnice, wycofywanie i kiedy używać każdego z nich

DELETE vs TRUNCATE vs DROP wyjaśnione za pomocą przetestowanego SQL: co każdy usuwa, wycofywanie, wyzwalacze, resetowanie tożsamości, prędkość i czy…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie widoków SQL: tworzenie, używanie i unikanie pułapek wraz z przykładami

Widoki SQL wyjaśnione za pomocą zapytań, które uruchomiliśmy: tworzenie widoku, wyniki na żywo, ukrywanie kolumn, wydajność, widoki z możliwością ak…

Przeczytaj artykuł →
Tworzenie oprogramowania

Interfejs TypeScript a typ: rzeczywiste różnice, testowane za pomocą kompilatora

Interfejs TypeScript a typ, sprawdzony z prawdziwym kompilatorem: co oba mogą zrobić, co tylko jeden, łączenie deklaracji, rozszerzenia a przecięcia…

Przeczytaj artykuł →
Tworzenie oprogramowania

Python *args i **kwargs wyjaśnione: elastyczne funkcje z przejrzystymi przykładami

Python *args i **kwargs wyjaśnione za pomocą uruchomionego przez nas kodu: pakowanie i rozpakowywanie, kolejność parametrów, argumenty zawierające t…

Przeczytaj artykuł →
Tworzenie oprogramowania

Funkcje Lambda w Pythonie: składnia, rzeczywiste zastosowania i kiedy ich nie używać

Funkcje lambda w Pythonie wyjaśnione za pomocą uruchomionego przez nas kodu: składnia, sortowanie za pomocą klucza, mapa i filtr, domknięcia, pułapk…

Przeczytaj artykuł →
Sztuczna inteligencja

Kim są agenci AI? Jak one działają, dzięki prostej pętli agenta, którą możesz uruchomić

Kim są agenci AI? Prosty przewodnik po pętli agenta, narzędziach, pamięci i poręczach, z małą pętlą w Pythonie, którą uruchomiliśmy, prawdziwymi zag…

Przeczytaj artykuł →
DevOps

Monitorowanie a obserwowalność: prawdziwa różnica z logami, wskaźnikami i śladami

Wyjaśnienie monitorowania a obserwowalności: znane i nieznane awarie, dzienniki, metryki i ślady, opis incydentu przy kasie, złote sygnały, OpenTele…

Przeczytaj artykuł →
DevOps

Woluminy platformy Docker a mocowania powiązań: utrwalanie danych kontenera we właściwy sposób

Wyjaśniono woluminy Dockera a montowanie powiązań: dlaczego dane kontenera znikają, nazwane woluminy, montowanie powiązań, tmpfs, przykłady tworzeni…

Przeczytaj artykuł →
Automatyzacja testów

TDD vs BDD: kluczowe różnice, jedna funkcja zbudowana w obie strony i kiedy używać każdej z nich

TDD vs BDD wyjaśnione za pomocą jednej funkcji rabatowej zbudowanej w obie strony: refaktoryzacja czerwono-zielona z uruchomionym przez nas kodem, s…

Przeczytaj artykuł →
Testowanie oprogramowania

Testowanie akceptacyjne użytkownika (UAT): proces, lista kontrolna i rzeczywiste przykłady

Wyjaśniono testy akceptacyjne użytkownika: kto je przeprowadza, czym różni się od kontroli jakości, siedmioetapowy proces, szablon przypadku testowe…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie wartości SQL NULL: IS NULL, COALESCE, NULLIF i pułapki, których należy unikać

Wartości SQL NULL wyjaśnione za pomocą zapytań, które wykonaliśmy: logika trójwartościowa, IS NULL, COALESCE, NULLIF, w jaki sposób agregacje, łącze…

Przeczytaj artykuł →
Bazy danych i SQL

Instrukcja SQL CASE WHEN: składnia, rzeczywiste przykłady i typowe błędy

SQL CASE WHEN wyjaśnione za pomocą zapytań, które uruchomiliśmy: proste i przeszukiwane formularze, kolejność warunków, elementy przestawne z SUM, s…

Przeczytaj artykuł →
Tworzenie oprogramowania

Co to jest JWT? Tokeny internetowe JSON wyjaśnione na przykładzie działania

Co to jest JWT? Wyjaśniono tokeny sieciowe JSON: trzy części, token zbudowany i zmodyfikowany w uruchomionym przez nas kodzie, JWT a sesje, pamięć m…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie pętli zdarzeń JavaScript: stos wywołań, mikrozadania i liczniki czasu z przykładami

Pętla zdarzeń JavaScript wyjaśniona za pomocą uruchomionego przez nas kodu: stos wywołań, kolejki zadań i mikrozadań, dlaczego setTimeout 0 nie jest…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie generatorów Pythona i wydajności: oszczędzaj pamięć dzięki prawdziwym przykładom

Generatory Pythona i wydajność wyjaśnione za pomocą uruchomionego przez nas kodu: sposób wstrzymywania i wznawiania, mierzone oszczędności pamięci, …

Przeczytaj artykuł →
Sztuczna inteligencja

Czym są osady? Wyjaśnienie wektorów i podobieństwa cosinusa

Czym są osadzania? Prosty przewodnik po wektorach, podobieństwie cosinusów i wyszukiwaniu semantycznym, z małym przykładem, który przeprowadziliśmy,…

Przeczytaj artykuł →
DevOps

Wdrożenie niebiesko-zielone a kanaryjskie: różnice, kompromisy i sposób wyboru

Wyjaśniono wdrożenie Blue-Green vs Canary: sposób działania każdego z nich, koszty, ryzyko i wycofywanie zmian, przetestowane przez nas stabilne łąc…

Przeczytaj artykuł →
Automatyzacja testów

Niestabilne testy: co je powoduje i jak je naprawić na dobre

Niestabilne testy wyjaśnione w przeprowadzonych przez nas demonstracjach: główne przyczyny, sposób potwierdzenia i zdiagnozowania jednej z nich, odp…

Przeczytaj artykuł →
Testowanie oprogramowania

Load Testing vs Stress Testing: Differences, Metrics and k6 Examples

Wyjaśniono testy obciążenia i testy warunków skrajnych: co dowodzi każdy z nich, testy szczytowe i nasiąkania, istotne metryki, dlaczego średnie wpr…

Przeczytaj artykuł →
Testowanie oprogramowania

Przypadek testowy a scenariusz testowy: kluczowe różnice, przykłady i kiedy stosować każdy z nich

Wyjaśnienie przypadków testowych i scenariuszy testowych: jasne definicje, tabela obok siebie, jedna funkcja resetowania hasła zaczerpnięta ze scena…

Przeczytaj artykuł →
Bazy danych i SQL

Optymalizacja zapytań SQL: czytaj plany wykonania i napraw powolne zapytania z synchronizacją

Optymalizacja zapytań SQL przetestowana na milionie wierszy: przeczytaj plany wykonania, dodaj odpowiednie indeksy, napraw filtry niesargowalne, uży…

Przeczytaj artykuł →
Bazy danych i SQL

SQL UNION vs UNION ALL: różnice, przykłady i testowana wydajność

SQL UNION vs UNION ALL wyjaśnione na podstawie zapytań, które uruchomiliśmy: duplikaty, obie reguły są zgodne, prawdziwy błąd danych, zmierzona wyda…

Przeczytaj artykuł →
Tworzenie oprogramowania

Samouczek API pobierania JavaScript: GET, POST, obsługa błędów i limity czasu

Samouczek JavaScript Fetch API testowany na serwerze lokalnym: GET i POST, dlaczego 404 nie rzuca, pomocnik wielokrotnego użytku, ciągi zapytań, prz…

Przeczytaj artykuł →
Tworzenie oprogramowania

Obsługa plików w Pythonie: odczyt, zapis, CSV, JSON i pathlib z przykładami

Obsługa plików w Pythonie wyjaśniona za pomocą uruchomionego przez nas kodu: tryby otwarte, czytanie dużych plików, CSV, JSON, pathlib, pliki binarn…

Przeczytaj artykuł →
Tworzenie oprogramowania

Klasy i obiekty Pythona: samouczek OOP z prawdziwymi przykładami

Klasy i obiekty Pythona objaśnione za pomocą uruchomionego przez nas kodu: __init__, metody, atrybuty klas i instancji, dziedziczenie, właściwości, …

Przeczytaj artykuł →
Sztuczna inteligencja

Co to jest model dużego języka? Jak działają LLM, wyjaśnione bez szumu

Co to jest model dużego języka? LLM wyjaśnione prostym językiem: tokeny, osadzanie, uwaga, szkolenie, temperatura i okna kontekstowe, mała demonstra…

Przeczytaj artykuł →
DevOps

Polecenia systemu Linux dla początkujących: niezbędny przewodnik po terminalu z przykładami

Polecenia systemu Linux dla początkujących, pogrupowane według zadań: nawigacja, pliki, przeglądanie logów, grep, potoki, uprawnienia, procesy i arc…

Przeczytaj artykuł →
Automatyzacja testów

Selenium kontra dramaturg: kluczowe różnice, porównanie kodu i wybór

Porównanie Selenium i Playwright: architektura, oczekiwanie, obsługa przeglądarki i języka, debugowanie, ten sam test w obu narzędziach, porady doty…

Przeczytaj artykuł →
Testowanie oprogramowania

Partycjonowanie równoważne: technika projektowania testów wyjaśniona na praktycznych przykładach

Wyjaśniono podział równoważny: jak znaleźć prawidłowe i nieprawidłowe partycje, sprawdzone przykłady dla grup wiekowych, hasła i kupony, przeprowadz…

Przeczytaj artykuł →
Testowanie oprogramowania

Ważność a priorytet w testowaniu oprogramowania: różnice, macierz i rzeczywiste przykłady

Wyjaśniono ważność a priorytet w testowaniu oprogramowania: jasne definicje, czterokierunkowa macierz z przykładami, skale poziomów, kto ustawia każ…

Przeczytaj artykuł →
Bazy danych i SQL

Samouczek dotyczący podzapytań SQL: typy, skorelowane podzapytania i ISTNIEJĄ z przykładami

Samouczek dotyczący podzapytań SQL z zapytaniami, które wykonaliśmy: podzapytania skalarne, IN, FROM i SELECT, podzapytania skorelowane, EXISTS, puł…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie transakcji SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji

Transakcje SQL i ACID wyjaśnione za pomocą wykonanego przez nas przelewu bankowego: COMMIT, ROLLBACK, punkty zapisu, blokady, poziomy izolacji, brud…

Przeczytaj artykuł →
Tworzenie oprogramowania

Git merge vs rebase: różnice, przykłady i kiedy czego używać

Git merge vs rebase wyjaśnione na prawdziwym wyniku logu, z tabelą porównawczą, złotą zasadą rebase i bezpiecznym procesem pracy zespołu.

Przeczytaj artykuł →
Tworzenie oprogramowania

Python list comprehension: składnia, przykłady i kiedy jej unikać

Python list comprehension wyjaśnione: składnia, filtrowanie, if-else, zagnieżdżone pętle, zmierzone czasy i sytuacje, w których zwykła pętla for jes…

Przeczytaj artykuł →
Bazy danych i SQL

SQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)

Zrozum złączenia SQL krok po kroku na przykładowych tabelach i zapytaniach: INNER, LEFT, RIGHT, FULL, CROSS i SELF, plus typowe błędy i wskazówki wy…

Przeczytaj artykuł →