Autoryzacja i autentykacja — JWT, sessions, OAuth dla frontendowca
Zrozum różnicę między logowaniem a uprawnieniami oraz naucz się dobierać sessions, JWT, cookies i OAuth do realnych scenariuszy w aplikacjach webowych.
"Zaloguj się przez Google", "Nieprawidłowy token", "Sesja wygasła" — używasz tego codziennie, ale czy rozumiesz, co się za tym kryje?
Autentykacja i autoryzacja to fundament bezpieczeństwa aplikacji. Jako frontend developer implementujesz formularze logowania, zarządzasz tokenami, obsługujesz przekierowania OAuth to standard delegowanego dostępu, który pozwala logować użytkownika przez zewnętrznego dostawcę bez ujawniania hasła.. Warto wiedzieć, jak to działa pod spodem — to jeden z kluczowych elementów backendu dla frontendowca.
Krótka odpowiedź: Autentykacja = weryfikacja tożsamości ("kim jesteś?"). Autoryzacja = sprawdzenie uprawnień ("co możesz robić?"). Do przechowywania stanu zalogowania: sesje dla tradycyjnych aplikacji, JWT, czyli JSON Web Token, to podpisany token używany często do autoryzacji i przekazywania tożsamości użytkownika. dla API, czyli Application Programming Interface, definiuje sposób komunikacji między aplikacjami lub modułami. i stateless serwisów. OAuth dla logowania przez Google/GitHub. Refresh token w httpOnly cookie, access token w pamięci aplikacji.
Szybkie porównanie metod
Metoda
Mechanizm
Kiedy wybrać
Session
Server przechowuje stan w bazie/Redis, klient dostaje ID w cookie
Tradycyjna aplikacja webowa, łatwe unieważnianie sesji
JWT
Token z danymi usera podpisany przez serwer, klient go przechowuje
W praktyce samo logowanie społecznościowe to zwykle OAuth 2.0 rozszerzony o OpenID Connect, żeby aplikacja dostała nie tylko dostęp, ale też wiarygodną informację o tożsamości użytkownika.
Code
1. User klika "Login with Google"
2. Przekierowanie do Google
3. User loguje się w Google
4. Google pyta: "Czy zezwolić app X na dostęp?"
5. User zgadza się
6. Google przekierowuje z powrotem z kodem
7. Backend wymienia kod na token
8. Backend pobiera dane usera z Google
3. Magic Link
Link logowania wysyłany na email:
Code
1. User wpisuje email
2. Backend generuje jednorazowy token
3. Email z linkiem: app.com/login?token=abc123
4. User klika link
5. Backend weryfikuje token → zalogowany
4. Passkeys / WebAuthn
Nowoczesna metoda z biometrią / kluczem sprzętowym:
✅ Prosty
❌ Dostępny dla JS → podatny na XSS
❌ Słabe domyślne miejsce dla tokenów auth w aplikacji webowej
httpOnly Cookie
Code
// Backend ustawia cookieres.cookie('token', token, { httpOnly: true, // niedostępny dla JS secure: true, // tylko HTTPS sameSite: 'lax' // ochrona CSRF; 'strict' blokuje cookie po redirect z OAuth})
✅ Bezpieczniejszy (brak dostępu z JS)
❌ Wysyłany automatycznie, więc wymaga ochrony CSRF
❌ Więcej uwagi przy integracjach cross-site i subdomainach
Rekomendacja
Access token: krótko żyjący token w pamięci aplikacji lub sesja/cookie, jeśli architektura na to pozwala
Refresh token: httpOnly cookie
Unikaj jako domyślnego wyboru: localStorage dla tokenów auth
OAuth 2.0 — szczegóły
Authorization Code Flow
Dla aplikacji z backendem to najczęstszy i najbezpieczniejszy flow. Dla SPA, czyli Single Page Application, działa bez pełnego przeładowania dokumentu przy każdej nawigacji. i innych public clients stosuje się ten sam mechanizm z PKCE.
Uwaga: Przykład poniżej dotyczy NextAuth.js v4. NextAuth v5 (Auth.js) używa innej konfiguracji — sprawdź oficjalną dokumentację jeśli instalujesz najnowszą wersję.
const rateLimit = require('express-rate-limit')const loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minut max: 5, // max 5 prób message: 'Too many login attempts'})app.post('/api/login', loginLimiter, loginHandler)
FAQ
Jaka jest różnica między autentykacją a autoryzacją?
Autentykacja (authentication) odpowiada na pytanie "Kim jesteś?" — weryfikuje tożsamość użytkownika (logowanie hasłem, biometrią, tokenem). Autoryzacja (authorization) odpowiada na pytanie "Co możesz robić?" — sprawdza, czy zaautentykowany użytkownik ma uprawnienia do konkretnej operacji. Kolejność jest zawsze taka sama: najpierw autentykacja, potem autoryzacja.
JWT czy sesje — co wybrać?
Sesje są lepszym wyborem gdy: budujesz tradycyjną aplikację webową, potrzebujesz łatwego unieważniania (wylogowanie natychmiast działa), masz jedną domenę. JWT ma sens gdy: budujesz bezstanowe API, komunikujesz się między serwisami (microservices), masz wiele domen lub mobilne aplikacje. W praktyce wiele aplikacji Next.js używa sesji przez NextAuth/Auth.js, bo unieważnianie JWT bez dodatkowej infrastruktury jest problematyczne.
Czy JWT jest bezpieczny?
JWT jest bezpieczny pod warunkiem poprawnej implementacji: krótki czas życia access tokena (15 min), refresh token w httpOnly cookie (nie localStorage), bezpieczny sekret do podpisywania i weryfikacja podpisu na serwerze. Pamiętaj: JWT nie szyfruje danych — payload jest Base64 encodowany i każdy, kto ma token, może go odczytać. Nie umieszczaj w JWT wrażliwych danych jak hasła czy numery kart.
Gdzie bezpiecznie przechowywać JWT token w przeglądarce?
Access token (krótko żyjący, ~15 min) — trzymaj w pamięci aplikacji (zmienna JavaScript). Refresh token (długo żyjący, ~7 dni) — trzymaj w httpOnly cookie, który nie jest dostępny dla JavaScript. Unikaj localStorage dla tokenów auth — jest podatny na ataki XSS.
Co to jest OAuth 2.0 i jak różni się od OpenID Connect?
OAuth 2.0 to protokół delegacji dostępu — pozwala aplikacji działać w imieniu użytkownika u zewnętrznego providera (np. czytać maile z Gmaila). Samo OAuth 2.0 nie mówi nic o tożsamości. OpenID Connect (OIDC) to warstwa na OAuth 2.0, która dodaje mechanizm weryfikacji tożsamości — aplikacja dostaje id_token z informacjami o użytkowniku. "Zaloguj przez Google" to OAuth 2.0 + OIDC.
Jak zaimplementować logowanie przez Google w Next.js?
Najprostsze podejście to NextAuth.js (v4) lub Auth.js (v5). Wymaga: rejestracji aplikacji w Google Cloud Console, skonfigurowania providera GoogleProvider z clientId i clientSecret, dodania NEXTAUTH_SECRET do zmiennych środowiskowych i ustawienia NEXTAUTH_URL. NextAuth obsługuje sesje, callbacki i ochronę routingu out of the box.
Czym różnią się access token i refresh token?
Access token — krótko żyjący (typowo 15 minut), używany do autoryzacji każdego requestu API. Gdy wygasa, klient musi go odświeżyć. Refresh token — długo żyjący (7 dni lub dłużej), używany wyłącznie do uzyskania nowego access tokena. Taki podział ogranicza ryzyko: skradziony access token wygasa szybko, a refresh token siedzi w bezpiecznym httpOnly cookie.
Podsumowanie
Metoda
Kiedy używać
Sessions
Tradycyjne aplikacje, łatwe unieważnianie
JWT
API, microservices, stateless
OAuth
Social login, third-party integration
Passkeys
Nowoczesne, bezpieczne logowanie
Przechowywanie
Bezpieczeństwo
Use case
localStorage
❌ XSS
Nigdy dla tokenów
httpOnly cookie
✅ Bezpieczne
Refresh token
Memory
✅ Bezpieczne
Access token
Auth to krytyczna część każdej aplikacji. Używaj sprawdzonych bibliotek (NextAuth, Passport.js) zamiast pisać od zera.
Jeśli chcesz przełożyć ten temat na lepszą architekturę frontendu, uporządkować React lub Next.js i podnieść jakość pracy zespołu, skontaktuj się ze mną. Pomagam zamieniać wiedzę z artykułów w praktyczne decyzje technologiczne.
Maciej Sala — project manager i frontendowiec z doświadczeniem w marketingu internetowym. Na co dzień pracuję z Reactem, Next.js i TypeScriptem, łącząc perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat związany z branżą gier wideo jako project manager i game designer.
Absolwent historii na Uniwersytecie Jagiellońskim i studiów podyplomowych z marketingu internetowego na Akademii Górniczo-Hutniczej w Krakowie. Poza pracą trenuje na siłowni, maluje figurki i realizuje własne projekty.
Anthropic uderza w Figmę i Adobe — oto Claude Design
Anthropic wypuścił właśnie narzędzie AI do tworzenia stron, landing page'ów i prezentacji z promptu. Oto co wiemy o Claude Design i Opus 4.7 — i co to oznacza dla developerów.
Astro.js vs Next.js — które narzędzie wybrać w 2026 roku?
Fachowe porównanie Astro.js i Next.js z perspektywy developera pracującego na co dzień w Next.js. Architektura, wydajność, SEO, DX, koszty i konkretne use case — z benchmarkami i przykładami kodu.
WordPress → Next.js — migracja treści, redirecty 301 i zachowanie pozycji SEO
Jak przenieść stronę z WordPress na Next.js bez utraty pozycji w Google? Eksport treści, mapowanie URL, redirecty 301, migracja obrazów i weryfikacja indeksacji.